@budibase/server 2.6.19-alpha.2 → 2.6.19-alpha.20

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 (358) hide show
  1. package/.dockerignore +7 -6
  2. package/Dockerfile +16 -8
  3. package/builder/assets/{index.07382a47.css → index.46d94ca7.css} +2 -2
  4. package/builder/assets/{index.6c1171e2.js → index.9a9bace2.js} +346 -338
  5. package/builder/index.html +2 -2
  6. package/client/manifest.json +5229 -0
  7. package/dist/automation.js +32208 -0
  8. package/dist/automation.js.map +7 -0
  9. package/dist/index.js +44381 -13
  10. package/dist/index.js.map +7 -0
  11. package/dist/query.js +24327 -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 +30 -13
  16. package/pm2.config.js +1 -1
  17. package/scripts/build.js +48 -0
  18. package/src/api/controllers/datasource.ts +16 -0
  19. package/src/api/controllers/row/internal.ts +1 -1
  20. package/src/api/controllers/static/index.ts +3 -3
  21. package/src/api/controllers/table/internal.ts +2 -6
  22. package/src/api/controllers/table/utils.ts +32 -1
  23. package/src/api/routes/datasource.ts +5 -0
  24. package/src/api/routes/static.ts +3 -1
  25. package/src/api/routes/tests/datasource.spec.ts +1 -1
  26. package/src/automations/actions.ts +5 -0
  27. package/src/automations/steps/openai.ts +105 -0
  28. package/src/automations/tests/openai.spec.ts +86 -0
  29. package/src/constants/index.ts +17 -16
  30. package/src/db/inMemoryView.ts +1 -0
  31. package/src/environment.ts +2 -0
  32. package/src/integration-test/postgres.spec.ts +47 -4
  33. package/src/integrations/airtable.ts +3 -1
  34. package/src/integrations/arangodb.ts +3 -1
  35. package/src/integrations/base/sqlTable.ts +0 -1
  36. package/src/integrations/couchdb.ts +3 -1
  37. package/src/integrations/dynamodb.ts +3 -1
  38. package/src/integrations/elasticsearch.ts +3 -1
  39. package/src/integrations/firebase.ts +3 -1
  40. package/src/integrations/googlesheets.ts +11 -3
  41. package/src/integrations/microsoftSqlServer.ts +18 -2
  42. package/src/integrations/mongodb.ts +3 -1
  43. package/src/integrations/mysql.ts +27 -11
  44. package/src/integrations/oracle.ts +11 -1
  45. package/src/integrations/postgres.ts +27 -10
  46. package/src/integrations/redis.ts +3 -1
  47. package/src/integrations/s3.ts +3 -1
  48. package/src/integrations/snowflake.ts +3 -1
  49. package/src/integrations/tests/googlesheets.spec.ts +41 -9
  50. package/src/utilities/fileSystem/app.ts +1 -1
  51. package/src/utilities/fileSystem/clientLibrary.ts +8 -3
  52. package/src/utilities/fileSystem/filesystem.ts +3 -1
  53. package/tsconfig.build.json +9 -1
  54. package/tsconfig.json +1 -14
  55. package/dist/api/controllers/analytics.js +0 -46
  56. package/dist/api/controllers/apikeys.js +0 -72
  57. package/dist/api/controllers/application.js +0 -574
  58. package/dist/api/controllers/auth.js +0 -80
  59. package/dist/api/controllers/automation.js +0 -303
  60. package/dist/api/controllers/backup.js +0 -37
  61. package/dist/api/controllers/component.js +0 -59
  62. package/dist/api/controllers/datasource.js +0 -337
  63. package/dist/api/controllers/deploy/Deployment.js +0 -53
  64. package/dist/api/controllers/deploy/index.js +0 -198
  65. package/dist/api/controllers/dev.js +0 -146
  66. package/dist/api/controllers/integration.js +0 -28
  67. package/dist/api/controllers/layout.js +0 -49
  68. package/dist/api/controllers/metadata.js +0 -63
  69. package/dist/api/controllers/migrations.js +0 -29
  70. package/dist/api/controllers/ops.js +0 -40
  71. package/dist/api/controllers/permission.js +0 -162
  72. package/dist/api/controllers/plugin/file.js +0 -24
  73. package/dist/api/controllers/plugin/github.js +0 -69
  74. package/dist/api/controllers/plugin/index.js +0 -112
  75. package/dist/api/controllers/plugin/npm.js +0 -58
  76. package/dist/api/controllers/plugin/uploaders.js +0 -11
  77. package/dist/api/controllers/plugin/url.js +0 -24
  78. package/dist/api/controllers/plugin/utils.js +0 -27
  79. package/dist/api/controllers/public/applications.js +0 -146
  80. package/dist/api/controllers/public/mapping/applications.js +0 -29
  81. package/dist/api/controllers/public/mapping/index.js +0 -11
  82. package/dist/api/controllers/public/mapping/queries.js +0 -36
  83. package/dist/api/controllers/public/mapping/rows.js +0 -24
  84. package/dist/api/controllers/public/mapping/tables.js +0 -23
  85. package/dist/api/controllers/public/mapping/types.js +0 -2
  86. package/dist/api/controllers/public/mapping/users.js +0 -29
  87. package/dist/api/controllers/public/metrics.js +0 -113
  88. package/dist/api/controllers/public/queries.js +0 -58
  89. package/dist/api/controllers/public/rows.js +0 -120
  90. package/dist/api/controllers/public/tables.js +0 -95
  91. package/dist/api/controllers/public/users.js +0 -93
  92. package/dist/api/controllers/public/utils.js +0 -56
  93. package/dist/api/controllers/query/import/index.js +0 -87
  94. package/dist/api/controllers/query/import/sources/base/index.js +0 -75
  95. package/dist/api/controllers/query/import/sources/base/openapi.js +0 -42
  96. package/dist/api/controllers/query/import/sources/curl.js +0 -99
  97. package/dist/api/controllers/query/import/sources/openapi2.js +0 -145
  98. package/dist/api/controllers/query/import/sources/openapi3.js +0 -177
  99. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +0 -253
  100. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +0 -1054
  101. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +0 -253
  102. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +0 -1225
  103. package/dist/api/controllers/query/index.js +0 -299
  104. package/dist/api/controllers/query/validation.js +0 -53
  105. package/dist/api/controllers/role.js +0 -109
  106. package/dist/api/controllers/routing.js +0 -105
  107. package/dist/api/controllers/row/ExternalRequest.js +0 -683
  108. package/dist/api/controllers/row/external.js +0 -339
  109. package/dist/api/controllers/row/index.js +0 -203
  110. package/dist/api/controllers/row/internal.js +0 -509
  111. package/dist/api/controllers/row/internalSearch.js +0 -28
  112. package/dist/api/controllers/row/staticFormula.js +0 -165
  113. package/dist/api/controllers/row/utils.js +0 -183
  114. package/dist/api/controllers/screen.js +0 -110
  115. package/dist/api/controllers/script.js +0 -30
  116. package/dist/api/controllers/static/index.js +0 -268
  117. package/dist/api/controllers/table/bulkFormula.js +0 -173
  118. package/dist/api/controllers/table/external.js +0 -279
  119. package/dist/api/controllers/table/index.js +0 -179
  120. package/dist/api/controllers/table/internal.js +0 -197
  121. package/dist/api/controllers/table/utils.js +0 -379
  122. package/dist/api/controllers/templates.js +0 -56
  123. package/dist/api/controllers/user.js +0 -124
  124. package/dist/api/controllers/view/exporters.js +0 -46
  125. package/dist/api/controllers/view/index.js +0 -193
  126. package/dist/api/controllers/view/utils.js +0 -177
  127. package/dist/api/controllers/view/viewBuilder.js +0 -158
  128. package/dist/api/controllers/webhook.js +0 -134
  129. package/dist/api/index.js +0 -55
  130. package/dist/api/routes/analytics.js +0 -34
  131. package/dist/api/routes/apikeys.js +0 -37
  132. package/dist/api/routes/application.js +0 -48
  133. package/dist/api/routes/auth.js +0 -33
  134. package/dist/api/routes/automation.js +0 -50
  135. package/dist/api/routes/backup.js +0 -35
  136. package/dist/api/routes/component.js +0 -35
  137. package/dist/api/routes/datasource.js +0 -44
  138. package/dist/api/routes/deploy.js +0 -37
  139. package/dist/api/routes/dev.js +0 -49
  140. package/dist/api/routes/index.js +0 -75
  141. package/dist/api/routes/integration.js +0 -37
  142. package/dist/api/routes/layout.js +0 -37
  143. package/dist/api/routes/metadata.js +0 -40
  144. package/dist/api/routes/migrations.js +0 -36
  145. package/dist/api/routes/ops.js +0 -52
  146. package/dist/api/routes/permission.js +0 -44
  147. package/dist/api/routes/plugin.js +0 -39
  148. package/dist/api/routes/public/applications.js +0 -174
  149. package/dist/api/routes/public/index.js +0 -140
  150. package/dist/api/routes/public/metrics.js +0 -30
  151. package/dist/api/routes/public/middleware/mapper.js +0 -97
  152. package/dist/api/routes/public/queries.js +0 -72
  153. package/dist/api/routes/public/rows.js +0 -158
  154. package/dist/api/routes/public/tables.js +0 -152
  155. package/dist/api/routes/public/users.js +0 -135
  156. package/dist/api/routes/public/utils/Endpoint.js +0 -36
  157. package/dist/api/routes/query.js +0 -47
  158. package/dist/api/routes/role.js +0 -40
  159. package/dist/api/routes/routing.js +0 -39
  160. package/dist/api/routes/row.js +0 -239
  161. package/dist/api/routes/screen.js +0 -39
  162. package/dist/api/routes/script.js +0 -35
  163. package/dist/api/routes/static.js +0 -80
  164. package/dist/api/routes/table.js +0 -163
  165. package/dist/api/routes/templates.js +0 -37
  166. package/dist/api/routes/user.js +0 -43
  167. package/dist/api/routes/utils/validators.js +0 -238
  168. package/dist/api/routes/view.js +0 -42
  169. package/dist/api/routes/webhook.js +0 -43
  170. package/dist/app.js +0 -132
  171. package/dist/automations/actions.js +0 -137
  172. package/dist/automations/automationUtils.js +0 -173
  173. package/dist/automations/bullboard.js +0 -71
  174. package/dist/automations/index.js +0 -43
  175. package/dist/automations/logging/index.js +0 -53
  176. package/dist/automations/steps/bash.js +0 -111
  177. package/dist/automations/steps/createRow.js +0 -108
  178. package/dist/automations/steps/delay.js +0 -53
  179. package/dist/automations/steps/deleteRow.js +0 -96
  180. package/dist/automations/steps/discord.js +0 -116
  181. package/dist/automations/steps/executeQuery.js +0 -134
  182. package/dist/automations/steps/executeScript.js +0 -106
  183. package/dist/automations/steps/filter.js +0 -112
  184. package/dist/automations/steps/loop.js +0 -54
  185. package/dist/automations/steps/make.js +0 -134
  186. package/dist/automations/steps/outgoingWebhook.js +0 -166
  187. package/dist/automations/steps/queryRows.js +0 -216
  188. package/dist/automations/steps/sendSmtpEmail.js +0 -115
  189. package/dist/automations/steps/serverLog.js +0 -65
  190. package/dist/automations/steps/slack.js +0 -98
  191. package/dist/automations/steps/updateRow.js +0 -144
  192. package/dist/automations/steps/utils.js +0 -56
  193. package/dist/automations/steps/zapier.js +0 -130
  194. package/dist/automations/triggerInfo/app.js +0 -36
  195. package/dist/automations/triggerInfo/cron.js +0 -35
  196. package/dist/automations/triggerInfo/index.js +0 -40
  197. package/dist/automations/triggerInfo/rowDeleted.js +0 -36
  198. package/dist/automations/triggerInfo/rowSaved.js +0 -44
  199. package/dist/automations/triggerInfo/rowUpdated.js +0 -44
  200. package/dist/automations/triggerInfo/webhook.js +0 -40
  201. package/dist/automations/triggers.js +0 -181
  202. package/dist/automations/utils.js +0 -275
  203. package/dist/constants/definitions.js +0 -2
  204. package/dist/constants/index.js +0 -181
  205. package/dist/constants/layouts.js +0 -148
  206. package/dist/constants/screens.js +0 -51
  207. package/dist/db/defaultData/datasource_bb_default.js +0 -574
  208. package/dist/db/defaultData/employeeImport.js +0 -155
  209. package/dist/db/defaultData/expensesImport.js +0 -117
  210. package/dist/db/defaultData/inventoryImport.js +0 -109
  211. package/dist/db/defaultData/jobsImport.js +0 -152
  212. package/dist/db/dynamoClient.js +0 -124
  213. package/dist/db/inMemoryView.js +0 -62
  214. package/dist/db/index.js +0 -43
  215. package/dist/db/linkedRows/LinkController.js +0 -392
  216. package/dist/db/linkedRows/LinkDocument.js +0 -33
  217. package/dist/db/linkedRows/index.js +0 -206
  218. package/dist/db/linkedRows/linkUtils.js +0 -131
  219. package/dist/db/newid.js +0 -7
  220. package/dist/db/utils.js +0 -248
  221. package/dist/db/views/staticViews.js +0 -144
  222. package/dist/ddApm.js +0 -11
  223. package/dist/definitions/automations.js +0 -8
  224. package/dist/definitions/common.js +0 -2
  225. package/dist/definitions/datasource.js +0 -7
  226. package/dist/definitions/openapi.js +0 -6
  227. package/dist/environment.js +0 -109
  228. package/dist/events/AutomationEmitter.js +0 -53
  229. package/dist/events/BudibaseEmitter.js +0 -25
  230. package/dist/events/docUpdates/index.js +0 -17
  231. package/dist/events/docUpdates/processors.js +0 -18
  232. package/dist/events/docUpdates/syncUsers.js +0 -49
  233. package/dist/events/index.js +0 -11
  234. package/dist/events/utils.js +0 -43
  235. package/dist/integrations/airtable.js +0 -173
  236. package/dist/integrations/arangodb.js +0 -119
  237. package/dist/integrations/base/query.js +0 -32
  238. package/dist/integrations/base/sql.js +0 -600
  239. package/dist/integrations/base/sqlTable.js +0 -167
  240. package/dist/integrations/base/types.js +0 -2
  241. package/dist/integrations/couchdb.js +0 -140
  242. package/dist/integrations/dynamodb.js +0 -210
  243. package/dist/integrations/elasticsearch.js +0 -201
  244. package/dist/integrations/firebase.js +0 -189
  245. package/dist/integrations/googlesheets.js +0 -484
  246. package/dist/integrations/index.js +0 -138
  247. package/dist/integrations/microsoftSqlServer.js +0 -289
  248. package/dist/integrations/mongodb.js +0 -630
  249. package/dist/integrations/mysql.js +0 -272
  250. package/dist/integrations/oracle.js +0 -404
  251. package/dist/integrations/postgres.js +0 -319
  252. package/dist/integrations/queries/sql.js +0 -84
  253. package/dist/integrations/redis.js +0 -187
  254. package/dist/integrations/rest.js +0 -400
  255. package/dist/integrations/s3.js +0 -256
  256. package/dist/integrations/snowflake.js +0 -114
  257. package/dist/integrations/utils.js +0 -295
  258. package/dist/middleware/appInfo.js +0 -22
  259. package/dist/middleware/authorized.js +0 -112
  260. package/dist/middleware/builder.js +0 -93
  261. package/dist/middleware/currentapp.js +0 -103
  262. package/dist/middleware/joi-validator.js +0 -43
  263. package/dist/middleware/publicApi.js +0 -25
  264. package/dist/middleware/resourceId.js +0 -59
  265. package/dist/middleware/selfhost.js +0 -24
  266. package/dist/middleware/utils.js +0 -8
  267. package/dist/migrations/functions/appUrls.js +0 -42
  268. package/dist/migrations/functions/backfill/app/automations.js +0 -31
  269. package/dist/migrations/functions/backfill/app/datasources.js +0 -28
  270. package/dist/migrations/functions/backfill/app/layouts.js +0 -33
  271. package/dist/migrations/functions/backfill/app/queries.js +0 -49
  272. package/dist/migrations/functions/backfill/app/roles.js +0 -28
  273. package/dist/migrations/functions/backfill/app/screens.js +0 -28
  274. package/dist/migrations/functions/backfill/app/tables.js +0 -37
  275. package/dist/migrations/functions/backfill/app.js +0 -176
  276. package/dist/migrations/functions/backfill/global/configs.js +0 -67
  277. package/dist/migrations/functions/backfill/global/quotas.js +0 -60
  278. package/dist/migrations/functions/backfill/global/users.js +0 -50
  279. package/dist/migrations/functions/backfill/global.js +0 -205
  280. package/dist/migrations/functions/backfill/index.js +0 -32
  281. package/dist/migrations/functions/backfill/installation.js +0 -80
  282. package/dist/migrations/functions/syncQuotas.js +0 -52
  283. package/dist/migrations/functions/tableSettings.js +0 -130
  284. package/dist/migrations/functions/usageQuotas/index.js +0 -16
  285. package/dist/migrations/functions/usageQuotas/syncApps.js +0 -24
  286. package/dist/migrations/functions/usageQuotas/syncPlugins.js +0 -23
  287. package/dist/migrations/functions/usageQuotas/syncRows.js +0 -33
  288. package/dist/migrations/functions/usageQuotas/syncUsers.js +0 -21
  289. package/dist/migrations/functions/userEmailViewCasing.js +0 -24
  290. package/dist/migrations/index.js +0 -111
  291. package/dist/migrations/tests/helpers.js +0 -72
  292. package/dist/migrations/tests/structures.js +0 -37
  293. package/dist/sdk/app/applications/index.js +0 -28
  294. package/dist/sdk/app/applications/sync.js +0 -164
  295. package/dist/sdk/app/applications/utils.js +0 -21
  296. package/dist/sdk/app/automations/index.js +0 -29
  297. package/dist/sdk/app/automations/webhook.js +0 -54
  298. package/dist/sdk/app/backups/constants.js +0 -6
  299. package/dist/sdk/app/backups/exports.js +0 -160
  300. package/dist/sdk/app/backups/imports.js +0 -170
  301. package/dist/sdk/app/backups/index.js +0 -29
  302. package/dist/sdk/app/backups/statistics.js +0 -73
  303. package/dist/sdk/app/datasources/datasources.js +0 -173
  304. package/dist/sdk/app/datasources/index.js +0 -27
  305. package/dist/sdk/app/queries/index.js +0 -27
  306. package/dist/sdk/app/queries/queries.js +0 -60
  307. package/dist/sdk/app/rows/attachments.js +0 -61
  308. package/dist/sdk/app/rows/index.js +0 -28
  309. package/dist/sdk/app/rows/rows.js +0 -30
  310. package/dist/sdk/app/tables/index.js +0 -65
  311. package/dist/sdk/index.js +0 -27
  312. package/dist/sdk/plugins/index.js +0 -27
  313. package/dist/sdk/plugins/plugins.js +0 -53
  314. package/dist/sdk/users/index.js +0 -27
  315. package/dist/sdk/users/utils.js +0 -87
  316. package/dist/sdk/utils/index.js +0 -29
  317. package/dist/startup.js +0 -158
  318. package/dist/threads/automation.js +0 -450
  319. package/dist/threads/definitions.js +0 -2
  320. package/dist/threads/index.js +0 -140
  321. package/dist/threads/query.js +0 -265
  322. package/dist/threads/utils.js +0 -120
  323. package/dist/tsconfig.build.tsbuildinfo +0 -1
  324. package/dist/utilities/appDirectoryTemplate/package.json +0 -10
  325. package/dist/utilities/budibaseDir.js +0 -5
  326. package/dist/utilities/centralPath.js +0 -27
  327. package/dist/utilities/csv.js +0 -33
  328. package/dist/utilities/fileSystem/app.js +0 -88
  329. package/dist/utilities/fileSystem/clientLibrary.js +0 -138
  330. package/dist/utilities/fileSystem/filesystem.js +0 -180
  331. package/dist/utilities/fileSystem/index.js +0 -21
  332. package/dist/utilities/fileSystem/plugin.js +0 -76
  333. package/dist/utilities/fileSystem/processor.js +0 -34
  334. package/dist/utilities/fileSystem/template.js +0 -47
  335. package/dist/utilities/global.js +0 -149
  336. package/dist/utilities/index.js +0 -143
  337. package/dist/utilities/redis.js +0 -117
  338. package/dist/utilities/retry.js +0 -30
  339. package/dist/utilities/routing/index.js +0 -39
  340. package/dist/utilities/rowProcessor/index.js +0 -282
  341. package/dist/utilities/rowProcessor/map.js +0 -116
  342. package/dist/utilities/rowProcessor/utils.js +0 -87
  343. package/dist/utilities/schema.js +0 -112
  344. package/dist/utilities/scriptRunner.js +0 -26
  345. package/dist/utilities/security.js +0 -57
  346. package/dist/utilities/statusCodes.js +0 -9
  347. package/dist/utilities/usageQuota/rows.js +0 -88
  348. package/dist/utilities/usageQuota/usageQuoteReset.js +0 -16
  349. package/dist/utilities/users.js +0 -57
  350. package/dist/utilities/workerRequests.js +0 -171
  351. package/dist/watch.js +0 -53
  352. package/dist/websockets/client.js +0 -14
  353. package/dist/websockets/grid.js +0 -60
  354. package/dist/websockets/index.js +0 -17
  355. package/dist/websockets/websocket.js +0 -78
  356. /package/dist/{api/controllers/static/templates/BudibaseApp.svelte → BudibaseApp-Y5NZEDTC.svelte} +0 -0
  357. /package/dist/{api/controllers/static/templates/app.hbs → app.hbs} +0 -0
  358. /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.2",
