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

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 (401) 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 +32392 -0
  8. package/dist/automation.js.map +7 -0
  9. package/dist/index.js +44698 -13
  10. package/dist/index.js.map +7 -0
  11. package/dist/query.js +24363 -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 +31 -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/steps/bash.ts +4 -0
  40. package/src/automations/steps/collect.ts +58 -0
  41. package/src/automations/steps/createRow.ts +4 -0
  42. package/src/automations/steps/delay.ts +1 -0
  43. package/src/automations/steps/deleteRow.ts +4 -0
  44. package/src/automations/steps/discord.ts +4 -0
  45. package/src/automations/steps/executeQuery.ts +4 -0
  46. package/src/automations/steps/executeScript.ts +4 -0
  47. package/src/automations/steps/filter.ts +1 -0
  48. package/src/automations/steps/loop.ts +1 -0
  49. package/src/automations/steps/make.ts +4 -0
  50. package/src/automations/steps/openai.ts +106 -0
  51. package/src/automations/steps/outgoingWebhook.ts +4 -0
  52. package/src/automations/steps/queryRows.ts +4 -0
  53. package/src/automations/steps/sendSmtpEmail.ts +4 -0
  54. package/src/automations/steps/serverLog.ts +4 -0
  55. package/src/automations/steps/slack.ts +4 -0
  56. package/src/automations/steps/updateRow.ts +4 -0
  57. package/src/automations/steps/zapier.ts +4 -0
  58. package/src/automations/tests/openai.spec.ts +86 -0
  59. package/src/automations/triggers.ts +3 -2
  60. package/src/constants/index.ts +17 -16
  61. package/src/db/inMemoryView.ts +1 -0
  62. package/src/environment.ts +2 -0
  63. package/src/integration-test/postgres.spec.ts +47 -4
  64. package/src/integrations/airtable.ts +3 -1
  65. package/src/integrations/arangodb.ts +3 -1
  66. package/src/integrations/base/sqlTable.ts +0 -1
  67. package/src/integrations/couchdb.ts +3 -1
  68. package/src/integrations/dynamodb.ts +3 -1
  69. package/src/integrations/elasticsearch.ts +3 -1
  70. package/src/integrations/firebase.ts +3 -1
  71. package/src/integrations/googlesheets.ts +11 -3
  72. package/src/integrations/microsoftSqlServer.ts +18 -2
  73. package/src/integrations/mongodb.ts +3 -1
  74. package/src/integrations/mysql.ts +27 -11
  75. package/src/integrations/oracle.ts +11 -1
  76. package/src/integrations/postgres.ts +15 -1
  77. package/src/integrations/redis.ts +3 -1
  78. package/src/integrations/s3.ts +3 -1
  79. package/src/integrations/snowflake.ts +3 -1
  80. package/src/integrations/tests/googlesheets.spec.ts +41 -9
  81. package/src/middleware/builder.ts +4 -5
  82. package/src/sdk/app/automations/index.ts +2 -0
  83. package/src/sdk/app/automations/utils.ts +7 -0
  84. package/src/startup.ts +2 -0
  85. package/src/tests/utilities/TestConfiguration.ts +4 -2
  86. package/src/tests/utilities/structures.ts +42 -0
  87. package/src/threads/automation.ts +39 -0
  88. package/src/utilities/fileSystem/app.ts +1 -1
  89. package/src/utilities/fileSystem/clientLibrary.ts +8 -3
  90. package/src/utilities/fileSystem/filesystem.ts +3 -1
  91. package/src/utilities/redis.ts +19 -2
  92. package/src/websockets/builder.ts +69 -0
  93. package/src/websockets/grid.ts +25 -7
  94. package/src/websockets/index.ts +5 -2
  95. package/src/websockets/websocket.ts +20 -4
  96. package/tsconfig.build.json +9 -1
  97. package/tsconfig.json +1 -14
  98. package/dist/api/controllers/analytics.js +0 -46
  99. package/dist/api/controllers/apikeys.js +0 -72
  100. package/dist/api/controllers/application.js +0 -574
  101. package/dist/api/controllers/auth.js +0 -80
  102. package/dist/api/controllers/automation.js +0 -303
  103. package/dist/api/controllers/backup.js +0 -37
  104. package/dist/api/controllers/component.js +0 -59
  105. package/dist/api/controllers/datasource.js +0 -337
  106. package/dist/api/controllers/deploy/Deployment.js +0 -53
  107. package/dist/api/controllers/deploy/index.js +0 -198
  108. package/dist/api/controllers/dev.js +0 -146
  109. package/dist/api/controllers/integration.js +0 -28
  110. package/dist/api/controllers/layout.js +0 -49
  111. package/dist/api/controllers/metadata.js +0 -63
  112. package/dist/api/controllers/migrations.js +0 -29
  113. package/dist/api/controllers/ops.js +0 -40
  114. package/dist/api/controllers/permission.js +0 -162
  115. package/dist/api/controllers/plugin/file.js +0 -24
  116. package/dist/api/controllers/plugin/github.js +0 -69
  117. package/dist/api/controllers/plugin/index.js +0 -112
  118. package/dist/api/controllers/plugin/npm.js +0 -58
  119. package/dist/api/controllers/plugin/uploaders.js +0 -11
  120. package/dist/api/controllers/plugin/url.js +0 -24
  121. package/dist/api/controllers/plugin/utils.js +0 -27
  122. package/dist/api/controllers/public/applications.js +0 -146
  123. package/dist/api/controllers/public/mapping/applications.js +0 -29
  124. package/dist/api/controllers/public/mapping/index.js +0 -11
  125. package/dist/api/controllers/public/mapping/queries.js +0 -36
  126. package/dist/api/controllers/public/mapping/rows.js +0 -24
  127. package/dist/api/controllers/public/mapping/tables.js +0 -23
  128. package/dist/api/controllers/public/mapping/types.js +0 -2
  129. package/dist/api/controllers/public/mapping/users.js +0 -29
  130. package/dist/api/controllers/public/metrics.js +0 -113
  131. package/dist/api/controllers/public/queries.js +0 -58
  132. package/dist/api/controllers/public/rows.js +0 -120
  133. package/dist/api/controllers/public/tables.js +0 -95
  134. package/dist/api/controllers/public/users.js +0 -93
  135. package/dist/api/controllers/public/utils.js +0 -56
  136. package/dist/api/controllers/query/import/index.js +0 -87
  137. package/dist/api/controllers/query/import/sources/base/index.js +0 -75
  138. package/dist/api/controllers/query/import/sources/base/openapi.js +0 -42
  139. package/dist/api/controllers/query/import/sources/curl.js +0 -99
  140. package/dist/api/controllers/query/import/sources/openapi2.js +0 -145
  141. package/dist/api/controllers/query/import/sources/openapi3.js +0 -177
  142. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +0 -253
  143. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +0 -1054
  144. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +0 -253
  145. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +0 -1225
  146. package/dist/api/controllers/query/index.js +0 -299
  147. package/dist/api/controllers/query/validation.js +0 -53
  148. package/dist/api/controllers/role.js +0 -109
  149. package/dist/api/controllers/routing.js +0 -105
  150. package/dist/api/controllers/row/ExternalRequest.js +0 -683
  151. package/dist/api/controllers/row/external.js +0 -339
  152. package/dist/api/controllers/row/index.js +0 -203
  153. package/dist/api/controllers/row/internal.js +0 -509
  154. package/dist/api/controllers/row/internalSearch.js +0 -28
  155. package/dist/api/controllers/row/staticFormula.js +0 -165
  156. package/dist/api/controllers/row/utils.js +0 -183
  157. package/dist/api/controllers/screen.js +0 -110
  158. package/dist/api/controllers/script.js +0 -30
  159. package/dist/api/controllers/static/index.js +0 -268
  160. package/dist/api/controllers/table/bulkFormula.js +0 -173
  161. package/dist/api/controllers/table/external.js +0 -279
  162. package/dist/api/controllers/table/index.js +0 -179
  163. package/dist/api/controllers/table/internal.js +0 -197
  164. package/dist/api/controllers/table/utils.js +0 -379
  165. package/dist/api/controllers/templates.js +0 -56
  166. package/dist/api/controllers/user.js +0 -124
  167. package/dist/api/controllers/view/exporters.js +0 -46
  168. package/dist/api/controllers/view/index.js +0 -193
  169. package/dist/api/controllers/view/utils.js +0 -177
  170. package/dist/api/controllers/view/viewBuilder.js +0 -158
  171. package/dist/api/controllers/webhook.js +0 -134
  172. package/dist/api/index.js +0 -55
  173. package/dist/api/routes/analytics.js +0 -34
  174. package/dist/api/routes/apikeys.js +0 -37
  175. package/dist/api/routes/application.js +0 -48
  176. package/dist/api/routes/auth.js +0 -33
  177. package/dist/api/routes/automation.js +0 -50
  178. package/dist/api/routes/backup.js +0 -35
  179. package/dist/api/routes/component.js +0 -35
  180. package/dist/api/routes/datasource.js +0 -44
  181. package/dist/api/routes/deploy.js +0 -37
  182. package/dist/api/routes/dev.js +0 -49
  183. package/dist/api/routes/index.js +0 -75
  184. package/dist/api/routes/integration.js +0 -37
  185. package/dist/api/routes/layout.js +0 -37
  186. package/dist/api/routes/metadata.js +0 -40
  187. package/dist/api/routes/migrations.js +0 -36
  188. package/dist/api/routes/ops.js +0 -52
  189. package/dist/api/routes/permission.js +0 -44
  190. package/dist/api/routes/plugin.js +0 -39
  191. package/dist/api/routes/public/applications.js +0 -174
  192. package/dist/api/routes/public/index.js +0 -140
  193. package/dist/api/routes/public/metrics.js +0 -30
  194. package/dist/api/routes/public/middleware/mapper.js +0 -97
  195. package/dist/api/routes/public/queries.js +0 -72
  196. package/dist/api/routes/public/rows.js +0 -158
  197. package/dist/api/routes/public/tables.js +0 -152
  198. package/dist/api/routes/public/users.js +0 -135
  199. package/dist/api/routes/public/utils/Endpoint.js +0 -36
  200. package/dist/api/routes/query.js +0 -47
  201. package/dist/api/routes/role.js +0 -40
  202. package/dist/api/routes/routing.js +0 -39
  203. package/dist/api/routes/row.js +0 -239
  204. package/dist/api/routes/screen.js +0 -39
  205. package/dist/api/routes/script.js +0 -35
  206. package/dist/api/routes/static.js +0 -80
  207. package/dist/api/routes/table.js +0 -163
  208. package/dist/api/routes/templates.js +0 -37
  209. package/dist/api/routes/user.js +0 -43
  210. package/dist/api/routes/utils/validators.js +0 -238
  211. package/dist/api/routes/view.js +0 -42
  212. package/dist/api/routes/webhook.js +0 -43
  213. package/dist/app.js +0 -132
  214. package/dist/automations/actions.js +0 -137
  215. package/dist/automations/automationUtils.js +0 -173
  216. package/dist/automations/bullboard.js +0 -71
  217. package/dist/automations/index.js +0 -43
  218. package/dist/automations/logging/index.js +0 -53
  219. package/dist/automations/steps/bash.js +0 -111
  220. package/dist/automations/steps/createRow.js +0 -108
  221. package/dist/automations/steps/delay.js +0 -53
  222. package/dist/automations/steps/deleteRow.js +0 -96
  223. package/dist/automations/steps/discord.js +0 -116
  224. package/dist/automations/steps/executeQuery.js +0 -134
  225. package/dist/automations/steps/executeScript.js +0 -106
  226. package/dist/automations/steps/filter.js +0 -112
  227. package/dist/automations/steps/loop.js +0 -54
  228. package/dist/automations/steps/make.js +0 -134
  229. package/dist/automations/steps/outgoingWebhook.js +0 -166
  230. package/dist/automations/steps/queryRows.js +0 -216
  231. package/dist/automations/steps/sendSmtpEmail.js +0 -115
  232. package/dist/automations/steps/serverLog.js +0 -65
  233. package/dist/automations/steps/slack.js +0 -98
  234. package/dist/automations/steps/updateRow.js +0 -144
  235. package/dist/automations/steps/utils.js +0 -56
  236. package/dist/automations/steps/zapier.js +0 -130
  237. package/dist/automations/triggerInfo/app.js +0 -36
  238. package/dist/automations/triggerInfo/cron.js +0 -35
  239. package/dist/automations/triggerInfo/index.js +0 -40
  240. package/dist/automations/triggerInfo/rowDeleted.js +0 -36
  241. package/dist/automations/triggerInfo/rowSaved.js +0 -44
  242. package/dist/automations/triggerInfo/rowUpdated.js +0 -44
  243. package/dist/automations/triggerInfo/webhook.js +0 -40
  244. package/dist/automations/triggers.js +0 -181
  245. package/dist/automations/utils.js +0 -275
  246. package/dist/constants/definitions.js +0 -2
  247. package/dist/constants/index.js +0 -181
  248. package/dist/constants/layouts.js +0 -148
  249. package/dist/constants/screens.js +0 -51
  250. package/dist/db/defaultData/datasource_bb_default.js +0 -574
  251. package/dist/db/defaultData/employeeImport.js +0 -155
  252. package/dist/db/defaultData/expensesImport.js +0 -117
  253. package/dist/db/defaultData/inventoryImport.js +0 -109
  254. package/dist/db/defaultData/jobsImport.js +0 -152
  255. package/dist/db/dynamoClient.js +0 -124
  256. package/dist/db/inMemoryView.js +0 -62
  257. package/dist/db/index.js +0 -43
  258. package/dist/db/linkedRows/LinkController.js +0 -392
  259. package/dist/db/linkedRows/LinkDocument.js +0 -33
  260. package/dist/db/linkedRows/index.js +0 -206
  261. package/dist/db/linkedRows/linkUtils.js +0 -131
  262. package/dist/db/newid.js +0 -7
  263. package/dist/db/utils.js +0 -248
  264. package/dist/db/views/staticViews.js +0 -144
  265. package/dist/ddApm.js +0 -11
  266. package/dist/definitions/automations.js +0 -8
  267. package/dist/definitions/common.js +0 -2
  268. package/dist/definitions/datasource.js +0 -7
  269. package/dist/definitions/openapi.js +0 -6
  270. package/dist/environment.js +0 -109
  271. package/dist/events/AutomationEmitter.js +0 -53
  272. package/dist/events/BudibaseEmitter.js +0 -25
  273. package/dist/events/docUpdates/index.js +0 -17
  274. package/dist/events/docUpdates/processors.js +0 -18
  275. package/dist/events/docUpdates/syncUsers.js +0 -49
  276. package/dist/events/index.js +0 -11
  277. package/dist/events/utils.js +0 -43
  278. package/dist/integrations/airtable.js +0 -173
  279. package/dist/integrations/arangodb.js +0 -119
  280. package/dist/integrations/base/query.js +0 -32
  281. package/dist/integrations/base/sql.js +0 -600
  282. package/dist/integrations/base/sqlTable.js +0 -167
  283. package/dist/integrations/base/types.js +0 -2
  284. package/dist/integrations/couchdb.js +0 -140
  285. package/dist/integrations/dynamodb.js +0 -210
  286. package/dist/integrations/elasticsearch.js +0 -201
  287. package/dist/integrations/firebase.js +0 -189
  288. package/dist/integrations/googlesheets.js +0 -484
  289. package/dist/integrations/index.js +0 -138
  290. package/dist/integrations/microsoftSqlServer.js +0 -289
  291. package/dist/integrations/mongodb.js +0 -630
  292. package/dist/integrations/mysql.js +0 -272
  293. package/dist/integrations/oracle.js +0 -404
  294. package/dist/integrations/postgres.js +0 -320
  295. package/dist/integrations/queries/sql.js +0 -84
  296. package/dist/integrations/redis.js +0 -187
  297. package/dist/integrations/rest.js +0 -400
  298. package/dist/integrations/s3.js +0 -256
  299. package/dist/integrations/snowflake.js +0 -114
  300. package/dist/integrations/utils.js +0 -295
  301. package/dist/middleware/appInfo.js +0 -22
  302. package/dist/middleware/authorized.js +0 -112
  303. package/dist/middleware/builder.js +0 -93
  304. package/dist/middleware/currentapp.js +0 -103
  305. package/dist/middleware/joi-validator.js +0 -43
  306. package/dist/middleware/publicApi.js +0 -25
  307. package/dist/middleware/resourceId.js +0 -59
  308. package/dist/middleware/selfhost.js +0 -24
  309. package/dist/middleware/utils.js +0 -8
  310. package/dist/migrations/functions/appUrls.js +0 -42
  311. package/dist/migrations/functions/backfill/app/automations.js +0 -31
  312. package/dist/migrations/functions/backfill/app/datasources.js +0 -28
  313. package/dist/migrations/functions/backfill/app/layouts.js +0 -33
  314. package/dist/migrations/functions/backfill/app/queries.js +0 -49
  315. package/dist/migrations/functions/backfill/app/roles.js +0 -28
  316. package/dist/migrations/functions/backfill/app/screens.js +0 -28
  317. package/dist/migrations/functions/backfill/app/tables.js +0 -37
  318. package/dist/migrations/functions/backfill/app.js +0 -176
  319. package/dist/migrations/functions/backfill/global/configs.js +0 -67
  320. package/dist/migrations/functions/backfill/global/quotas.js +0 -60
  321. package/dist/migrations/functions/backfill/global/users.js +0 -50
  322. package/dist/migrations/functions/backfill/global.js +0 -205
  323. package/dist/migrations/functions/backfill/index.js +0 -32
  324. package/dist/migrations/functions/backfill/installation.js +0 -80
  325. package/dist/migrations/functions/syncQuotas.js +0 -52
  326. package/dist/migrations/functions/tableSettings.js +0 -130
  327. package/dist/migrations/functions/usageQuotas/index.js +0 -16
  328. package/dist/migrations/functions/usageQuotas/syncApps.js +0 -24
  329. package/dist/migrations/functions/usageQuotas/syncPlugins.js +0 -23
  330. package/dist/migrations/functions/usageQuotas/syncRows.js +0 -33
  331. package/dist/migrations/functions/usageQuotas/syncUsers.js +0 -21
  332. package/dist/migrations/functions/userEmailViewCasing.js +0 -24
  333. package/dist/migrations/index.js +0 -111
  334. package/dist/migrations/tests/helpers.js +0 -72
  335. package/dist/migrations/tests/structures.js +0 -37
  336. package/dist/sdk/app/applications/index.js +0 -28
  337. package/dist/sdk/app/applications/sync.js +0 -164
  338. package/dist/sdk/app/applications/utils.js +0 -21
  339. package/dist/sdk/app/automations/index.js +0 -29
  340. package/dist/sdk/app/automations/webhook.js +0 -54
  341. package/dist/sdk/app/backups/constants.js +0 -6
  342. package/dist/sdk/app/backups/exports.js +0 -160
  343. package/dist/sdk/app/backups/imports.js +0 -170
  344. package/dist/sdk/app/backups/index.js +0 -29
  345. package/dist/sdk/app/backups/statistics.js +0 -73
  346. package/dist/sdk/app/datasources/datasources.js +0 -173
  347. package/dist/sdk/app/datasources/index.js +0 -27
  348. package/dist/sdk/app/queries/index.js +0 -27
  349. package/dist/sdk/app/queries/queries.js +0 -60
  350. package/dist/sdk/app/rows/attachments.js +0 -61
  351. package/dist/sdk/app/rows/index.js +0 -28
  352. package/dist/sdk/app/rows/rows.js +0 -30
  353. package/dist/sdk/app/tables/index.js +0 -65
  354. package/dist/sdk/index.js +0 -27
  355. package/dist/sdk/plugins/index.js +0 -27
  356. package/dist/sdk/plugins/plugins.js +0 -53
  357. package/dist/sdk/users/index.js +0 -27
  358. package/dist/sdk/users/utils.js +0 -87
  359. package/dist/sdk/utils/index.js +0 -29
  360. package/dist/startup.js +0 -158
  361. package/dist/threads/automation.js +0 -450
  362. package/dist/threads/definitions.js +0 -2
  363. package/dist/threads/index.js +0 -140
  364. package/dist/threads/query.js +0 -265
  365. package/dist/threads/utils.js +0 -120
  366. package/dist/tsconfig.build.tsbuildinfo +0 -1
  367. package/dist/utilities/appDirectoryTemplate/package.json +0 -10
  368. package/dist/utilities/budibaseDir.js +0 -5
  369. package/dist/utilities/centralPath.js +0 -27
  370. package/dist/utilities/csv.js +0 -33
  371. package/dist/utilities/fileSystem/app.js +0 -88
  372. package/dist/utilities/fileSystem/clientLibrary.js +0 -138
  373. package/dist/utilities/fileSystem/filesystem.js +0 -180
  374. package/dist/utilities/fileSystem/index.js +0 -21
  375. package/dist/utilities/fileSystem/plugin.js +0 -76
  376. package/dist/utilities/fileSystem/processor.js +0 -34
  377. package/dist/utilities/fileSystem/template.js +0 -47
  378. package/dist/utilities/global.js +0 -149
  379. package/dist/utilities/index.js +0 -143
  380. package/dist/utilities/redis.js +0 -117
  381. package/dist/utilities/retry.js +0 -30
  382. package/dist/utilities/routing/index.js +0 -39
  383. package/dist/utilities/rowProcessor/index.js +0 -282
  384. package/dist/utilities/rowProcessor/map.js +0 -116
  385. package/dist/utilities/rowProcessor/utils.js +0 -87
  386. package/dist/utilities/schema.js +0 -112
  387. package/dist/utilities/scriptRunner.js +0 -26
  388. package/dist/utilities/security.js +0 -57
  389. package/dist/utilities/statusCodes.js +0 -9
  390. package/dist/utilities/usageQuota/rows.js +0 -88
  391. package/dist/utilities/usageQuota/usageQuoteReset.js +0 -16
  392. package/dist/utilities/users.js +0 -57
  393. package/dist/utilities/workerRequests.js +0 -171
  394. package/dist/watch.js +0 -53
  395. package/dist/websockets/client.js +0 -14
  396. package/dist/websockets/grid.js +0 -60
  397. package/dist/websockets/index.js +0 -17
  398. package/dist/websockets/websocket.js +0 -78
  399. /package/dist/{api/controllers/static/templates/BudibaseApp.svelte → BudibaseApp-Y5NZEDTC.svelte} +0 -0
  400. /package/dist/{api/controllers/static/templates/app.hbs → app.hbs} +0 -0
  401. /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.30",
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.30",
50
+ "@budibase/client": "2.6.19-alpha.30",
51
+ "@budibase/pro": "2.6.19-alpha.30",
52
+ "@budibase/shared-core": "2.6.19-alpha.30",
53
+ "@budibase/string-templates": "2.6.19-alpha.30",
54
+ "@budibase/types": "2.6.19-alpha.30",
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",
@@ -99,6 +101,7 @@
99
101
  "mysql2": "2.3.3",
100
102
  "node-fetch": "2.6.7",
101
103
  "open": "8.4.0",
104
+ "openai": "^3.2.1",
102
105
  "pg": "8.10.0",
103
106
  "posthog-node": "1.3.0",
104
107
  "pouchdb": "7.3.0",
@@ -177,5 +180,20 @@
177
180
  "optionalDependencies": {
178
181
  "oracledb": "5.3.0"
179
182
  },
180
- "gitHead": "9a3ddfba7931018031a3160c4972119a8bf4a0ac"
183
+ "nx": {
184
+ "targets": {
185
+ "test": {
186
+ "dependsOn": [
187
+ {
188
+ "projects": [
189
+ "@budibase/string-templates",
190
+ "@budibase/shared-core"
191
+ ],
192
+ "target": "build"
193
+ }
194
+ ]
195
+ }
196
+ }
197
+ },
198
+ "gitHead": "c62ae2d9ea7f29de54c4cb6ef9a8f22e82eb8460"
181
199
  }
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
  })