@budibase/server 2.6.19-alpha.3 → 2.6.19-alpha.31

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 (404) hide show
  1. package/.dockerignore +7 -6
  2. package/Dockerfile +16 -8
  3. package/builder/assets/{index.71388c79.js → index.3dd3d237.js} +435 -428
  4. package/builder/assets/{index.07382a47.css → index.8469b14c.css} +2 -2
  5. package/builder/index.html +2 -2
  6. package/client/manifest.json +5229 -0
  7. package/dist/automation.js +32436 -0
  8. package/dist/automation.js.map +7 -0
  9. package/dist/index.js +44735 -13
  10. package/dist/index.js.map +7 -0
  11. package/dist/query.js +24367 -0
  12. package/dist/query.js.map +7 -0
  13. package/jest.config.ts +3 -0
  14. package/nodemon.json +1 -1
  15. package/package.json +32 -13
  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 +20 -0
  21. package/src/api/controllers/row/index.ts +15 -22
  22. package/src/api/controllers/row/internal.ts +1 -1
  23. package/src/api/controllers/row/utils.ts +12 -0
  24. package/src/api/controllers/static/index.ts +3 -3
  25. package/src/api/controllers/table/index.ts +3 -0
  26. package/src/api/controllers/table/internal.ts +2 -6
  27. package/src/api/controllers/table/utils.ts +32 -1
  28. package/src/api/controllers/view/index.ts +5 -5
  29. package/src/api/controllers/webhook.ts +33 -9
  30. package/src/api/routes/application.ts +5 -0
  31. package/src/api/routes/automation.ts +0 -1
  32. package/src/api/routes/datasource.ts +5 -0
  33. package/src/api/routes/static.ts +3 -1
  34. package/src/api/routes/tests/{automation.spec.js → automation.spec.ts} +106 -31
  35. package/src/api/routes/tests/datasource.spec.ts +1 -1
  36. package/src/api/routes/tests/{webhook.spec.js → webhook.spec.ts} +33 -11
  37. package/src/app.ts +0 -1
  38. package/src/automations/actions.ts +8 -0
  39. package/src/automations/logging/index.ts +21 -0
  40. package/src/automations/steps/bash.ts +4 -0
  41. package/src/automations/steps/collect.ts +58 -0
  42. package/src/automations/steps/createRow.ts +4 -0
  43. package/src/automations/steps/delay.ts +1 -0
  44. package/src/automations/steps/deleteRow.ts +4 -0
  45. package/src/automations/steps/discord.ts +4 -0
  46. package/src/automations/steps/executeQuery.ts +4 -0
  47. package/src/automations/steps/executeScript.ts +4 -0
  48. package/src/automations/steps/filter.ts +1 -0
  49. package/src/automations/steps/loop.ts +1 -0
  50. package/src/automations/steps/make.ts +4 -0
  51. package/src/automations/steps/openai.ts +106 -0
  52. package/src/automations/steps/outgoingWebhook.ts +4 -0
  53. package/src/automations/steps/queryRows.ts +4 -0
  54. package/src/automations/steps/sendSmtpEmail.ts +4 -0
  55. package/src/automations/steps/serverLog.ts +4 -0
  56. package/src/automations/steps/slack.ts +4 -0
  57. package/src/automations/steps/updateRow.ts +4 -0
  58. package/src/automations/steps/zapier.ts +4 -0
  59. package/src/automations/tests/openai.spec.ts +86 -0
  60. package/src/automations/triggers.ts +3 -2
  61. package/src/constants/index.ts +17 -16
  62. package/src/db/inMemoryView.ts +1 -0
  63. package/src/environment.ts +3 -0
  64. package/src/integration-test/postgres.spec.ts +47 -4
  65. package/src/integrations/airtable.ts +3 -1
  66. package/src/integrations/arangodb.ts +3 -1
  67. package/src/integrations/base/sqlTable.ts +0 -1
  68. package/src/integrations/couchdb.ts +3 -1
  69. package/src/integrations/dynamodb.ts +3 -1
  70. package/src/integrations/elasticsearch.ts +3 -1
  71. package/src/integrations/firebase.ts +3 -1
  72. package/src/integrations/googlesheets.ts +11 -3
  73. package/src/integrations/microsoftSqlServer.ts +18 -2
  74. package/src/integrations/mongodb.ts +3 -1
  75. package/src/integrations/mysql.ts +27 -11
  76. package/src/integrations/oracle.ts +11 -1
  77. package/src/integrations/postgres.ts +15 -1
  78. package/src/integrations/redis.ts +3 -1
  79. package/src/integrations/s3.ts +3 -1
  80. package/src/integrations/snowflake.ts +3 -1
  81. package/src/integrations/tests/googlesheets.spec.ts +41 -9
  82. package/src/middleware/builder.ts +4 -5
  83. package/src/sdk/app/automations/index.ts +2 -0
  84. package/src/sdk/app/automations/utils.ts +7 -0
  85. package/src/startup.ts +2 -0
  86. package/src/tests/utilities/TestConfiguration.ts +4 -2
  87. package/src/tests/utilities/structures.ts +42 -0
  88. package/src/threads/automation.ts +78 -22
  89. package/src/threads/index.ts +9 -3
  90. package/src/threads/utils.ts +2 -0
  91. package/src/utilities/fileSystem/app.ts +1 -1
  92. package/src/utilities/fileSystem/clientLibrary.ts +8 -3
  93. package/src/utilities/fileSystem/filesystem.ts +3 -1
  94. package/src/utilities/redis.ts +19 -2
  95. package/src/websockets/builder.ts +69 -0
  96. package/src/websockets/grid.ts +25 -7
  97. package/src/websockets/index.ts +5 -2
  98. package/src/websockets/websocket.ts +20 -4
  99. package/tsconfig.build.json +9 -1
  100. package/tsconfig.json +1 -14
  101. package/dist/api/controllers/analytics.js +0 -46
  102. package/dist/api/controllers/apikeys.js +0 -72
  103. package/dist/api/controllers/application.js +0 -574
  104. package/dist/api/controllers/auth.js +0 -80
  105. package/dist/api/controllers/automation.js +0 -303
  106. package/dist/api/controllers/backup.js +0 -37
  107. package/dist/api/controllers/component.js +0 -59
  108. package/dist/api/controllers/datasource.js +0 -337
  109. package/dist/api/controllers/deploy/Deployment.js +0 -53
  110. package/dist/api/controllers/deploy/index.js +0 -198
  111. package/dist/api/controllers/dev.js +0 -146
  112. package/dist/api/controllers/integration.js +0 -28
  113. package/dist/api/controllers/layout.js +0 -49
  114. package/dist/api/controllers/metadata.js +0 -63
  115. package/dist/api/controllers/migrations.js +0 -29
  116. package/dist/api/controllers/ops.js +0 -40
  117. package/dist/api/controllers/permission.js +0 -162
  118. package/dist/api/controllers/plugin/file.js +0 -24
  119. package/dist/api/controllers/plugin/github.js +0 -69
  120. package/dist/api/controllers/plugin/index.js +0 -112
  121. package/dist/api/controllers/plugin/npm.js +0 -58
  122. package/dist/api/controllers/plugin/uploaders.js +0 -11
  123. package/dist/api/controllers/plugin/url.js +0 -24
  124. package/dist/api/controllers/plugin/utils.js +0 -27
  125. package/dist/api/controllers/public/applications.js +0 -146
  126. package/dist/api/controllers/public/mapping/applications.js +0 -29
  127. package/dist/api/controllers/public/mapping/index.js +0 -11
  128. package/dist/api/controllers/public/mapping/queries.js +0 -36
  129. package/dist/api/controllers/public/mapping/rows.js +0 -24
  130. package/dist/api/controllers/public/mapping/tables.js +0 -23
  131. package/dist/api/controllers/public/mapping/types.js +0 -2
  132. package/dist/api/controllers/public/mapping/users.js +0 -29
  133. package/dist/api/controllers/public/metrics.js +0 -113
  134. package/dist/api/controllers/public/queries.js +0 -58
  135. package/dist/api/controllers/public/rows.js +0 -120
  136. package/dist/api/controllers/public/tables.js +0 -95
  137. package/dist/api/controllers/public/users.js +0 -93
  138. package/dist/api/controllers/public/utils.js +0 -56
  139. package/dist/api/controllers/query/import/index.js +0 -87
  140. package/dist/api/controllers/query/import/sources/base/index.js +0 -75
  141. package/dist/api/controllers/query/import/sources/base/openapi.js +0 -42
  142. package/dist/api/controllers/query/import/sources/curl.js +0 -99
  143. package/dist/api/controllers/query/import/sources/openapi2.js +0 -145
  144. package/dist/api/controllers/query/import/sources/openapi3.js +0 -177
  145. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +0 -253
  146. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +0 -1054
  147. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +0 -253
  148. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +0 -1225
  149. package/dist/api/controllers/query/index.js +0 -299
  150. package/dist/api/controllers/query/validation.js +0 -53
  151. package/dist/api/controllers/role.js +0 -109
  152. package/dist/api/controllers/routing.js +0 -105
  153. package/dist/api/controllers/row/ExternalRequest.js +0 -683
  154. package/dist/api/controllers/row/external.js +0 -339
  155. package/dist/api/controllers/row/index.js +0 -203
  156. package/dist/api/controllers/row/internal.js +0 -509
  157. package/dist/api/controllers/row/internalSearch.js +0 -28
  158. package/dist/api/controllers/row/staticFormula.js +0 -165
  159. package/dist/api/controllers/row/utils.js +0 -183
  160. package/dist/api/controllers/screen.js +0 -110
  161. package/dist/api/controllers/script.js +0 -30
  162. package/dist/api/controllers/static/index.js +0 -268
  163. package/dist/api/controllers/table/bulkFormula.js +0 -173
  164. package/dist/api/controllers/table/external.js +0 -279
  165. package/dist/api/controllers/table/index.js +0 -179
  166. package/dist/api/controllers/table/internal.js +0 -197
  167. package/dist/api/controllers/table/utils.js +0 -379
  168. package/dist/api/controllers/templates.js +0 -56
  169. package/dist/api/controllers/user.js +0 -124
  170. package/dist/api/controllers/view/exporters.js +0 -46
  171. package/dist/api/controllers/view/index.js +0 -193
  172. package/dist/api/controllers/view/utils.js +0 -177
  173. package/dist/api/controllers/view/viewBuilder.js +0 -158
  174. package/dist/api/controllers/webhook.js +0 -134
  175. package/dist/api/index.js +0 -55
  176. package/dist/api/routes/analytics.js +0 -34
  177. package/dist/api/routes/apikeys.js +0 -37
  178. package/dist/api/routes/application.js +0 -48
  179. package/dist/api/routes/auth.js +0 -33
  180. package/dist/api/routes/automation.js +0 -50
  181. package/dist/api/routes/backup.js +0 -35
  182. package/dist/api/routes/component.js +0 -35
  183. package/dist/api/routes/datasource.js +0 -44
  184. package/dist/api/routes/deploy.js +0 -37
  185. package/dist/api/routes/dev.js +0 -49
  186. package/dist/api/routes/index.js +0 -75
  187. package/dist/api/routes/integration.js +0 -37
  188. package/dist/api/routes/layout.js +0 -37
  189. package/dist/api/routes/metadata.js +0 -40
  190. package/dist/api/routes/migrations.js +0 -36
  191. package/dist/api/routes/ops.js +0 -52
  192. package/dist/api/routes/permission.js +0 -44
  193. package/dist/api/routes/plugin.js +0 -39
  194. package/dist/api/routes/public/applications.js +0 -174
  195. package/dist/api/routes/public/index.js +0 -140
  196. package/dist/api/routes/public/metrics.js +0 -30
  197. package/dist/api/routes/public/middleware/mapper.js +0 -97
  198. package/dist/api/routes/public/queries.js +0 -72
  199. package/dist/api/routes/public/rows.js +0 -158
  200. package/dist/api/routes/public/tables.js +0 -152
  201. package/dist/api/routes/public/users.js +0 -135
  202. package/dist/api/routes/public/utils/Endpoint.js +0 -36
  203. package/dist/api/routes/query.js +0 -47
  204. package/dist/api/routes/role.js +0 -40
  205. package/dist/api/routes/routing.js +0 -39
  206. package/dist/api/routes/row.js +0 -239
  207. package/dist/api/routes/screen.js +0 -39
  208. package/dist/api/routes/script.js +0 -35
  209. package/dist/api/routes/static.js +0 -80
  210. package/dist/api/routes/table.js +0 -163
  211. package/dist/api/routes/templates.js +0 -37
  212. package/dist/api/routes/user.js +0 -43
  213. package/dist/api/routes/utils/validators.js +0 -238
  214. package/dist/api/routes/view.js +0 -42
  215. package/dist/api/routes/webhook.js +0 -43
  216. package/dist/app.js +0 -132
  217. package/dist/automations/actions.js +0 -137
  218. package/dist/automations/automationUtils.js +0 -173
  219. package/dist/automations/bullboard.js +0 -71
  220. package/dist/automations/index.js +0 -43
  221. package/dist/automations/logging/index.js +0 -53
  222. package/dist/automations/steps/bash.js +0 -111
  223. package/dist/automations/steps/createRow.js +0 -108
  224. package/dist/automations/steps/delay.js +0 -53
  225. package/dist/automations/steps/deleteRow.js +0 -96
  226. package/dist/automations/steps/discord.js +0 -116
  227. package/dist/automations/steps/executeQuery.js +0 -134
  228. package/dist/automations/steps/executeScript.js +0 -106
  229. package/dist/automations/steps/filter.js +0 -112
  230. package/dist/automations/steps/loop.js +0 -54
  231. package/dist/automations/steps/make.js +0 -134
  232. package/dist/automations/steps/outgoingWebhook.js +0 -166
  233. package/dist/automations/steps/queryRows.js +0 -216
  234. package/dist/automations/steps/sendSmtpEmail.js +0 -115
  235. package/dist/automations/steps/serverLog.js +0 -65
  236. package/dist/automations/steps/slack.js +0 -98
  237. package/dist/automations/steps/updateRow.js +0 -144
  238. package/dist/automations/steps/utils.js +0 -56
  239. package/dist/automations/steps/zapier.js +0 -130
  240. package/dist/automations/triggerInfo/app.js +0 -36
  241. package/dist/automations/triggerInfo/cron.js +0 -35
  242. package/dist/automations/triggerInfo/index.js +0 -40
  243. package/dist/automations/triggerInfo/rowDeleted.js +0 -36
  244. package/dist/automations/triggerInfo/rowSaved.js +0 -44
  245. package/dist/automations/triggerInfo/rowUpdated.js +0 -44
  246. package/dist/automations/triggerInfo/webhook.js +0 -40
  247. package/dist/automations/triggers.js +0 -181
  248. package/dist/automations/utils.js +0 -275
  249. package/dist/constants/definitions.js +0 -2
  250. package/dist/constants/index.js +0 -181
  251. package/dist/constants/layouts.js +0 -148
  252. package/dist/constants/screens.js +0 -51
  253. package/dist/db/defaultData/datasource_bb_default.js +0 -574
  254. package/dist/db/defaultData/employeeImport.js +0 -155
  255. package/dist/db/defaultData/expensesImport.js +0 -117
  256. package/dist/db/defaultData/inventoryImport.js +0 -109
  257. package/dist/db/defaultData/jobsImport.js +0 -152
  258. package/dist/db/dynamoClient.js +0 -124
  259. package/dist/db/inMemoryView.js +0 -62
  260. package/dist/db/index.js +0 -43
  261. package/dist/db/linkedRows/LinkController.js +0 -392
  262. package/dist/db/linkedRows/LinkDocument.js +0 -33
  263. package/dist/db/linkedRows/index.js +0 -206
  264. package/dist/db/linkedRows/linkUtils.js +0 -131
  265. package/dist/db/newid.js +0 -7
  266. package/dist/db/utils.js +0 -248
  267. package/dist/db/views/staticViews.js +0 -144
  268. package/dist/ddApm.js +0 -11
  269. package/dist/definitions/automations.js +0 -8
  270. package/dist/definitions/common.js +0 -2
  271. package/dist/definitions/datasource.js +0 -7
  272. package/dist/definitions/openapi.js +0 -6
  273. package/dist/environment.js +0 -109
  274. package/dist/events/AutomationEmitter.js +0 -53
  275. package/dist/events/BudibaseEmitter.js +0 -25
  276. package/dist/events/docUpdates/index.js +0 -17
  277. package/dist/events/docUpdates/processors.js +0 -18
  278. package/dist/events/docUpdates/syncUsers.js +0 -49
  279. package/dist/events/index.js +0 -11
  280. package/dist/events/utils.js +0 -43
  281. package/dist/integrations/airtable.js +0 -173
  282. package/dist/integrations/arangodb.js +0 -119
  283. package/dist/integrations/base/query.js +0 -32
  284. package/dist/integrations/base/sql.js +0 -600
  285. package/dist/integrations/base/sqlTable.js +0 -167
  286. package/dist/integrations/base/types.js +0 -2
  287. package/dist/integrations/couchdb.js +0 -140
  288. package/dist/integrations/dynamodb.js +0 -210
  289. package/dist/integrations/elasticsearch.js +0 -201
  290. package/dist/integrations/firebase.js +0 -189
  291. package/dist/integrations/googlesheets.js +0 -484
  292. package/dist/integrations/index.js +0 -138
  293. package/dist/integrations/microsoftSqlServer.js +0 -289
  294. package/dist/integrations/mongodb.js +0 -630
  295. package/dist/integrations/mysql.js +0 -272
  296. package/dist/integrations/oracle.js +0 -404
  297. package/dist/integrations/postgres.js +0 -320
  298. package/dist/integrations/queries/sql.js +0 -84
  299. package/dist/integrations/redis.js +0 -187
  300. package/dist/integrations/rest.js +0 -400
  301. package/dist/integrations/s3.js +0 -256
  302. package/dist/integrations/snowflake.js +0 -114
  303. package/dist/integrations/utils.js +0 -295
  304. package/dist/middleware/appInfo.js +0 -22
  305. package/dist/middleware/authorized.js +0 -112
  306. package/dist/middleware/builder.js +0 -93
  307. package/dist/middleware/currentapp.js +0 -103
  308. package/dist/middleware/joi-validator.js +0 -43
  309. package/dist/middleware/publicApi.js +0 -25
  310. package/dist/middleware/resourceId.js +0 -59
  311. package/dist/middleware/selfhost.js +0 -24
  312. package/dist/middleware/utils.js +0 -8
  313. package/dist/migrations/functions/appUrls.js +0 -42
  314. package/dist/migrations/functions/backfill/app/automations.js +0 -31
  315. package/dist/migrations/functions/backfill/app/datasources.js +0 -28
  316. package/dist/migrations/functions/backfill/app/layouts.js +0 -33
  317. package/dist/migrations/functions/backfill/app/queries.js +0 -49
  318. package/dist/migrations/functions/backfill/app/roles.js +0 -28
  319. package/dist/migrations/functions/backfill/app/screens.js +0 -28
  320. package/dist/migrations/functions/backfill/app/tables.js +0 -37
  321. package/dist/migrations/functions/backfill/app.js +0 -176
  322. package/dist/migrations/functions/backfill/global/configs.js +0 -67
  323. package/dist/migrations/functions/backfill/global/quotas.js +0 -60
  324. package/dist/migrations/functions/backfill/global/users.js +0 -50
  325. package/dist/migrations/functions/backfill/global.js +0 -205
  326. package/dist/migrations/functions/backfill/index.js +0 -32
  327. package/dist/migrations/functions/backfill/installation.js +0 -80
  328. package/dist/migrations/functions/syncQuotas.js +0 -52
  329. package/dist/migrations/functions/tableSettings.js +0 -130
  330. package/dist/migrations/functions/usageQuotas/index.js +0 -16
  331. package/dist/migrations/functions/usageQuotas/syncApps.js +0 -24
  332. package/dist/migrations/functions/usageQuotas/syncPlugins.js +0 -23
  333. package/dist/migrations/functions/usageQuotas/syncRows.js +0 -33
  334. package/dist/migrations/functions/usageQuotas/syncUsers.js +0 -21
  335. package/dist/migrations/functions/userEmailViewCasing.js +0 -24
  336. package/dist/migrations/index.js +0 -111
  337. package/dist/migrations/tests/helpers.js +0 -72
  338. package/dist/migrations/tests/structures.js +0 -37
  339. package/dist/sdk/app/applications/index.js +0 -28
  340. package/dist/sdk/app/applications/sync.js +0 -164
  341. package/dist/sdk/app/applications/utils.js +0 -21
  342. package/dist/sdk/app/automations/index.js +0 -29
  343. package/dist/sdk/app/automations/webhook.js +0 -54
  344. package/dist/sdk/app/backups/constants.js +0 -6
  345. package/dist/sdk/app/backups/exports.js +0 -160
  346. package/dist/sdk/app/backups/imports.js +0 -170
  347. package/dist/sdk/app/backups/index.js +0 -29
  348. package/dist/sdk/app/backups/statistics.js +0 -73
  349. package/dist/sdk/app/datasources/datasources.js +0 -173
  350. package/dist/sdk/app/datasources/index.js +0 -27
  351. package/dist/sdk/app/queries/index.js +0 -27
  352. package/dist/sdk/app/queries/queries.js +0 -60
  353. package/dist/sdk/app/rows/attachments.js +0 -61
  354. package/dist/sdk/app/rows/index.js +0 -28
  355. package/dist/sdk/app/rows/rows.js +0 -30
  356. package/dist/sdk/app/tables/index.js +0 -65
  357. package/dist/sdk/index.js +0 -27
  358. package/dist/sdk/plugins/index.js +0 -27
  359. package/dist/sdk/plugins/plugins.js +0 -53
  360. package/dist/sdk/users/index.js +0 -27
  361. package/dist/sdk/users/utils.js +0 -87
  362. package/dist/sdk/utils/index.js +0 -29
  363. package/dist/startup.js +0 -158
  364. package/dist/threads/automation.js +0 -450
  365. package/dist/threads/definitions.js +0 -2
  366. package/dist/threads/index.js +0 -140
  367. package/dist/threads/query.js +0 -265
  368. package/dist/threads/utils.js +0 -120
  369. package/dist/tsconfig.build.tsbuildinfo +0 -1
  370. package/dist/utilities/appDirectoryTemplate/package.json +0 -10
  371. package/dist/utilities/budibaseDir.js +0 -5
  372. package/dist/utilities/centralPath.js +0 -27
  373. package/dist/utilities/csv.js +0 -33
  374. package/dist/utilities/fileSystem/app.js +0 -88
  375. package/dist/utilities/fileSystem/clientLibrary.js +0 -138
  376. package/dist/utilities/fileSystem/filesystem.js +0 -180
  377. package/dist/utilities/fileSystem/index.js +0 -21
  378. package/dist/utilities/fileSystem/plugin.js +0 -76
  379. package/dist/utilities/fileSystem/processor.js +0 -34
  380. package/dist/utilities/fileSystem/template.js +0 -47
  381. package/dist/utilities/global.js +0 -149
  382. package/dist/utilities/index.js +0 -143
  383. package/dist/utilities/redis.js +0 -117
  384. package/dist/utilities/retry.js +0 -30
  385. package/dist/utilities/routing/index.js +0 -39
  386. package/dist/utilities/rowProcessor/index.js +0 -282
  387. package/dist/utilities/rowProcessor/map.js +0 -116
  388. package/dist/utilities/rowProcessor/utils.js +0 -87
  389. package/dist/utilities/schema.js +0 -112
  390. package/dist/utilities/scriptRunner.js +0 -26
  391. package/dist/utilities/security.js +0 -57
  392. package/dist/utilities/statusCodes.js +0 -9
  393. package/dist/utilities/usageQuota/rows.js +0 -88
  394. package/dist/utilities/usageQuota/usageQuoteReset.js +0 -16
  395. package/dist/utilities/users.js +0 -57
  396. package/dist/utilities/workerRequests.js +0 -171
  397. package/dist/watch.js +0 -53
  398. package/dist/websockets/client.js +0 -14
  399. package/dist/websockets/grid.js +0 -60
  400. package/dist/websockets/index.js +0 -17
  401. package/dist/websockets/websocket.js +0 -78
  402. /package/dist/{api/controllers/static/templates/BudibaseApp.svelte → BudibaseApp-Y5NZEDTC.svelte} +0 -0
  403. /package/dist/{api/controllers/static/templates/app.hbs → app.hbs} +0 -0
  404. /package/dist/{api/controllers/static/templates/preview.hbs → preview.hbs} +0 -0