4
+ "version": "2.6.19-alpha.20",
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.2",
49
- "@budibase/client": "2.6.19-alpha.2",
50
- "@budibase/pro": "2.6.19-alpha.2",
51
- "@budibase/shared-core": "2.6.19-alpha.2",
52
- "@budibase/string-templates": "2.6.19-alpha.2",
53
- "@budibase/types": "2.6.19-alpha.2",
49
+ "@budibase/backend-core": "2.6.19-alpha.20",
50
+ "@budibase/client": "2.6.19-alpha.20",
51
+ "@budibase/pro": "2.6.19-alpha.20",
52
+ "@budibase/shared-core": "2.6.19-alpha.20",
53
+ "@budibase/string-templates": "2.6.19-alpha.20",
54
+ "@budibase/types": "2.6.19-alpha.20",
54
55
  "@bull-board/api": "3.7.0",
55
56
  "@bull-board/koa": "3.9.4",
56
57
  "@elastic/elasticsearch": "7.10.0",
@@ -99,6 +100,7 @@
99
100
  "mysql2": "2.3.3",
100
101
  "node-fetch": "2.6.7",
101
102
  "open": "8.4.0",
103
+ "openai": "^3.2.1",
102
104
  "pg": "8.10.0",
103
105
  "posthog-node": "1.3.0",
