@budibase/server 2.6.19-alpha.1 → 2.6.19-alpha.10

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 (345) hide show
  1. package/.dockerignore +7 -6
  2. package/Dockerfile +16 -8
  3. package/builder/assets/{index.b9eeb2a8.js → index.7b26bbdb.js} +356 -348
  4. package/builder/assets/{index.07382a47.css → index.ec1c6a1a.css} +2 -2
  5. package/builder/index.html +2 -2
  6. package/client/manifest.json +5229 -0
  7. package/dist/automation.js +32190 -0
  8. package/dist/automation.js.map +7 -0
  9. package/dist/index.js +44342 -13
  10. package/dist/index.js.map +7 -0
  11. package/dist/query.js +24307 -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 +29 -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/static/index.ts +3 -3
  20. package/src/api/routes/datasource.ts +5 -0
  21. package/src/api/routes/static.ts +3 -1
  22. package/src/api/routes/tests/datasource.spec.ts +1 -1
  23. package/src/automations/actions.ts +5 -0
  24. package/src/automations/steps/openai.ts +105 -0
  25. package/src/automations/tests/openai.spec.ts +86 -0
  26. package/src/constants/index.ts +17 -16
  27. package/src/db/inMemoryView.ts +3 -1
  28. package/src/environment.ts +2 -0
  29. package/src/integration-test/postgres.spec.ts +47 -4
  30. package/src/integrations/base/sqlTable.ts +0 -1
  31. package/src/integrations/googlesheets.ts +11 -3
  32. package/src/integrations/microsoftSqlServer.ts +18 -2
  33. package/src/integrations/mysql.ts +27 -11
  34. package/src/integrations/oracle.ts +11 -1
  35. package/src/integrations/postgres.ts +27 -10
  36. package/src/integrations/tests/googlesheets.spec.ts +41 -9
  37. package/src/utilities/fileSystem/app.ts +1 -1
  38. package/src/utilities/fileSystem/clientLibrary.ts +8 -3
  39. package/src/utilities/fileSystem/filesystem.ts +3 -1
  40. package/tsconfig.build.json +9 -1
  41. package/tsconfig.json +1 -14
  42. package/dist/api/controllers/analytics.js +0 -46
  43. package/dist/api/controllers/apikeys.js +0 -72
  44. package/dist/api/controllers/application.js +0 -574
  45. package/dist/api/controllers/auth.js +0 -80
  46. package/dist/api/controllers/automation.js +0 -303
  47. package/dist/api/controllers/backup.js +0 -37
  48. package/dist/api/controllers/component.js +0 -59
  49. package/dist/api/controllers/datasource.js +0 -337
  50. package/dist/api/controllers/deploy/Deployment.js +0 -53
  51. package/dist/api/controllers/deploy/index.js +0 -198
  52. package/dist/api/controllers/dev.js +0 -146
  53. package/dist/api/controllers/integration.js +0 -28
  54. package/dist/api/controllers/layout.js +0 -49
  55. package/dist/api/controllers/metadata.js +0 -63
  56. package/dist/api/controllers/migrations.js +0 -29
  57. package/dist/api/controllers/ops.js +0 -40
  58. package/dist/api/controllers/permission.js +0 -162
  59. package/dist/api/controllers/plugin/file.js +0 -24
  60. package/dist/api/controllers/plugin/github.js +0 -69
  61. package/dist/api/controllers/plugin/index.js +0 -112
  62. package/dist/api/controllers/plugin/npm.js +0 -58
  63. package/dist/api/controllers/plugin/uploaders.js +0 -11
  64. package/dist/api/controllers/plugin/url.js +0 -24
  65. package/dist/api/controllers/plugin/utils.js +0 -27
  66. package/dist/api/controllers/public/applications.js +0 -146
  67. package/dist/api/controllers/public/mapping/applications.js +0 -29
  68. package/dist/api/controllers/public/mapping/index.js +0 -11
  69. package/dist/api/controllers/public/mapping/queries.js +0 -36
  70. package/dist/api/controllers/public/mapping/rows.js +0 -24
  71. package/dist/api/controllers/public/mapping/tables.js +0 -23
  72. package/dist/api/controllers/public/mapping/types.js +0 -2
  73. package/dist/api/controllers/public/mapping/users.js +0 -29
  74. package/dist/api/controllers/public/metrics.js +0 -113
  75. package/dist/api/controllers/public/queries.js +0 -58
  76. package/dist/api/controllers/public/rows.js +0 -120
  77. package/dist/api/controllers/public/tables.js +0 -95
  78. package/dist/api/controllers/public/users.js +0 -93
  79. package/dist/api/controllers/public/utils.js +0 -56
  80. package/dist/api/controllers/query/import/index.js +0 -87
  81. package/dist/api/controllers/query/import/sources/base/index.js +0 -75
  82. package/dist/api/controllers/query/import/sources/base/openapi.js +0 -42
  83. package/dist/api/controllers/query/import/sources/curl.js +0 -99
  84. package/dist/api/controllers/query/import/sources/openapi2.js +0 -145
  85. package/dist/api/controllers/query/import/sources/openapi3.js +0 -177
  86. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +0 -253
  87. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +0 -1054
  88. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +0 -253
  89. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +0 -1225
  90. package/dist/api/controllers/query/index.js +0 -299
  91. package/dist/api/controllers/query/validation.js +0 -53
  92. package/dist/api/controllers/role.js +0 -109
  93. package/dist/api/controllers/routing.js +0 -105
  94. package/dist/api/controllers/row/ExternalRequest.js +0 -683
  95. package/dist/api/controllers/row/external.js +0 -339
  96. package/dist/api/controllers/row/index.js +0 -203
  97. package/dist/api/controllers/row/internal.js +0 -509
  98. package/dist/api/controllers/row/internalSearch.js +0 -28
  99. package/dist/api/controllers/row/staticFormula.js +0 -165
  100. package/dist/api/controllers/row/utils.js +0 -183
  101. package/dist/api/controllers/screen.js +0 -110
  102. package/dist/api/controllers/script.js +0 -30
  103. package/dist/api/controllers/static/index.js +0 -268
  104. package/dist/api/controllers/table/bulkFormula.js +0 -173
  105. package/dist/api/controllers/table/external.js +0 -279
  106. package/dist/api/controllers/table/index.js +0 -179
  107. package/dist/api/controllers/table/internal.js +0 -197
  108. package/dist/api/controllers/table/utils.js +0 -379
  109. package/dist/api/controllers/templates.js +0 -56
  110. package/dist/api/controllers/user.js +0 -124
  111. package/dist/api/controllers/view/exporters.js +0 -46
  112. package/dist/api/controllers/view/index.js +0 -193
  113. package/dist/api/controllers/view/utils.js +0 -177
  114. package/dist/api/controllers/view/viewBuilder.js +0 -158
  115. package/dist/api/controllers/webhook.js +0 -134
  116. package/dist/api/index.js +0 -55
  117. package/dist/api/routes/analytics.js +0 -34
  118. package/dist/api/routes/apikeys.js +0 -37
  119. package/dist/api/routes/application.js +0 -48
  120. package/dist/api/routes/auth.js +0 -33
  121. package/dist/api/routes/automation.js +0 -50
  122. package/dist/api/routes/backup.js +0 -35
  123. package/dist/api/routes/component.js +0 -35
  124. package/dist/api/routes/datasource.js +0 -44
  125. package/dist/api/routes/deploy.js +0 -37
  126. package/dist/api/routes/dev.js +0 -49
  127. package/dist/api/routes/index.js +0 -75
  128. package/dist/api/routes/integration.js +0 -37
  129. package/dist/api/routes/layout.js +0 -37
  130. package/dist/api/routes/metadata.js +0 -40
  131. package/dist/api/routes/migrations.js +0 -36
  132. package/dist/api/routes/ops.js +0 -52
  133. package/dist/api/routes/permission.js +0 -44
  134. package/dist/api/routes/plugin.js +0 -39
  135. package/dist/api/routes/public/applications.js +0 -174
  136. package/dist/api/routes/public/index.js +0 -140
  137. package/dist/api/routes/public/metrics.js +0 -30
  138. package/dist/api/routes/public/middleware/mapper.js +0 -97
  139. package/dist/api/routes/public/queries.js +0 -72
  140. package/dist/api/routes/public/rows.js +0 -158
  141. package/dist/api/routes/public/tables.js +0 -152
  142. package/dist/api/routes/public/users.js +0 -135
  143. package/dist/api/routes/public/utils/Endpoint.js +0 -36
  144. package/dist/api/routes/query.js +0 -47
  145. package/dist/api/routes/role.js +0 -40
  146. package/dist/api/routes/routing.js +0 -39
  147. package/dist/api/routes/row.js +0 -239
  148. package/dist/api/routes/screen.js +0 -39
  149. package/dist/api/routes/script.js +0 -35
  150. package/dist/api/routes/static.js +0 -80
  151. package/dist/api/routes/table.js +0 -163
  152. package/dist/api/routes/templates.js +0 -37
  153. package/dist/api/routes/user.js +0 -43
  154. package/dist/api/routes/utils/validators.js +0 -238
  155. package/dist/api/routes/view.js +0 -42
  156. package/dist/api/routes/webhook.js +0 -43
  157. package/dist/app.js +0 -132
  158. package/dist/automations/actions.js +0 -137
  159. package/dist/automations/automationUtils.js +0 -173
  160. package/dist/automations/bullboard.js +0 -71
  161. package/dist/automations/index.js +0 -43
  162. package/dist/automations/logging/index.js +0 -53
  163. package/dist/automations/steps/bash.js +0 -111
  164. package/dist/automations/steps/createRow.js +0 -108
  165. package/dist/automations/steps/delay.js +0 -53
  166. package/dist/automations/steps/deleteRow.js +0 -96
  167. package/dist/automations/steps/discord.js +0 -116
  168. package/dist/automations/steps/executeQuery.js +0 -134
  169. package/dist/automations/steps/executeScript.js +0 -106
  170. package/dist/automations/steps/filter.js +0 -112
  171. package/dist/automations/steps/loop.js +0 -54
  172. package/dist/automations/steps/make.js +0 -134
  173. package/dist/automations/steps/outgoingWebhook.js +0 -166
  174. package/dist/automations/steps/queryRows.js +0 -216
  175. package/dist/automations/steps/sendSmtpEmail.js +0 -115
  176. package/dist/automations/steps/serverLog.js +0 -65
  177. package/dist/automations/steps/slack.js +0 -98
  178. package/dist/automations/steps/updateRow.js +0 -144
  179. package/dist/automations/steps/utils.js +0 -56
  180. package/dist/automations/steps/zapier.js +0 -130
  181. package/dist/automations/triggerInfo/app.js +0 -36
  182. package/dist/automations/triggerInfo/cron.js +0 -35
  183. package/dist/automations/triggerInfo/index.js +0 -40
  184. package/dist/automations/triggerInfo/rowDeleted.js +0 -36
  185. package/dist/automations/triggerInfo/rowSaved.js +0 -44
  186. package/dist/automations/triggerInfo/rowUpdated.js +0 -44
  187. package/dist/automations/triggerInfo/webhook.js +0 -40
  188. package/dist/automations/triggers.js +0 -181
  189. package/dist/automations/utils.js +0 -275
  190. package/dist/constants/definitions.js +0 -2
  191. package/dist/constants/index.js +0 -181
  192. package/dist/constants/layouts.js +0 -148
  193. package/dist/constants/screens.js +0 -51
  194. package/dist/db/defaultData/datasource_bb_default.js +0 -574
  195. package/dist/db/defaultData/employeeImport.js +0 -155
  196. package/dist/db/defaultData/expensesImport.js +0 -117
  197. package/dist/db/defaultData/inventoryImport.js +0 -109
  198. package/dist/db/defaultData/jobsImport.js +0 -152
  199. package/dist/db/dynamoClient.js +0 -124
  200. package/dist/db/inMemoryView.js +0 -62
  201. package/dist/db/index.js +0 -43
  202. package/dist/db/linkedRows/LinkController.js +0 -392
  203. package/dist/db/linkedRows/LinkDocument.js +0 -33
  204. package/dist/db/linkedRows/index.js +0 -206
  205. package/dist/db/linkedRows/linkUtils.js +0 -131
  206. package/dist/db/newid.js +0 -7
  207. package/dist/db/utils.js +0 -248
  208. package/dist/db/views/staticViews.js +0 -144
  209. package/dist/ddApm.js +0 -11
  210. package/dist/definitions/automations.js +0 -8
  211. package/dist/definitions/common.js +0 -2
  212. package/dist/definitions/datasource.js +0 -7
  213. package/dist/definitions/openapi.js +0 -6
  214. package/dist/environment.js +0 -109
  215. package/dist/events/AutomationEmitter.js +0 -53
  216. package/dist/events/BudibaseEmitter.js +0 -25
  217. package/dist/events/docUpdates/index.js +0 -17
  218. package/dist/events/docUpdates/processors.js +0 -18
  219. package/dist/events/docUpdates/syncUsers.js +0 -49
  220. package/dist/events/index.js +0 -11
  221. package/dist/events/utils.js +0 -43
  222. package/dist/integrations/airtable.js +0 -173
  223. package/dist/integrations/arangodb.js +0 -119
  224. package/dist/integrations/base/query.js +0 -32
  225. package/dist/integrations/base/sql.js +0 -600
  226. package/dist/integrations/base/sqlTable.js +0 -167
  227. package/dist/integrations/base/types.js +0 -2
  228. package/dist/integrations/couchdb.js +0 -140
  229. package/dist/integrations/dynamodb.js +0 -210
  230. package/dist/integrations/elasticsearch.js +0 -201
  231. package/dist/integrations/firebase.js +0 -189
  232. package/dist/integrations/googlesheets.js +0 -484
  233. package/dist/integrations/index.js +0 -138
  234. package/dist/integrations/microsoftSqlServer.js +0 -289
  235. package/dist/integrations/mongodb.js +0 -630
  236. package/dist/integrations/mysql.js +0 -272
  237. package/dist/integrations/oracle.js +0 -404
  238. package/dist/integrations/postgres.js +0 -319
  239. package/dist/integrations/queries/sql.js +0 -84
  240. package/dist/integrations/redis.js +0 -187
  241. package/dist/integrations/rest.js +0 -400
  242. package/dist/integrations/s3.js +0 -256
  243. package/dist/integrations/snowflake.js +0 -114
  244. package/dist/integrations/utils.js +0 -295
  245. package/dist/middleware/appInfo.js +0 -22
  246. package/dist/middleware/authorized.js +0 -112
  247. package/dist/middleware/builder.js +0 -93
  248. package/dist/middleware/currentapp.js +0 -103
  249. package/dist/middleware/joi-validator.js +0 -43
  250. package/dist/middleware/publicApi.js +0 -25
  251. package/dist/middleware/resourceId.js +0 -59
  252. package/dist/middleware/selfhost.js +0 -24
  253. package/dist/middleware/utils.js +0 -8
  254. package/dist/migrations/functions/appUrls.js +0 -42
  255. package/dist/migrations/functions/backfill/app/automations.js +0 -31
  256. package/dist/migrations/functions/backfill/app/datasources.js +0 -28
  257. package/dist/migrations/functions/backfill/app/layouts.js +0 -33
  258. package/dist/migrations/functions/backfill/app/queries.js +0 -49
  259. package/dist/migrations/functions/backfill/app/roles.js +0 -28
  260. package/dist/migrations/functions/backfill/app/screens.js +0 -28
  261. package/dist/migrations/functions/backfill/app/tables.js +0 -37
  262. package/dist/migrations/functions/backfill/app.js +0 -176
  263. package/dist/migrations/functions/backfill/global/configs.js +0 -67
  264. package/dist/migrations/functions/backfill/global/quotas.js +0 -60
  265. package/dist/migrations/functions/backfill/global/users.js +0 -50
  266. package/dist/migrations/functions/backfill/global.js +0 -205
  267. package/dist/migrations/functions/backfill/index.js +0 -32
  268. package/dist/migrations/functions/backfill/installation.js +0 -80
  269. package/dist/migrations/functions/syncQuotas.js +0 -52
  270. package/dist/migrations/functions/tableSettings.js +0 -130
  271. package/dist/migrations/functions/usageQuotas/index.js +0 -16
  272. package/dist/migrations/functions/usageQuotas/syncApps.js +0 -24
  273. package/dist/migrations/functions/usageQuotas/syncPlugins.js +0 -23
  274. package/dist/migrations/functions/usageQuotas/syncRows.js +0 -33
  275. package/dist/migrations/functions/usageQuotas/syncUsers.js +0 -21
  276. package/dist/migrations/functions/userEmailViewCasing.js +0 -24
  277. package/dist/migrations/index.js +0 -111
  278. package/dist/migrations/tests/helpers.js +0 -72
  279. package/dist/migrations/tests/structures.js +0 -37
  280. package/dist/sdk/app/applications/index.js +0 -28
  281. package/dist/sdk/app/applications/sync.js +0 -164
  282. package/dist/sdk/app/applications/utils.js +0 -21
  283. package/dist/sdk/app/automations/index.js +0 -29
  284. package/dist/sdk/app/automations/webhook.js +0 -54
  285. package/dist/sdk/app/backups/constants.js +0 -6
  286. package/dist/sdk/app/backups/exports.js +0 -160
  287. package/dist/sdk/app/backups/imports.js +0 -170
  288. package/dist/sdk/app/backups/index.js +0 -29
  289. package/dist/sdk/app/backups/statistics.js +0 -73
  290. package/dist/sdk/app/datasources/datasources.js +0 -173
  291. package/dist/sdk/app/datasources/index.js +0 -27
  292. package/dist/sdk/app/queries/index.js +0 -27
  293. package/dist/sdk/app/queries/queries.js +0 -60
  294. package/dist/sdk/app/rows/attachments.js +0 -61
  295. package/dist/sdk/app/rows/index.js +0 -28
  296. package/dist/sdk/app/rows/rows.js +0 -30
  297. package/dist/sdk/app/tables/index.js +0 -65
  298. package/dist/sdk/index.js +0 -27
  299. package/dist/sdk/plugins/index.js +0 -27
  300. package/dist/sdk/plugins/plugins.js +0 -53
  301. package/dist/sdk/users/index.js +0 -27
  302. package/dist/sdk/users/utils.js +0 -87
  303. package/dist/sdk/utils/index.js +0 -29
  304. package/dist/startup.js +0 -158
  305. package/dist/threads/automation.js +0 -450
  306. package/dist/threads/definitions.js +0 -2
  307. package/dist/threads/index.js +0 -140
  308. package/dist/threads/query.js +0 -265
  309. package/dist/threads/utils.js +0 -120
  310. package/dist/tsconfig.build.tsbuildinfo +0 -1
  311. package/dist/utilities/appDirectoryTemplate/package.json +0 -10
  312. package/dist/utilities/budibaseDir.js +0 -5
  313. package/dist/utilities/centralPath.js +0 -27
  314. package/dist/utilities/csv.js +0 -33
  315. package/dist/utilities/fileSystem/app.js +0 -88
  316. package/dist/utilities/fileSystem/clientLibrary.js +0 -138
  317. package/dist/utilities/fileSystem/filesystem.js +0 -180
  318. package/dist/utilities/fileSystem/index.js +0 -21
  319. package/dist/utilities/fileSystem/plugin.js +0 -76
  320. package/dist/utilities/fileSystem/processor.js +0 -34
  321. package/dist/utilities/fileSystem/template.js +0 -47
  322. package/dist/utilities/global.js +0 -149
  323. package/dist/utilities/index.js +0 -143
  324. package/dist/utilities/redis.js +0 -117
  325. package/dist/utilities/retry.js +0 -30
  326. package/dist/utilities/routing/index.js +0 -39
  327. package/dist/utilities/rowProcessor/index.js +0 -282
  328. package/dist/utilities/rowProcessor/map.js +0 -116
  329. package/dist/utilities/rowProcessor/utils.js +0 -87
  330. package/dist/utilities/schema.js +0 -112
  331. package/dist/utilities/scriptRunner.js +0 -26
  332. package/dist/utilities/security.js +0 -57
  333. package/dist/utilities/statusCodes.js +0 -9
  334. package/dist/utilities/usageQuota/rows.js +0 -88
  335. package/dist/utilities/usageQuota/usageQuoteReset.js +0 -16
  336. package/dist/utilities/users.js +0 -57
  337. package/dist/utilities/workerRequests.js +0 -171
  338. package/dist/watch.js +0 -53
  339. package/dist/websockets/client.js +0 -14
  340. package/dist/websockets/grid.js +0 -60
  341. package/dist/websockets/index.js +0 -17
  342. package/dist/websockets/websocket.js +0 -78
  343. /package/dist/{api/controllers/static/templates/BudibaseApp.svelte → BudibaseApp-Y5NZEDTC.svelte} +0 -0
  344. /package/dist/{api/controllers/static/templates/app.hbs → app.hbs} +0 -0
  345. /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.1",