package/jest.config.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Config } from "@jest/types"
2
2
 
3
3
  import * as fs from "fs"
4
+ import { join } from "path"
4
5
  const preset = require("ts-jest/jest-preset")
5
6
 
6
7
  const baseConfig: Config.InitialProjectOptions = {
@@ -49,4 +50,6 @@ const config: Config.InitialOptions = {
49
50
  coverageReporters: ["lcov", "json", "clover"],
50
51
  }
51
52
 
53
+ process.env.TOP_LEVEL_PATH = join(__dirname, "..", "..")
54
+
52
55
  export default config
package/nodemon.json CHANGED
@@ -6,5 +6,5 @@
6
6
  "src/**/*.spec.js",
7
7
  "../backend-core/dist/**/*"
8
8
  ],
9
- "exec": "ts-node src/index.ts"
9
+ "exec": "node ./scripts/build.js && node ./dist/index.js"
10
10
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "2.6.19-alpha.3",
4
+ "version": "2.6.19-alpha.31",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -10,22 +10,23 @@
10
10
  },
11
11
  "scripts": {
12
12
  "prebuild": "rimraf dist/",
13
- "build": "tsc -p tsconfig.build.json && mv dist/src/* dist/ && rimraf dist/src/",
13
+ "build": "node ./scripts/build.js",
14
+ "check:types": "tsc -p tsconfig.build.json --noEmit",
15
+ "postbuild": "copyfiles -f ../client/dist/budibase-client.js ../client/manifest.json client",
14
16
  "build:dev": "yarn prebuild && tsc --build --watch --preserveWatchOutput",
15
17
  "debug": "yarn build && node --expose-gc --inspect=9222 dist/index.js",
16
- "postbuild": "copyfiles -u 1 src/**/*.svelte dist/ && copyfiles -u 1 src/**/*.hbs dist/ && copyfiles -u 1 src/**/*.json dist/",
17
18
  "test": "bash scripts/test.sh",
18
19
  "test:memory": "jest --maxWorkers=2 --logHeapUsage --forceExit",
19
20
  "test:watch": "jest --watch",
20
- "predocker": "copyfiles -f ../client/dist/budibase-client.js ../client/manifest.json client",
21
- "build:docker": "yarn run predocker && docker build . -t app-service --label version=$BUDIBASE_RELEASE_VERSION",
21
+ "predocker": "copyfiles -f ../client/dist/budibase-client.js ../client/manifest.json client && yarn build --configuration=production",
22
+ "build:docker": "yarn predocker && docker build . -t app-service --label version=$BUDIBASE_RELEASE_VERSION",
22
23
  "build:docs": "node ./scripts/docs/generate.js open",
23
24
  "run:docker": "node dist/index.js",
24
25
  "run:docker:cluster": "pm2-runtime start pm2.config.js",
25
26
  "dev:stack:up": "node scripts/dev/manage.js up",
26
27
  "dev:stack:down": "node scripts/dev/manage.js down",
27
28
  "dev:stack:nuke": "node scripts/dev/manage.js nuke",
28
- "dev:builder": "yarn run dev:stack:up && nodemon",
29
+ "dev:builder": "yarn run dev:stack:up && rimraf dist/ && nodemon",
29
30
  "dev:built": "yarn run dev:stack:up && yarn run run:docker",
30
31
  "specs": "ts-node specs/generate.ts && openapi-typescript specs/openapi.yaml --output src/definitions/openapi.ts",
31
32
  "initialise": "node scripts/initialise.js",
@@ -45,12 +46,12 @@
45
46
  "license": "GPL-3.0",
46
47
  "dependencies": {
47
48
  "@apidevtools/swagger-parser": "10.0.3",
48
- "@budibase/backend-core": "2.6.19-alpha.3",
49
- "@budibase/client": "2.6.19-alpha.3",
50
- "@budibase/pro": "2.6.19-alpha.3",
51
- "@budibase/shared-core": "2.6.19-alpha.3",
52
- "@budibase/string-templates": "2.6.19-alpha.3",
53
- "@budibase/types": "2.6.19-alpha.3",
49
+ "@budibase/backend-core": "2.6.19-alpha.31",
50
+ "@budibase/client": "2.6.19-alpha.31",
51
+ "@budibase/pro": "2.6.19-alpha.31",
52
+ "@budibase/shared-core": "2.6.19-alpha.31",
53
+ "@budibase/string-templates": "2.6.19-alpha.31",
54
+ "@budibase/types": "2.6.19-alpha.31",
54
55
  "@bull-board/api": "3.7.0",
55
56
  "@bull-board/koa": "3.9.4",
56
57
  "@elastic/elasticsearch": "7.10.0",
@@ -58,6 +59,7 @@
58
59
  "@koa/router": "8.0.8",
59
60
  "@sendgrid/mail": "7.1.1",
60
61
  "@sentry/node": "6.17.7",
62
+ "@socket.io/redis-adapter": "^8.2.1",
61
63
  "airtable": "0.10.1",
62
64
  "arangojs": "7.2.0",
63
65
  "aws-sdk": "2.1030.0",
@@ -98,7 +100,9 @@
98
100
  "mssql": "6.2.3",
99
101
  "mysql2": "2.3.3",
100
102
  "node-fetch": "2.6.7",
103
+ "object-sizeof": "2.6.1",
101
104
  "open": "8.4.0",
105
+ "openai": "^3.2.1",
102
106
  "pg": "8.10.0",
103
107
  "posthog-node": "1.3.0",
104
108
  "pouchdb": "7.3.0",
@@ -177,5 +181,20 @@
177
181
  "optionalDependencies": {
178
182
  "oracledb": "5.3.0"
179
183
  },
180
- "gitHead": "9a3ddfba7931018031a3160c4972119a8bf4a0ac"
184
+ "nx": {
185
+ "targets": {
186
+ "test": {
187
+ "dependsOn": [
188
+ {
189
+ "projects": [
190
+ "@budibase/string-templates",
191
+ "@budibase/shared-core"
192
+ ],
193
+ "target": "build"
194
+ }
195
+ ]
196
+ }
197
+ }
198
+ },
199
+ "gitHead": "46abe5917ecc3ed921f10dfd9aff09f1970f80c3"
181
200
  }
package/pm2.config.js CHANGED
@@ -1,7 +1,7 @@
1
1
  module.exports = {
2
2
  apps: [
3
3
  {
4
- script: "dist/index.js",
4
+ script: "./dist/index.js",
5
5
  instances: "max",
6
6
  exec_mode: "cluster",
7
7
  },
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/node
2
+ const { join } = require("path")
3
+ const fs = require("fs")
4
+ const coreBuild = require("../../../scripts/build")
5
+
6
+ const dir = join(__dirname, "..")
7
+ const entryPath = join(dir, "src")
8
+ const outfilePath = join(dir, "dist")
9
+
10
+ /**
11
+ * The reasoning for this is that now our built version is simple
12
+ * dist/index.js - any kind of threaded approach in Node.js requires
13
+ * a runner file to work from - I played around with a lot of
14
+ * different methods, but we really want to be able to use forks.
15
+ *
16
+ * Rather than trying to rewrite so that forks run the whole system,
17
+ * I instead went down a path of building the individual threads so
18
+ * that we have runner files for each of them e.g. dist/automations.js
19
+ * and dist/query.js - these can be ran totally independently and then
20
+ * the parent process can pass down data for processing to them.
21
+ *
22
+ * The ignoring is simply to remove the files which really don't need
23
+ * to be built - they could be built and it wouldn't cause any issues,
24
+ * but this just means if any further threads are added in future
25
+ * they will naturally work (rather than including, which would mean
26
+ * adjustments to the build files).
27
+ */
28
+ const ignoredFiles = ["definitions", "index", "utils"]
29
+ const threadNames = fs
30
+ .readdirSync(join(dir, "src", "threads"))
31
+ .filter(path => !ignoredFiles.find(file => path.includes(file)))
32
+ .map(path => path.replace(".ts", ""))
33
+ const files = [
34
+ {
35
+ entry: join(entryPath, "index.ts"),
36
+ out: join(outfilePath, "index.js"),
37
+ },
38
+ ]
39
+ for (let name of threadNames) {
40
+ files.push({
41
+ entry: join(entryPath, "threads", `${name}.ts`),
42
+ out: join(outfilePath, `${name}.js`),
43
+ })
44
+ }
45
+
46
+ for (let file of files) {
47
+ coreBuild(file.entry, file.out)
48
+ }
@@ -26,10 +26,13 @@ import {
26
26
  env as envCore,
27
27
  } from "@budibase/backend-core"
28
28
  import { USERS_TABLE_SCHEMA } from "../../constants"
29
- import { buildDefaultDocs } from "../../db/defaultData/datasource_bb_default"
29
+ import {
30
+ DEFAULT_BB_DATASOURCE_ID,
31
+ buildDefaultDocs,
32
+ } from "../../db/defaultData/datasource_bb_default"
30
33
  import { removeAppFromUserRoles } from "../../utilities/workerRequests"
31
34
  import { stringToReadStream, isQsTrue } from "../../utilities"
32
- import { getLocksById } from "../../utilities/redis"
35
+ import { getLocksById, doesUserHaveLock } from "../../utilities/redis"
33
36
  import {
34
37
  updateClientLibrary,
35
38
  backupClientLibrary,
@@ -111,11 +114,7 @@ function checkAppName(
111
114
  }
112
115
  }
113
116
 
114
- async function createInstance(
115
- appId: string,
116
- template: any,
117
- includeSampleData: boolean
118
- ) {
117
+ async function createInstance(appId: string, template: any) {
119
118
  const db = context.getAppDB()
120
119
  await db.put({
121
120
  _id: "_design/database",
@@ -142,21 +141,25 @@ async function createInstance(
142
141
  } else {
143
142
  // create the users table
144
143
  await db.put(USERS_TABLE_SCHEMA)
145
-
146
- if (includeSampleData) {
147
- // create ootb stock db
148
- await addDefaultTables(db)
149
- }
150
144
  }
151
145
 
152
146
  return { _id: appId }
153
147
  }
154
148
 
155
- async function addDefaultTables(db: Database) {
156
- const defaultDbDocs = buildDefaultDocs()
149
+ export const addSampleData = async (ctx: UserCtx) => {
150
+ const db = context.getAppDB()
157
151
 
158
- // add in the default db data docs - tables, datasource, rows and links
159
- await db.bulkDocs([...defaultDbDocs])
152
+ try {
153
+ // Check if default datasource exists before creating it
154
+ await sdk.datasources.get(DEFAULT_BB_DATASOURCE_ID)
155
+ } catch (err: any) {
156
+ const defaultDbDocs = buildDefaultDocs()
157
+
158
+ // add in the default db data docs - tables, datasource, rows and links
159
+ await db.bulkDocs([...defaultDbDocs])
160
+ }
161
+
162
+ ctx.status = 200
160
163
  }
161
164
 
162
165
  export async function fetch(ctx: UserCtx) {
@@ -227,6 +230,7 @@ export async function fetchAppPackage(ctx: UserCtx) {
227
230
  screens,
228
231
  layouts,
229
232
  clientLibPath,
233
+ hasLock: await doesUserHaveLock(application.appId, ctx.user),
230
234
  }
231
235
  }
232
236
 
@@ -247,16 +251,11 @@ async function performAppCreate(ctx: UserCtx) {
247
251
  if (ctx.request.files && ctx.request.files.templateFile) {
248
252
  instanceConfig.file = ctx.request.files.templateFile
249
253
  }
250
- const includeSampleData = isQsTrue(ctx.request.body.sampleData)
251
254
  const tenantId = tenancy.isMultiTenant() ? tenancy.getTenantId() : null
252
255
  const appId = generateDevAppID(generateAppID(tenantId))
253
256
 
254
257
  return await context.doInAppContext(appId, async () => {
255
- const instance = await createInstance(
256
- appId,
257
- instanceConfig,
258
- includeSampleData
259
- )
258
+ const instance = await createInstance(appId, instanceConfig)
260
259
  const db = context.getAppDB()
261
260
 
262
261
  let newApplication: App = {
@@ -14,9 +14,16 @@ import { deleteEntityMetadata } from "../../utilities"
14
14
  import { MetadataTypes } from "../../constants"
15
15
  import { setTestFlag, clearTestFlag } from "../../utilities/redis"
16
16
  import { context, cache, events } from "@budibase/backend-core"
17
- import { automations } from "@budibase/pro"
18
- import { Automation, BBContext } from "@budibase/types"
17
+ import { automations, features } from "@budibase/pro"
18
+ import {
19
+ Automation,
20
+ AutomationActionStepId,
21
+ AutomationResults,
22
+ BBContext,
23
+ } from "@budibase/types"
19
24
  import { getActionDefinitions as actionDefs } from "../../automations/actions"
25
+ import sdk from "../../sdk"
26
+ import { db as dbCore } from "@budibase/backend-core"
20
27
 
21
28
  async function getActionDefinitions() {
22
29
  return removeDeprecated(await actionDefs())
@@ -257,13 +264,34 @@ export async function getDefinitionList(ctx: BBContext) {
257
264
  export async function trigger(ctx: BBContext) {
258
265
  const db = context.getAppDB()
259
266
  let automation = await db.get(ctx.params.id)
260
- await triggers.externalTrigger(automation, {
261
- ...ctx.request.body,
262
- appId: ctx.appId,
263
- })
264
- ctx.body = {
265
- message: `Automation ${automation._id} has been triggered.`,
266
- automation,
267
+
268
+ let hasCollectStep = sdk.automations.utils.checkForCollectStep(automation)
269
+ if (hasCollectStep && (await features.isSyncAutomationsEnabled())) {
270
+ const response: AutomationResults = await triggers.externalTrigger(
271
+ automation,
272
+ {
273
+ fields: ctx.request.body.fields,
274
+ timeout: ctx.request.body.timeout * 1000 || 120000,
275
+ },
276
+ { getResponses: true }
277
+ )
278
+
279
+ let collectedValue = response.steps.find(
280
+ step => step.stepId === AutomationActionStepId.COLLECT
281
+ )
282
+ ctx.body = collectedValue?.outputs
283
+ } else {
284
+ if (ctx.appId && !dbCore.isProdAppID(ctx.appId)) {
285
+ ctx.throw(400, "Only apps in production support this endpoint")
286
+ }
287
+ await triggers.externalTrigger(automation, {
288
+ ...ctx.request.body,
289
+ appId: ctx.appId,
290
+ })
291
+ ctx.body = {
292
+ message: `Automation ${automation._id} has been triggered.`,
293
+ automation,
294
+ }
267
295
  }
268
296
  }
269
297
 
@@ -21,10 +21,12 @@ import {
21
21
  CreateDatasourceRequest,
22
22
  VerifyDatasourceRequest,
23
23
  VerifyDatasourceResponse,
24
+ FetchDatasourceInfoResponse,
24
25
  IntegrationBase,
25
26
  DatasourcePlus,
26
27
  } from "@budibase/types"
27
28
  import sdk from "../../sdk"
29
+ import { builderSocket } from "../../websockets"
28
30
 
29
31
  function getErrorTables(errors: any, errorType: string) {
30
32
  return Object.entries(errors)
@@ -153,6 +155,21 @@ export async function verify(
153
155
  }
154
156
  }
155
157
 
158
+ export async function information(
159
+ ctx: UserCtx<void, FetchDatasourceInfoResponse>
160
+ ) {
161
+ const datasourceId = ctx.params.datasourceId
162
+ const datasource = await sdk.datasources.get(datasourceId, { enriched: true })
163
+ const connector = (await getConnector(datasource)) as DatasourcePlus
164
+ if (!connector.getTableNames) {
165
+ ctx.throw(400, "Table name fetching not supported by datasource")
166
+ }
167
+ const tableNames = await connector.getTableNames()
168
+ ctx.body = {
169
+ tableNames,
170
+ }
171
+ }
172
+
156
173
  export async function buildSchemaFromDb(ctx: UserCtx) {
157
174
  const db = context.getAppDB()
158
175
  const datasource = await sdk.datasources.get(ctx.params.datasourceId)
@@ -280,6 +297,7 @@ export async function update(ctx: UserCtx<any, UpdateDatasourceResponse>) {
280
297
  ctx.body = {
281
298
  datasource: await sdk.datasources.removeSecretSingle(datasource),
282
299
  }
300
+ builderSocket.emitDatasourceUpdate(ctx, datasource)
283
301
  }
284
302
 
285
303
  export async function save(
@@ -322,6 +340,7 @@ export async function save(
322
340
  response.error = schemaError
323
341
  }
324
342
  ctx.body = response
343
+ builderSocket.emitDatasourceUpdate(ctx, datasource)
325
344
  }
326
345
 
327
346
  async function destroyInternalTablesBySourceId(datasourceId: string) {
@@ -381,6 +400,7 @@ export async function destroy(ctx: UserCtx) {
381
400
 
382
401
  ctx.message = `Datasource deleted.`
383
402
  ctx.status = 200
403
+ builderSocket.emitDatasourceDeletion(ctx, datasourceId)
384
404
  }
385
405
 
386
406
  export async function find(ctx: UserCtx) {
@@ -4,6 +4,7 @@ import * as external from "./external"
4
4
  import { isExternalTable } from "../../../integrations/utils"
5
5
  import { Ctx } from "@budibase/types"
6
6
  import * as utils from "./utils"
7
+ import { gridSocket } from "../../../websockets"
7
8
 
8
9
  function pickApi(tableId: any) {
9
10
  if (isExternalTable(tableId)) {
@@ -12,21 +13,9 @@ function pickApi(tableId: any) {
12
13
  return internal
13
14
  }
14
15
 
15
- function getTableId(ctx: any) {
16
- if (ctx.request.body && ctx.request.body.tableId) {
17
- return ctx.request.body.tableId
18
- }
19
- if (ctx.params && ctx.params.tableId) {
20
- return ctx.params.tableId
21
- }
22
- if (ctx.params && ctx.params.viewName) {
23
- return ctx.params.viewName
24
- }
25
- }
26
-
27
16
  export async function patch(ctx: any): Promise<any> {
28
17
  const appId = ctx.appId
29
- const tableId = getTableId(ctx)
18
+ const tableId = utils.getTableId(ctx)
30
19
  const body = ctx.request.body
31
20
  // if it doesn't have an _id then its save
32
21
  if (body && !body._id) {
@@ -47,6 +36,7 @@ export async function patch(ctx: any): Promise<any> {
47
36
  ctx.eventEmitter.emitRow(`row:update`, appId, row, table)
48
37
  ctx.message = `${table.name} updated successfully.`
49
38
  ctx.body = row
39
+ gridSocket?.emitRowUpdate(ctx, row)
50
40
  } catch (err) {
51
41
  ctx.throw(400, err)
52
42
  }
@@ -54,7 +44,7 @@ export async function patch(ctx: any): Promise<any> {
54
44
 
55
45
  export const save = async (ctx: any) => {
56
46
  const appId = ctx.appId
57
- const tableId = getTableId(ctx)
47
+ const tableId = utils.getTableId(ctx)
58
48
  const body = ctx.request.body
59
49
  // if it has an ID already then its a patch
60
50
  if (body && body._id) {
@@ -69,23 +59,24 @@ export const save = async (ctx: any) => {
69
59
  ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:save`, appId, row, table)
70
60
  ctx.message = `${table.name} saved successfully`
71
61
  ctx.body = row
62
+ gridSocket?.emitRowUpdate(ctx, row)
72
63
  }
73
64
  export async function fetchView(ctx: any) {
74
- const tableId = getTableId(ctx)
65
+ const tableId = utils.getTableId(ctx)
75
66
  ctx.body = await quotas.addQuery(() => pickApi(tableId).fetchView(ctx), {
76
67
  datasourceId: tableId,
77
68
  })
78
69
  }
79
70
 
80
71
  export async function fetch(ctx: any) {
81
- const tableId = getTableId(ctx)
72
+ const tableId = utils.getTableId(ctx)
82
73
  ctx.body = await quotas.addQuery(() => pickApi(tableId).fetch(ctx), {
83
74
  datasourceId: tableId,
84
75
  })
85
76
  }
86
77
 
87
78
  export async function find(ctx: any) {
88
- const tableId = getTableId(ctx)
79
+ const tableId = utils.getTableId(ctx)
89
80
  ctx.body = await quotas.addQuery(() => pickApi(tableId).find(ctx), {
90
81
  datasourceId: tableId,
91
82
  })
@@ -94,7 +85,7 @@ export async function find(ctx: any) {
94
85
  export async function destroy(ctx: any) {
95
86
  const appId = ctx.appId
96
87
  const inputs = ctx.request.body
97
- const tableId = getTableId(ctx)
88
+ const tableId = utils.getTableId(ctx)
98
89
  let response, row
99
90
  if (inputs.rows) {
100
91
  let { rows } = await quotas.addQuery(
@@ -107,6 +98,7 @@ export async function destroy(ctx: any) {
107
98
  response = rows
108
99
  for (let row of rows) {
109
100
  ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, row)
101
+ gridSocket?.emitRowDeletion(ctx, row._id)
110
102
  }
111
103
  } else {
112
104
  let resp = await quotas.addQuery(() => pickApi(tableId).destroy(ctx), {
@@ -116,6 +108,7 @@ export async function destroy(ctx: any) {
116
108
  response = resp.response
117
109
  row = resp.row
118
110
  ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, row)
111
+ gridSocket?.emitRowDeletion(ctx, row._id)
119
112
  }
120
113
  ctx.status = 200
121
114
  // for automations include the row that was deleted
@@ -124,7 +117,7 @@ export async function destroy(ctx: any) {
124
117
  }
125
118
 
126
119
  export async function search(ctx: any) {
127
- const tableId = getTableId(ctx)
120
+ const tableId = utils.getTableId(ctx)
128
121
  ctx.status = 200
129
122
  ctx.body = await quotas.addQuery(() => pickApi(tableId).search(ctx), {
130
123
  datasourceId: tableId,
@@ -132,7 +125,7 @@ export async function search(ctx: any) {
132
125
  }
133
126
 
134
127
  export async function validate(ctx: Ctx) {
135
- const tableId = getTableId(ctx)
128
+ const tableId = utils.getTableId(ctx)
136
129
  // external tables are hard to validate currently
137
130
  if (isExternalTable(tableId)) {
138
131
  ctx.body = { valid: true }
@@ -145,7 +138,7 @@ export async function validate(ctx: Ctx) {
145
138
  }
146
139
 
147
140
  export async function fetchEnrichedRow(ctx: any) {
148
- const tableId = getTableId(ctx)
141
+ const tableId = utils.getTableId(ctx)
149
142
  ctx.body = await quotas.addQuery(
150
143
  () => pickApi(tableId).fetchEnrichedRow(ctx),
151
144
  {
@@ -155,7 +148,7 @@ export async function fetchEnrichedRow(ctx: any) {
155
148
  }
156
149
 
157
150
  export const exportRows = async (ctx: any) => {
158
- const tableId = getTableId(ctx)
151
+ const tableId = utils.getTableId(ctx)
159
152
  ctx.body = await quotas.addQuery(() => pickApi(tableId).exportRows(ctx), {
160
153
  datasourceId: tableId,
161
154
  })
@@ -415,7 +415,7 @@ export async function exportRows(ctx: UserCtx) {
415
415
 
416
416
  result = await outputProcessing(table, response)
417
417
  } else if (query) {
418
- let searchResponse = await exports.search(ctx)
418
+ let searchResponse = await search(ctx)
419
419
  result = searchResponse.rows
420
420
  }
421
421
 
@@ -154,3 +154,15 @@ export function cleanExportRows(
154
154
 
155
155
  return cleanRows
156
156
  }
157
+
158
+ export function getTableId(ctx: any) {
159
+ if (ctx.request.body && ctx.request.body.tableId) {
160
+ return ctx.request.body.tableId
161
+ }
162
+ if (ctx.params && ctx.params.tableId) {
163
+ return ctx.params.tableId
164
+ }
165
+ if (ctx.params && ctx.params.viewName) {
166
+ return ctx.params.viewName
167
+ }
168
+ }
@@ -134,7 +134,7 @@ export const serveApp = async function (ctx: any) {
134
134
  ? objectStore.getGlobalFileUrl("settings", "logoUrl")
135
135
  : "",
136
136
  })
137
- const appHbs = loadHandlebarsFile(`${__dirname}/templates/app.hbs`)
137
+ const appHbs = loadHandlebarsFile(`${__dirname}/app.hbs`)
138
138
  ctx.body = await processString(appHbs, {
139
139
  head,
140
140
  body: html,
@@ -161,7 +161,7 @@ export const serveApp = async function (ctx: any) {
161
161
  : "",
162
162
  })
163
163
 
164
- const appHbs = loadHandlebarsFile(`${__dirname}/templates/app.hbs`)
164
+ const appHbs = loadHandlebarsFile(`${__dirname}/app.hbs`)
165
165
  ctx.body = await processString(appHbs, {
166
166
  head,
167
167
  body: html,
@@ -177,7 +177,7 @@ export const serveBuilderPreview = async function (ctx: any) {
177
177
 
178
178
  if (!env.isJest()) {
179
179
  let appId = context.getAppId()
180
- const previewHbs = loadHandlebarsFile(`${__dirname}/templates/preview.hbs`)
180
+ const previewHbs = loadHandlebarsFile(`${__dirname}/preview.hbs`)
181
181
  ctx.body = await processString(previewHbs, {
182
182
  clientLibPath: objectStore.clientLibraryUrl(appId!, appInfo.version),
183
183
  })
@@ -11,6 +11,7 @@ import { context, events } from "@budibase/backend-core"
11
11
  import { Table, UserCtx } from "@budibase/types"
12
12
  import sdk from "../../../sdk"
13
13
  import { jsonFromCsvString } from "../../../utilities/csv"
14
+ import { builderSocket } from "../../../websockets"
14
15
 
15
16
  function pickApi({ tableId, table }: { tableId?: string; table?: Table }) {
16
17
  if (table && !tableId) {
@@ -77,6 +78,7 @@ export async function save(ctx: UserCtx) {
77
78
  ctx.eventEmitter &&
78
79
  ctx.eventEmitter.emitTable(`table:save`, appId, savedTable)
79
80
  ctx.body = savedTable
81
+ builderSocket.emitTableUpdate(ctx, savedTable)
80
82
  }
81
83
 
82
84
  export async function destroy(ctx: UserCtx) {
@@ -89,6 +91,7 @@ export async function destroy(ctx: UserCtx) {
89
91
  ctx.status = 200
90
92
  ctx.table = deletedTable
91
93
  ctx.body = { message: `Table ${tableId} deleted.` }
94
+ builderSocket.emitTableDeletion(ctx, tableId)
92
95
  }
93
96
 
94
97
  export async function bulkImport(ctx: UserCtx) {
@@ -186,11 +186,7 @@ export async function destroy(ctx: any) {
186
186
  export async function bulkImport(ctx: any) {
187
187
  const db = context.getAppDB()
188
188
  const table = await sdk.tables.getTable(ctx.params.tableId)
189
- const { rows } = ctx.request.body
190
- await handleDataImport(ctx.user, table, rows)
191
-
192
- // Ensure auto id and other table updates are persisted
193
- await db.put(table)
194
-
189
+ const { rows, identifierFields } = ctx.request.body
190
+ await handleDataImport(ctx.user, table, rows, identifierFields)
195
191
  return table
196
192
  }
@@ -149,7 +149,12 @@ export function importToRows(
149
149
  return finalData
150
150
  }
151
151
 
152
- export async function handleDataImport(user: any, table: any, rows: any) {
152
+ export async function handleDataImport(
153
+ user: any,
154
+ table: any,
155
+ rows: any,
156
+ identifierFields: Array<string> = []
157
+ ) {
153
158
  const schema: unknown = table.schema
154
159
 
155
160
  if (!rows || !isRows(rows) || !isSchema(schema)) {
@@ -161,6 +166,32 @@ export async function handleDataImport(user: any, table: any, rows: any) {
161
166
 
162
167
  let finalData: any = importToRows(data, table, user)
163
168
 
169
+ //Set IDs of finalData to match existing row if an update is expected
170
+ if (identifierFields.length > 0) {
171
+ const allDocs = await db.allDocs(
172
+ getRowParams(table._id, null, {
173
+ include_docs: true,
174
+ })
175
+ )
176
+ allDocs.rows
177
+ .map(existingRow => existingRow.doc)
178
+ .forEach((doc: any) => {
179
+ finalData.forEach((finalItem: any) => {
180
+ let match = true
181
+ for (const field of identifierFields) {
182
+ if (finalItem[field] !== doc[field]) {
183
+ match = false
184
+ break
185
+ }
186
+ }
187
+ if (match) {
188
+ finalItem._id = doc._id
189
+ finalItem._rev = doc._rev
190
+ }
191
+ })
192
+ })
193
+ }
194
+
164
195
  await quotas.addRows(finalData.length, () => db.bulkDocs(finalData), {
165
196
  tableId: table._id,
166
197
  })