104
106
  "pouchdb": "7.3.0",
@@ -177,5 +179,20 @@
177
179
  "optionalDependencies": {
178
180
  "oracledb": "5.3.0"
179
181
  },
180
- "gitHead": "62e6959d05c2e64f53bb4090b8f714937907efa5"
182
+ "nx": {
183
+ "targets": {
184
+ "test": {
185
+ "dependsOn": [
186
+ {
187
+ "projects": [
188
+ "@budibase/string-templates",
189
+ "@budibase/shared-core"
190
+ ],
191
+ "target": "build"
192
+ }
193
+ ]
194
+ }
195
+ }
196
+ },
197
+ "gitHead": "e0ce62b070777faabb21fb1932d5fc56dd6979cd"
181
198
  }
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
+ }
@@ -21,6 +21,7 @@ import {
21
21
  CreateDatasourceRequest,
22
22
  VerifyDatasourceRequest,
23
23
  VerifyDatasourceResponse,
24
+ FetchDatasourceInfoResponse,
24
25
  IntegrationBase,
25
26
  DatasourcePlus,
26
27
  } from "@budibase/types"
@@ -153,6 +154,21 @@ export async function verify(
153
154
  }
154
155
  }
155
156
 
157
+ export async function information(
158
+ ctx: UserCtx<void, FetchDatasourceInfoResponse>
159
+ ) {
160
+ const datasourceId = ctx.params.datasourceId
161
+ const datasource = await sdk.datasources.get(datasourceId, { enriched: true })
162
+ const connector = (await getConnector(datasource)) as DatasourcePlus
163
+ if (!connector.getTableNames) {
164
+ ctx.throw(400, "Table name fetching not supported by datasource")
165
+ }
166
+ const tableNames = await connector.getTableNames()
167
+ ctx.body = {
168
+ tableNames,
169
+ }
170
+ }
171
+
156
172
  export async function buildSchemaFromDb(ctx: UserCtx) {
157
173
  const db = context.getAppDB()
158
174
  const datasource = await sdk.datasources.get(ctx.params.datasourceId)
@@ -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
 
@@ -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
  })