4
+ "version": "2.6.19-alpha.10",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -10,22 +10,22 @@
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
+ "postbuild": "copyfiles -f ../client/dist/budibase-client.js ../client/manifest.json client",
14
15
  "build:dev": "yarn prebuild && tsc --build --watch --preserveWatchOutput",
15
16
  "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
17
  "test": "bash scripts/test.sh",
18
18
  "test:memory": "jest --maxWorkers=2 --logHeapUsage --forceExit",
19
19
  "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",
20
+ "predocker": "copyfiles -f ../client/dist/budibase-client.js ../client/manifest.json client && yarn build --configuration=production",
21
+ "build:docker": "yarn predocker && docker build . -t app-service --label version=$BUDIBASE_RELEASE_VERSION",
22
22
  "build:docs": "node ./scripts/docs/generate.js open",
23
23
  "run:docker": "node dist/index.js",
24
24
  "run:docker:cluster": "pm2-runtime start pm2.config.js",
25
25
  "dev:stack:up": "node scripts/dev/manage.js up",
26
26
  "dev:stack:down": "node scripts/dev/manage.js down",
27
27
  "dev:stack:nuke": "node scripts/dev/manage.js nuke",
28
- "dev:builder": "yarn run dev:stack:up && nodemon",
28
+ "dev:builder": "yarn run dev:stack:up && rimraf dist/ && nodemon",
29
29
  "dev:built": "yarn run dev:stack:up && yarn run run:docker",