@@ -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
  })
@@ -20,6 +20,11 @@ router
20
20
  authorized(permissions.BUILDER),
21
21
  datasourceController.verify
22
22
  )
23
+ .get(
24
+ "/api/datasources/:datasourceId/info",
25
+ authorized(permissions.BUILDER),
26
+ datasourceController.information
27
+ )
23
28
  .get(
24
29
  "/api/datasources/:datasourceId",
25
30
  authorized(
@@ -5,6 +5,7 @@ import authorized from "../../middleware/authorized"
5
5
  import { permissions } from "@budibase/backend-core"
6
6
  import env from "../../environment"
7
7
  import { paramResource } from "../../middleware/resourceId"
8
+ import { devClientLibPath } from "../../utilities/fileSystem"
8
9
  const { BUILDER, PermissionType, PermissionLevel } = permissions
9
10
 
10
11
  const router: Router = new Router()
@@ -17,7 +18,8 @@ router.param("file", async (file: any, ctx: any, next: any) => {
17
18
  }
18
19
  // test serves from require
19
20
  if (env.isTest()) {
20
- ctx.devPath = require.resolve("@budibase/client").split(ctx.file)[0]
21
+ const path = devClientLibPath()
22
+ ctx.devPath = path.split(ctx.file)[0]
21
23
  } else if (env.isDev()) {
22
24
  // Serving the client library from your local dir in dev
23
25
  ctx.devPath = budibaseTempDir()
@@ -87,7 +87,7 @@ describe("/datasources", () => {
87
87
  expect(contents.rows.length).toEqual(1)
88
88
 
89
89
  // update the datasource to remove the variables
90
- datasource.config.dynamicVariables = []
90
+ datasource.config!.dynamicVariables = []
91
91
  const res = await request
92
92
  .put(`/api/datasources/${datasource._id}`)
93
93
  .send(datasource)
@@ -71,10 +71,15 @@ export const BUILTIN_ACTION_DEFINITIONS: Record<string, AutomationStepSchema> =
71
71
  // ran at all
72
72
  if (env.SELF_HOSTED) {
73
73
  const bash = require("./steps/bash")
74
+ const openai = require("./steps/openai")
75
+
74
76
  // @ts-ignore
75
77
  ACTION_IMPLS["EXECUTE_BASH"] = bash.run
76
78
  // @ts-ignore
77
79
  BUILTIN_ACTION_DEFINITIONS["EXECUTE_BASH"] = bash.definition
80
+
81
+ ACTION_IMPLS.OPENAI = openai.run
82
+ BUILTIN_ACTION_DEFINITIONS.OPENAI = openai.definition
78
83
  }
79
84
 
80
85
  export async function getActionDefinitions() {
@@ -0,0 +1,105 @@
1
+ import { Configuration, OpenAIApi } from "openai"
2
+ import {
3
+ AutomationActionStepId,
4
+ AutomationStepSchema,
5
+ AutomationStepInput,
6
+ AutomationStepType,
7
+ AutomationIOType,
8
+ } from "@budibase/types"
9
+ import * as automationUtils from "../automationUtils"
10
+ import environment from "../../environment"
11
+
12
+ enum Model {
13
+ GPT_35_TURBO = "gpt-3.5-turbo",
14
+ // will only work with api keys that have access to the GPT4 API
15
+ GPT_4 = "gpt-4",
16
+ }
17
+
18
+ export const definition: AutomationStepSchema = {
19
+ name: "OpenAI",
20
+ tagline: "Send prompts to ChatGPT",
21
+ icon: "Algorithm",
22
+ description: "Interact with the OpenAI ChatGPT API.",
23
+ type: AutomationStepType.ACTION,
24
+ internal: true,
25
+ stepId: AutomationActionStepId.OPENAI,
26
+ inputs: {
27
+ prompt: "",
28
+ },
29
+ schema: {
30
+ inputs: {
31
+ properties: {
32
+ prompt: {
33
+ type: AutomationIOType.STRING,
34
+ title: "Prompt",
35
+ },
36
+ model: {
37
+ type: AutomationIOType.STRING,
38
+ title: "Model",
39
+ enum: Object.values(Model),
40
+ },
41
+ },
42
+ required: ["prompt", "model"],
43
+ },
44
+ outputs: {
45
+ properties: {
46
+ success: {
47
+ type: AutomationIOType.BOOLEAN,
48
+ description: "Whether the action was successful",
49
+ },
50
+ response: {
51
+ type: AutomationIOType.STRING,
52
+ description: "What was output",
53
+ },
54
+ },
55
+ required: ["success", "response"],
56
+ },
57
+ },
58
+ }
59
+
60
+ export async function run({ inputs, context }: AutomationStepInput) {
61
+ if (!environment.OPENAI_API_KEY) {
62
+ return {
63
+ success: false,
64
+ response:
65
+ "OpenAI API Key not configured - please add the OPENAI_API_KEY environment variable.",
66
+ }
67
+ }
68
+
69
+ if (inputs.prompt == null) {
70
+ return {
71
+ success: false,
72
+ response: "Budibase OpenAI Automation Failed: No prompt supplied",
73
+ }
74
+ }
75
+
76
+ try {
77
+ const configuration = new Configuration({
78
+ apiKey: environment.OPENAI_API_KEY,
79
+ })
80
+
81
+ const openai = new OpenAIApi(configuration)
82
+
83
+ const completion = await openai.createChatCompletion({
84
+ model: inputs.model,
85
+ messages: [
86
+ {
87
+ role: "user",
88
+ content: inputs.prompt,
89
+ },
90
+ ],
91
+ })
92
+
93
+ const response = completion?.data?.choices[0]?.message?.content
94
+
95
+ return {
96
+ response,
97
+ success: true,
98
+ }
99
+ } catch (err) {
100
+ return {
101
+ success: false,
102
+ response: automationUtils.getError(err),
103
+ }
104
+ }
105
+ }
@@ -0,0 +1,86 @@
1
+ const setup = require("./utilities")
2
+ import environment from "../../environment"
3
+ import openai from "openai"
4
+
5
+ jest.mock(
6
+ "openai",
7
+ jest.fn(() => ({
8
+ Configuration: jest.fn(),
9
+ OpenAIApi: jest.fn(() => ({
10
+ createChatCompletion: jest.fn(() => ({
11
+ data: {
12
+ choices: [
13
+ {
14
+ message: {
15
+ content: "This is a test",
16
+ },
17
+ },
18
+ ],
19
+ },
20
+ })),
21
+ })),
22
+ }))
23
+ )
24
+
25
+ const OPENAI_PROMPT = "What is the meaning of life?"
26
+
27
+ describe("test the openai action", () => {
28
+ let config = setup.getConfig()
29
+
30
+ beforeAll(async () => {
31
+ await config.init()
32
+ })
33
+
34
+ beforeEach(() => {
35
+ environment.OPENAI_API_KEY = "abc123"
36
+ })
37
+
38
+ afterAll(setup.afterAll)
39
+
40
+ it("should present the correct error message when the OPENAI_API_KEY variable isn't set", async () => {
41
+ delete environment.OPENAI_API_KEY
42
+
43
+ let res = await setup.runStep("OPENAI", {
44
+ prompt: OPENAI_PROMPT,
45
+ })
46
+ expect(res.response).toEqual(
47
+ "OpenAI API Key not configured - please add the OPENAI_API_KEY environment variable."
48
+ )
49
+ expect(res.success).toBeFalsy()
50
+ })
51
+
52
+ it("should be able to receive a response from ChatGPT given a prompt", async () => {
53
+ const res = await setup.runStep("OPENAI", {
54
+ prompt: OPENAI_PROMPT,
55
+ })
56
+ expect(res.response).toEqual("This is a test")
57
+ expect(res.success).toBeTruthy()
58
+ })
59
+
60
+ it("should present the correct error message when a prompt is not provided", async () => {
61
+ const res = await setup.runStep("OPENAI", {
62
+ prompt: null,
63
+ })
64
+ expect(res.response).toEqual(
65
+ "Budibase OpenAI Automation Failed: No prompt supplied"
66
+ )
67
+ expect(res.success).toBeFalsy()
68
+ })
69
+
70
+ it("should present the correct error message when an error is thrown from the createChatCompletion call", async () => {
71
+ openai.OpenAIApi.mockImplementation(() => ({
72
+ createChatCompletion: jest.fn(() => {
73
+ throw new Error("An error occurred while calling createChatCompletion")
74
+ }),
75
+ }))
76
+
77
+ const res = await setup.runStep("OPENAI", {
78
+ prompt: OPENAI_PROMPT,
79
+ })
80
+
81
+ expect(res.response).toEqual(
82
+ "Error: An error occurred while calling createChatCompletion"
83
+ )
84
+ expect(res.success).toBeFalsy()
85
+ })
86
+ })
@@ -1,4 +1,5 @@
1
1
  import { objectStore, roles, constants } from "@budibase/backend-core"
2
+ import { FieldType as FieldTypes } from "@budibase/types"
2
3
  export { FieldType as FieldTypes, RelationshipTypes } from "@budibase/types"
3
4
 
4
5
  export enum FilterTypes {
@@ -24,14 +25,14 @@ export const NoEmptyFilterStrings = [
24
25
  ]
25
26
 
26
27
  export const CanSwitchTypes = [
27
- [exports.FieldTypes.JSON, exports.FieldTypes.ARRAY],
28
+ [FieldTypes.JSON, FieldTypes.ARRAY],
28
29
  [
29
- exports.FieldTypes.STRING,
30
- exports.FieldTypes.OPTIONS,
31
- exports.FieldTypes.LONGFORM,
32
- exports.FieldTypes.BARCODEQR,
30
+ FieldTypes.STRING,
31
+ FieldTypes.OPTIONS,
32
+ FieldTypes.LONGFORM,
33
+ FieldTypes.BARCODEQR,
33
34
  ],
34
- [exports.FieldTypes.BOOLEAN, exports.FieldTypes.NUMBER],
35
+ [FieldTypes.BOOLEAN, FieldTypes.NUMBER],
35
36
  ]
36
37
 
37
38
  export const SwitchableTypes = CanSwitchTypes.reduce((prev, current) =>
@@ -77,9 +78,9 @@ export const USERS_TABLE_SCHEMA = {
77
78
  // TODO: ADMIN PANEL - when implemented this doesn't need to be carried out
78
79
  schema: {
79
80
  email: {
80
- type: exports.FieldTypes.STRING,
81
+ type: FieldTypes.STRING,
81
82
  constraints: {
82
- type: exports.FieldTypes.STRING,
83
+ type: FieldTypes.STRING,
83
84
  email: true,
84
85
  length: {
85
86
  maximum: "",
@@ -92,27 +93,27 @@ export const USERS_TABLE_SCHEMA = {
92
93
  firstName: {
93
94
  name: "firstName",
94
95
  fieldName: "firstName",
95
- type: exports.FieldTypes.STRING,
96
+ type: FieldTypes.STRING,
96
97
  constraints: {
97
- type: exports.FieldTypes.STRING,
98
+ type: FieldTypes.STRING,
98
99
  presence: false,
99
100
  },
100
101
  },
101
102
  lastName: {
102
103
  name: "lastName",
103
104
  fieldName: "lastName",
104
- type: exports.FieldTypes.STRING,
105
+ type: FieldTypes.STRING,
105
106
  constraints: {
106
- type: exports.FieldTypes.STRING,
107
+ type: FieldTypes.STRING,
107
108
  presence: false,
108
109
  },
109
110
  },
110
111
  roleId: {
111
112
  fieldName: "roleId",
112
113
  name: "roleId",
113
- type: exports.FieldTypes.OPTIONS,
114
+ type: FieldTypes.OPTIONS,
114
115
  constraints: {
115
- type: exports.FieldTypes.STRING,
116
+ type: FieldTypes.STRING,
116
117
  presence: false,
117
118
  inclusion: Object.values(roles.BUILTIN_ROLE_IDS),
118
119
  },
@@ -120,9 +121,9 @@ export const USERS_TABLE_SCHEMA = {
120
121
  status: {
121
122
  fieldName: "status",
122
123
  name: "status",
123
- type: exports.FieldTypes.OPTIONS,
124
+ type: FieldTypes.OPTIONS,
124
125
  constraints: {
125
- type: exports.FieldTypes.STRING,
126
+ type: FieldTypes.STRING,
126
127
  presence: false,
127
128
  inclusion: Object.values(constants.UserStatus),
128
129
  },
@@ -25,6 +25,7 @@ export async function runView(
25
25
  }))
26
26
  )
27
27
  let fn = (doc: Document, emit: any) => emit(doc._id)
28
+ // BUDI-7060 -> indirect eval call appears to cause issues in cloud
28
29
  eval("fn = " + view?.map?.replace("function (doc)", "function (doc, emit)"))
29
30
  const queryFns: any = {
30
31
  meta: view.meta,
@@ -71,6 +71,7 @@ const environment = {
71
71
  BB_ADMIN_USER_EMAIL: process.env.BB_ADMIN_USER_EMAIL,
72
72
  BB_ADMIN_USER_PASSWORD: process.env.BB_ADMIN_USER_PASSWORD,
73
73
  PLUGINS_DIR: process.env.PLUGINS_DIR || "/plugins",
74
+ OPENAI_API_KEY: process.env.OPENAI_API_KEY,
74
75
  // flags
75
76
  ALLOW_DEV_AUTOMATIONS: process.env.ALLOW_DEV_AUTOMATIONS,
76
77
  DISABLE_THREADING: process.env.DISABLE_THREADING,
@@ -96,6 +97,7 @@ const environment = {
96
97
  isInThread: () => {
97
98
  return process.env.FORKED_PROCESS
98
99
  },
100
+ TOP_LEVEL_PATH: process.env.TOP_LEVEL_PATH,
99
101
  }
100
102
 
101
103
  // threading can cause memory issues with node-ts in development