30
30
  "specs": "ts-node specs/generate.ts && openapi-typescript specs/openapi.yaml --output src/definitions/openapi.ts",
31
31
  "initialise": "node scripts/initialise.js",
@@ -45,12 +45,12 @@
45
45
  "license": "GPL-3.0",
46
46
  "dependencies": {
47
47
  "@apidevtools/swagger-parser": "10.0.3",
48
- "@budibase/backend-core": "2.6.19-alpha.1",
49
- "@budibase/client": "2.6.19-alpha.1",
50
- "@budibase/pro": "2.6.19-alpha.1",
51
- "@budibase/shared-core": "2.6.19-alpha.1",
52
- "@budibase/string-templates": "2.6.19-alpha.1",
53
- "@budibase/types": "2.6.19-alpha.1",
48
+ "@budibase/backend-core": "2.6.19-alpha.10",
49
+ "@budibase/client": "2.6.19-alpha.10",
50
+ "@budibase/pro": "2.6.19-alpha.10",
51
+ "@budibase/shared-core": "2.6.19-alpha.10",
52
+ "@budibase/string-templates": "2.6.19-alpha.10",
53
+ "@budibase/types": "2.6.19-alpha.10",
54
54
  "@bull-board/api": "3.7.0",
55
55
  "@bull-board/koa": "3.9.4",
56
56
  "@elastic/elasticsearch": "7.10.0",
@@ -99,6 +99,7 @@
99
99
  "mysql2": "2.3.3",
100
100
  "node-fetch": "2.6.7",
101
101
  "open": "8.4.0",
102
+ "openai": "^3.2.1",
102
103
  "pg": "8.10.0",
103
104
  "posthog-node": "1.3.0",
104
105
  "pouchdb": "7.3.0",
@@ -177,5 +178,20 @@
177
178
  "optionalDependencies": {
178
179
  "oracledb": "5.3.0"
179
180
  },
180
- "gitHead": "0c1a7f3a6d7229024e20646bd75ab450abf2f9bb"
181
+ "nx": {
182
+ "targets": {
183
+ "test": {
184
+ "dependsOn": [
185
+ {
186
+ "projects": [
187
+ "@budibase/string-templates",
188
+ "@budibase/shared-core"
189
+ ],
190
+ "target": "build"
191
+ }
192
+ ]
193
+ }
194
+ }
195
+ },
196
+ "gitHead": "7143391429a9d3685a0c443a32c7b3c3d82b78cf"
181
197
  }
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)
@@ -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
  })
@@ -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,7 +25,9 @@ export async function runView(
25
25
  }))
26
26
  )
27
27
  let fn = (doc: Document, emit: any) => emit(doc._id)
28
- eval("fn = " + view?.map?.replace("function (doc)", "function (doc, emit)"))
28
+ ;(0, eval)(
29
+ "fn = " + view?.map?.replace("function (doc)", "function (doc, emit)")
30
+ )
29
31
  const queryFns: any = {
30
32
  meta: view.meta,
31
33
  map: fn,
@@ -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
@@ -26,7 +26,7 @@ jest.setTimeout(30000)
26
26
 
27
27
  jest.unmock("pg")
28
28
 
29
- describe("row api - postgres", () => {
29
+ describe("postgres integrations", () => {
30
30
  let makeRequest: MakeRequestResponse,
31
31
  postgresDatasource: Datasource,
32
32
  primaryPostgresTable: Table,
@@ -52,8 +52,8 @@ describe("row api - postgres", () => {
52
52
  makeRequest = generateMakeRequest(apiKey, true)
53
53
  })
54
54
 
55
- beforeEach(async () => {
56
- postgresDatasource = await config.createDatasource({
55
+ function pgDatasourceConfig() {
56
+ return {
57
57
  datasource: {
58
58
  type: "datasource",
59
59
  source: SourceName.POSTGRES,
@@ -70,7 +70,11 @@ describe("row api - postgres", () => {
70
70
  ca: false,
71
71
  },
72
72
  },
73
- })
73
+ }
74
+ }
75
+
76
+ beforeEach(async () => {
77
+ postgresDatasource = await config.createDatasource(pgDatasourceConfig())
74
78
 
75
79
  async function createAuxTable(prefix: string) {
76
80
  return await config.createTable({
@@ -1024,4 +1028,43 @@ describe("row api - postgres", () => {
1024
1028
  })
1025
1029
  })
1026
1030
  })
1031
+
1032
+ describe("POST /api/datasources/verify", () => {
1033
+ it("should be able to verify the connection", async () => {
1034
+ const config = pgDatasourceConfig()
1035
+ const response = await makeRequest(
1036
+ "post",
1037
+ "/api/datasources/verify",
1038
+ config
1039
+ )
1040
+ expect(response.status).toBe(200)
1041
+ expect(response.body.connected).toBe(true)
1042
+ })
1043
+
1044
+ it("should state an invalid datasource cannot connect", async () => {
1045
+ const config = pgDatasourceConfig()
1046
+ config.datasource.config.password = "wrongpassword"
1047
+ const response = await makeRequest(
1048
+ "post",
1049
+ "/api/datasources/verify",
1050
+ config
1051
+ )
1052
+ expect(response.status).toBe(200)
1053
+ expect(response.body.connected).toBe(false)
1054
+ expect(response.body.error).toBeDefined()
1055
+ })
1056
+ })
1057
+
1058
+ describe("GET /api/datasources/:datasourceId/info", () => {
1059
+ it("should fetch information about postgres datasource", async () => {
1060
+ const primaryName = primaryPostgresTable.name
1061
+ const response = await makeRequest(
1062
+ "get",
1063
+ `/api/datasources/${postgresDatasource._id}/info`
1064
+ )
1065
+ expect(response.status).toBe(200)
1066
+ expect(response.body.tableNames).toBeDefined()
1067
+ expect(response.body.tableNames.indexOf(primaryName)).not.toBe(-1)
1068
+ })
1069
+ })
1027
1070
  })
@@ -206,4 +206,3 @@ class SqlTableQueryBuilder {
206
206
  }
207
207
 
208
208
  export default SqlTableQueryBuilder
209
- module.exports = SqlTableQueryBuilder