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

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 (347) hide show
  1. package/.dockerignore +7 -6
  2. package/Dockerfile +16 -8
  3. package/builder/assets/{index.b9eeb2a8.js → index.7a65d631.js} +357 -349
  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 +44363 -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/controllers/table/internal.ts +2 -6
  21. package/src/api/controllers/table/utils.ts +32 -1
  22. package/src/api/routes/datasource.ts +5 -0
  23. package/src/api/routes/static.ts +3 -1
  24. package/src/api/routes/tests/datasource.spec.ts +1 -1
  25. package/src/automations/actions.ts +5 -0
  26. package/src/automations/steps/openai.ts +105 -0
  27. package/src/automations/tests/openai.spec.ts +86 -0
  28. package/src/constants/index.ts +17 -16
  29. package/src/db/inMemoryView.ts +3 -1
  30. package/src/environment.ts +2 -0
  31. package/src/integration-test/postgres.spec.ts +47 -4
  32. package/src/integrations/base/sqlTable.ts +0 -1
  33. package/src/integrations/googlesheets.ts +11 -3
  34. package/src/integrations/microsoftSqlServer.ts +18 -2
  35. package/src/integrations/mysql.ts +27 -11
  36. package/src/integrations/oracle.ts +11 -1
  37. package/src/integrations/postgres.ts +27 -10
  38. package/src/integrations/tests/googlesheets.spec.ts +41 -9
  39. package/src/utilities/fileSystem/app.ts +1 -1
  40. package/src/utilities/fileSystem/clientLibrary.ts +8 -3
  41. package/src/utilities/fileSystem/filesystem.ts +3 -1
  42. package/tsconfig.build.json +9 -1
  43. package/tsconfig.json +1 -14
  44. package/dist/api/controllers/analytics.js +0 -46
  45. package/dist/api/controllers/apikeys.js +0 -72
  46. package/dist/api/controllers/application.js +0 -574
  47. package/dist/api/controllers/auth.js +0 -80
  48. package/dist/api/controllers/automation.js +0 -303
  49. package/dist/api/controllers/backup.js +0 -37
  50. package/dist/api/controllers/component.js +0 -59
  51. package/dist/api/controllers/datasource.js +0 -337
  52. package/dist/api/controllers/deploy/Deployment.js +0 -53
  53. package/dist/api/controllers/deploy/index.js +0 -198
  54. package/dist/api/controllers/dev.js +0 -146
  55. package/dist/api/controllers/integration.js +0 -28
  56. package/dist/api/controllers/layout.js +0 -49
  57. package/dist/api/controllers/metadata.js +0 -63
  58. package/dist/api/controllers/migrations.js +0 -29
  59. package/dist/api/controllers/ops.js +0 -40
  60. package/dist/api/controllers/permission.js +0 -162
  61. package/dist/api/controllers/plugin/file.js +0 -24
  62. package/dist/api/controllers/plugin/github.js +0 -69
  63. package/dist/api/controllers/plugin/index.js +0 -112
  64. package/dist/api/controllers/plugin/npm.js +0 -58
  65. package/dist/api/controllers/plugin/uploaders.js +0 -11
  66. package/dist/api/controllers/plugin/url.js +0 -24
  67. package/dist/api/controllers/plugin/utils.js +0 -27
  68. package/dist/api/controllers/public/applications.js +0 -146
  69. package/dist/api/controllers/public/mapping/applications.js +0 -29
  70. package/dist/api/controllers/public/mapping/index.js +0 -11
  71. package/dist/api/controllers/public/mapping/queries.js +0 -36
  72. package/dist/api/controllers/public/mapping/rows.js +0 -24
  73. package/dist/api/controllers/public/mapping/tables.js +0 -23
  74. package/dist/api/controllers/public/mapping/types.js +0 -2
  75. package/dist/api/controllers/public/mapping/users.js +0 -29
  76. package/dist/api/controllers/public/metrics.js +0 -113
  77. package/dist/api/controllers/public/queries.js +0 -58
  78. package/dist/api/controllers/public/rows.js +0 -120
  79. package/dist/api/controllers/public/tables.js +0 -95
  80. package/dist/api/controllers/public/users.js +0 -93
  81. package/dist/api/controllers/public/utils.js +0 -56
  82. package/dist/api/controllers/query/import/index.js +0 -87
  83. package/dist/api/controllers/query/import/sources/base/index.js +0 -75
  84. package/dist/api/controllers/query/import/sources/base/openapi.js +0 -42
  85. package/dist/api/controllers/query/import/sources/curl.js +0 -99
  86. package/dist/api/controllers/query/import/sources/openapi2.js +0 -145
  87. package/dist/api/controllers/query/import/sources/openapi3.js +0 -177
  88. package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +0 -253
  89. package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +0 -1054
  90. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +0 -253
  91. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +0 -1225
  92. package/dist/api/controllers/query/index.js +0 -299
  93. package/dist/api/controllers/query/validation.js +0 -53
  94. package/dist/api/controllers/role.js +0 -109
  95. package/dist/api/controllers/routing.js +0 -105
  96. package/dist/api/controllers/row/ExternalRequest.js +0 -683
  97. package/dist/api/controllers/row/external.js +0 -339
  98. package/dist/api/controllers/row/index.js +0 -203
  99. package/dist/api/controllers/row/internal.js +0 -509
  100. package/dist/api/controllers/row/internalSearch.js +0 -28
  101. package/dist/api/controllers/row/staticFormula.js +0 -165
  102. package/dist/api/controllers/row/utils.js +0 -183
  103. package/dist/api/controllers/screen.js +0 -110
  104. package/dist/api/controllers/script.js +0 -30
  105. package/dist/api/controllers/static/index.js +0 -268
  106. package/dist/api/controllers/table/bulkFormula.js +0 -173
  107. package/dist/api/controllers/table/external.js +0 -279
  108. package/dist/api/controllers/table/index.js +0 -179
  109. package/dist/api/controllers/table/internal.js +0 -197
  110. package/dist/api/controllers/table/utils.js +0 -379
  111. package/dist/api/controllers/templates.js +0 -56
  112. package/dist/api/controllers/user.js +0 -124
  113. package/dist/api/controllers/view/exporters.js +0 -46
  114. package/dist/api/controllers/view/index.js +0 -193
  115. package/dist/api/controllers/view/utils.js +0 -177
  116. package/dist/api/controllers/view/viewBuilder.js +0 -158
  117. package/dist/api/controllers/webhook.js +0 -134
  118. package/dist/api/index.js +0 -55
  119. package/dist/api/routes/analytics.js +0 -34
  120. package/dist/api/routes/apikeys.js +0 -37
  121. package/dist/api/routes/application.js +0 -48
  122. package/dist/api/routes/auth.js +0 -33
  123. package/dist/api/routes/automation.js +0 -50
  124. package/dist/api/routes/backup.js +0 -35
  125. package/dist/api/routes/component.js +0 -35
  126. package/dist/api/routes/datasource.js +0 -44
  127. package/dist/api/routes/deploy.js +0 -37
  128. package/dist/api/routes/dev.js +0 -49
  129. package/dist/api/routes/index.js +0 -75
  130. package/dist/api/routes/integration.js +0 -37
  131. package/dist/api/routes/layout.js +0 -37
  132. package/dist/api/routes/metadata.js +0 -40
  133. package/dist/api/routes/migrations.js +0 -36
  134. package/dist/api/routes/ops.js +0 -52
  135. package/dist/api/routes/permission.js +0 -44
  136. package/dist/api/routes/plugin.js +0 -39
  137. package/dist/api/routes/public/applications.js +0 -174
  138. package/dist/api/routes/public/index.js +0 -140
  139. package/dist/api/routes/public/metrics.js +0 -30
  140. package/dist/api/routes/public/middleware/mapper.js +0 -97
  141. package/dist/api/routes/public/queries.js +0 -72
  142. package/dist/api/routes/public/rows.js +0 -158
  143. package/dist/api/routes/public/tables.js +0 -152
  144. package/dist/api/routes/public/users.js +0 -135
  145. package/dist/api/routes/public/utils/Endpoint.js +0 -36
  146. package/dist/api/routes/query.js +0 -47
  147. package/dist/api/routes/role.js +0 -40
  148. package/dist/api/routes/routing.js +0 -39
  149. package/dist/api/routes/row.js +0 -239
  150. package/dist/api/routes/screen.js +0 -39
  151. package/dist/api/routes/script.js +0 -35
  152. package/dist/api/routes/static.js +0 -80
  153. package/dist/api/routes/table.js +0 -163
  154. package/dist/api/routes/templates.js +0 -37
  155. package/dist/api/routes/user.js +0 -43
  156. package/dist/api/routes/utils/validators.js +0 -238
  157. package/dist/api/routes/view.js +0 -42
  158. package/dist/api/routes/webhook.js +0 -43
  159. package/dist/app.js +0 -132
  160. package/dist/automations/actions.js +0 -137
  161. package/dist/automations/automationUtils.js +0 -173
  162. package/dist/automations/bullboard.js +0 -71
  163. package/dist/automations/index.js +0 -43
  164. package/dist/automations/logging/index.js +0 -53
  165. package/dist/automations/steps/bash.js +0 -111
  166. package/dist/automations/steps/createRow.js +0 -108
  167. package/dist/automations/steps/delay.js +0 -53
  168. package/dist/automations/steps/deleteRow.js +0 -96
  169. package/dist/automations/steps/discord.js +0 -116
  170. package/dist/automations/steps/executeQuery.js +0 -134
  171. package/dist/automations/steps/executeScript.js +0 -106
  172. package/dist/automations/steps/filter.js +0 -112
  173. package/dist/automations/steps/loop.js +0 -54
  174. package/dist/automations/steps/make.js +0 -134
  175. package/dist/automations/steps/outgoingWebhook.js +0 -166
  176. package/dist/automations/steps/queryRows.js +0 -216
  177. package/dist/automations/steps/sendSmtpEmail.js +0 -115
  178. package/dist/automations/steps/serverLog.js +0 -65
  179. package/dist/automations/steps/slack.js +0 -98
  180. package/dist/automations/steps/updateRow.js +0 -144
  181. package/dist/automations/steps/utils.js +0 -56
  182. package/dist/automations/steps/zapier.js +0 -130
  183. package/dist/automations/triggerInfo/app.js +0 -36
  184. package/dist/automations/triggerInfo/cron.js +0 -35
  185. package/dist/automations/triggerInfo/index.js +0 -40
  186. package/dist/automations/triggerInfo/rowDeleted.js +0 -36
  187. package/dist/automations/triggerInfo/rowSaved.js +0 -44
  188. package/dist/automations/triggerInfo/rowUpdated.js +0 -44
  189. package/dist/automations/triggerInfo/webhook.js +0 -40
  190. package/dist/automations/triggers.js +0 -181
  191. package/dist/automations/utils.js +0 -275
  192. package/dist/constants/definitions.js +0 -2
  193. package/dist/constants/index.js +0 -181
  194. package/dist/constants/layouts.js +0 -148
  195. package/dist/constants/screens.js +0 -51
  196. package/dist/db/defaultData/datasource_bb_default.js +0 -574
  197. package/dist/db/defaultData/employeeImport.js +0 -155
  198. package/dist/db/defaultData/expensesImport.js +0 -117
  199. package/dist/db/defaultData/inventoryImport.js +0 -109
  200. package/dist/db/defaultData/jobsImport.js +0 -152
  201. package/dist/db/dynamoClient.js +0 -124
  202. package/dist/db/inMemoryView.js +0 -62
  203. package/dist/db/index.js +0 -43
  204. package/dist/db/linkedRows/LinkController.js +0 -392
  205. package/dist/db/linkedRows/LinkDocument.js +0 -33
  206. package/dist/db/linkedRows/index.js +0 -206
  207. package/dist/db/linkedRows/linkUtils.js +0 -131
  208. package/dist/db/newid.js +0 -7
  209. package/dist/db/utils.js +0 -248
  210. package/dist/db/views/staticViews.js +0 -144
  211. package/dist/ddApm.js +0 -11
  212. package/dist/definitions/automations.js +0 -8
  213. package/dist/definitions/common.js +0 -2
  214. package/dist/definitions/datasource.js +0 -7
  215. package/dist/definitions/openapi.js +0 -6
  216. package/dist/environment.js +0 -109
  217. package/dist/events/AutomationEmitter.js +0 -53
  218. package/dist/events/BudibaseEmitter.js +0 -25
  219. package/dist/events/docUpdates/index.js +0 -17
  220. package/dist/events/docUpdates/processors.js +0 -18
  221. package/dist/events/docUpdates/syncUsers.js +0 -49
  222. package/dist/events/index.js +0 -11
  223. package/dist/events/utils.js +0 -43
  224. package/dist/integrations/airtable.js +0 -173
  225. package/dist/integrations/arangodb.js +0 -119
  226. package/dist/integrations/base/query.js +0 -32
  227. package/dist/integrations/base/sql.js +0 -600
  228. package/dist/integrations/base/sqlTable.js +0 -167
  229. package/dist/integrations/base/types.js +0 -2
  230. package/dist/integrations/couchdb.js +0 -140
  231. package/dist/integrations/dynamodb.js +0 -210
  232. package/dist/integrations/elasticsearch.js +0 -201
  233. package/dist/integrations/firebase.js +0 -189
  234. package/dist/integrations/googlesheets.js +0 -484
  235. package/dist/integrations/index.js +0 -138
  236. package/dist/integrations/microsoftSqlServer.js +0 -289
  237. package/dist/integrations/mongodb.js +0 -630
  238. package/dist/integrations/mysql.js +0 -272
  239. package/dist/integrations/oracle.js +0 -404
  240. package/dist/integrations/postgres.js +0 -319
  241. package/dist/integrations/queries/sql.js +0 -84
  242. package/dist/integrations/redis.js +0 -187
  243. package/dist/integrations/rest.js +0 -400
  244. package/dist/integrations/s3.js +0 -256
  245. package/dist/integrations/snowflake.js +0 -114
  246. package/dist/integrations/utils.js +0 -295
  247. package/dist/middleware/appInfo.js +0 -22
  248. package/dist/middleware/authorized.js +0 -112
  249. package/dist/middleware/builder.js +0 -93
  250. package/dist/middleware/currentapp.js +0 -103
  251. package/dist/middleware/joi-validator.js +0 -43
  252. package/dist/middleware/publicApi.js +0 -25
  253. package/dist/middleware/resourceId.js +0 -59
  254. package/dist/middleware/selfhost.js +0 -24
  255. package/dist/middleware/utils.js +0 -8
  256. package/dist/migrations/functions/appUrls.js +0 -42
  257. package/dist/migrations/functions/backfill/app/automations.js +0 -31
  258. package/dist/migrations/functions/backfill/app/datasources.js +0 -28
  259. package/dist/migrations/functions/backfill/app/layouts.js +0 -33
  260. package/dist/migrations/functions/backfill/app/queries.js +0 -49
  261. package/dist/migrations/functions/backfill/app/roles.js +0 -28
  262. package/dist/migrations/functions/backfill/app/screens.js +0 -28
  263. package/dist/migrations/functions/backfill/app/tables.js +0 -37
  264. package/dist/migrations/functions/backfill/app.js +0 -176
  265. package/dist/migrations/functions/backfill/global/configs.js +0 -67
  266. package/dist/migrations/functions/backfill/global/quotas.js +0 -60
  267. package/dist/migrations/functions/backfill/global/users.js +0 -50
  268. package/dist/migrations/functions/backfill/global.js +0 -205
  269. package/dist/migrations/functions/backfill/index.js +0 -32
  270. package/dist/migrations/functions/backfill/installation.js +0 -80
  271. package/dist/migrations/functions/syncQuotas.js +0 -52
  272. package/dist/migrations/functions/tableSettings.js +0 -130
  273. package/dist/migrations/functions/usageQuotas/index.js +0 -16
  274. package/dist/migrations/functions/usageQuotas/syncApps.js +0 -24
  275. package/dist/migrations/functions/usageQuotas/syncPlugins.js +0 -23
  276. package/dist/migrations/functions/usageQuotas/syncRows.js +0 -33
  277. package/dist/migrations/functions/usageQuotas/syncUsers.js +0 -21
  278. package/dist/migrations/functions/userEmailViewCasing.js +0 -24
  279. package/dist/migrations/index.js +0 -111
  280. package/dist/migrations/tests/helpers.js +0 -72
  281. package/dist/migrations/tests/structures.js +0 -37
  282. package/dist/sdk/app/applications/index.js +0 -28
  283. package/dist/sdk/app/applications/sync.js +0 -164
  284. package/dist/sdk/app/applications/utils.js +0 -21
  285. package/dist/sdk/app/automations/index.js +0 -29
  286. package/dist/sdk/app/automations/webhook.js +0 -54
  287. package/dist/sdk/app/backups/constants.js +0 -6
  288. package/dist/sdk/app/backups/exports.js +0 -160
  289. package/dist/sdk/app/backups/imports.js +0 -170
  290. package/dist/sdk/app/backups/index.js +0 -29
  291. package/dist/sdk/app/backups/statistics.js +0 -73
  292. package/dist/sdk/app/datasources/datasources.js +0 -173
  293. package/dist/sdk/app/datasources/index.js +0 -27
  294. package/dist/sdk/app/queries/index.js +0 -27
  295. package/dist/sdk/app/queries/queries.js +0 -60
  296. package/dist/sdk/app/rows/attachments.js +0 -61
  297. package/dist/sdk/app/rows/index.js +0 -28
  298. package/dist/sdk/app/rows/rows.js +0 -30
  299. package/dist/sdk/app/tables/index.js +0 -65
  300. package/dist/sdk/index.js +0 -27
  301. package/dist/sdk/plugins/index.js +0 -27
  302. package/dist/sdk/plugins/plugins.js +0 -53
  303. package/dist/sdk/users/index.js +0 -27
  304. package/dist/sdk/users/utils.js +0 -87
  305. package/dist/sdk/utils/index.js +0 -29
  306. package/dist/startup.js +0 -158
  307. package/dist/threads/automation.js +0 -450
  308. package/dist/threads/definitions.js +0 -2
  309. package/dist/threads/index.js +0 -140
  310. package/dist/threads/query.js +0 -265
  311. package/dist/threads/utils.js +0 -120
  312. package/dist/tsconfig.build.tsbuildinfo +0 -1
  313. package/dist/utilities/appDirectoryTemplate/package.json +0 -10
  314. package/dist/utilities/budibaseDir.js +0 -5
  315. package/dist/utilities/centralPath.js +0 -27
  316. package/dist/utilities/csv.js +0 -33
  317. package/dist/utilities/fileSystem/app.js +0 -88
  318. package/dist/utilities/fileSystem/clientLibrary.js +0 -138
  319. package/dist/utilities/fileSystem/filesystem.js +0 -180
  320. package/dist/utilities/fileSystem/index.js +0 -21
  321. package/dist/utilities/fileSystem/plugin.js +0 -76
  322. package/dist/utilities/fileSystem/processor.js +0 -34
  323. package/dist/utilities/fileSystem/template.js +0 -47
  324. package/dist/utilities/global.js +0 -149
  325. package/dist/utilities/index.js +0 -143
  326. package/dist/utilities/redis.js +0 -117
  327. package/dist/utilities/retry.js +0 -30
  328. package/dist/utilities/routing/index.js +0 -39
  329. package/dist/utilities/rowProcessor/index.js +0 -282
  330. package/dist/utilities/rowProcessor/map.js +0 -116
  331. package/dist/utilities/rowProcessor/utils.js +0 -87
  332. package/dist/utilities/schema.js +0 -112
  333. package/dist/utilities/scriptRunner.js +0 -26
  334. package/dist/utilities/security.js +0 -57
  335. package/dist/utilities/statusCodes.js +0 -9
  336. package/dist/utilities/usageQuota/rows.js +0 -88
  337. package/dist/utilities/usageQuota/usageQuoteReset.js +0 -16
  338. package/dist/utilities/users.js +0 -57
  339. package/dist/utilities/workerRequests.js +0 -171
  340. package/dist/watch.js +0 -53
  341. package/dist/websockets/client.js +0 -14
  342. package/dist/websockets/grid.js +0 -60
  343. package/dist/websockets/index.js +0 -17
  344. package/dist/websockets/websocket.js +0 -78
  345. /package/dist/{api/controllers/static/templates/BudibaseApp.svelte → BudibaseApp-Y5NZEDTC.svelte} +0 -0
  346. /package/dist/{api/controllers/static/templates/app.hbs → app.hbs} +0 -0
  347. /package/dist/{api/controllers/static/templates/preview.hbs → preview.hbs} +0 -0
@@ -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
@@ -63,10 +63,13 @@ const SCHEMA: Integration = {
63
63
  relationships: false,
64
64
  docs: "https://developers.google.com/sheets/api/quickstart/nodejs",
65
65
  description:
66
- "Create and collaborate on online spreadsheets in real-time and from any device. ",
66
+ "Create and collaborate on online spreadsheets in real-time and from any device.",
67
67
  friendlyName: "Google Sheets",
68
68
  type: "Spreadsheet",
69
- features: [DatasourceFeature.CONNECTION_CHECKING],
69
+ features: [
70
+ DatasourceFeature.CONNECTION_CHECKING,
71
+ DatasourceFeature.FETCH_TABLE_NAMES,
72
+ ],
70
73
  datasource: {
71
74
  spreadsheetId: {
72
75
  display: "Google Sheet URL",
@@ -145,7 +148,6 @@ class GoogleSheetsIntegration implements DatasourcePlus {
145
148
  async testConnection(): Promise<ConnectionInfo> {
146
149
  try {
147
150
  await this.connect()
148
- await this.client.loadInfo()
149
151
  return { connected: true }
150
152
  } catch (e: any) {
151
153
  return {
@@ -240,6 +242,12 @@ class GoogleSheetsIntegration implements DatasourcePlus {
240
242
  }
241
243
  }
242
244
 
245
+ async getTableNames(): Promise<string[]> {
246
+ await this.connect()
247
+ const sheets = this.client.sheetsByIndex
248
+ return sheets.map(s => s.title)
249
+ }
250
+
243
251
  getTableSchema(title: string, headerValues: string[], id?: string) {
244
252
  // base table
245
253
  const table: Table = {
@@ -20,7 +20,6 @@ import {
20
20
  } from "./utils"
21
21
  import Sql from "./base/sql"
22
22
  import { MSSQLTablesResponse, MSSQLColumn } from "./base/types"
23
-
24
23
  const sqlServer = require("mssql")
25
24
  const DEFAULT_SCHEMA = "dbo"
26
25
 
@@ -41,7 +40,10 @@ const SCHEMA: Integration = {
41
40
  "Microsoft SQL Server is a relational database management system developed by Microsoft. ",
42
41
  friendlyName: "MS SQL Server",
43
42
  type: "Relational",
44
- features: [DatasourceFeature.CONNECTION_CHECKING],
43
+ features: [
44
+ DatasourceFeature.CONNECTION_CHECKING,
45
+ DatasourceFeature.FETCH_TABLE_NAMES,
46
+ ],
45
47
  datasource: {
46
48
  user: {
47
49
  type: DatasourceFieldType.STRING,
@@ -284,6 +286,20 @@ class SqlServerIntegration extends Sql implements DatasourcePlus {
284
286
  this.schemaErrors = final.errors
285
287
  }
286
288
 
289
+ async queryTableNames() {
290
+ let tableInfo: MSSQLTablesResponse[] = await this.runSQL(this.TABLES_SQL)
291
+ const schema = this.config.schema || DEFAULT_SCHEMA
292
+ return tableInfo
293
+ .filter((record: any) => record.TABLE_SCHEMA === schema)
294
+ .map((record: any) => record.TABLE_NAME)
295
+ .filter((name: string) => this.MASTER_TABLES.indexOf(name) === -1)
296
+ }
297
+
298
+ async getTableNames() {
299
+ await this.connect()
300
+ return this.queryTableNames()
301
+ }
302
+
287
303
  async read(query: SqlQuery | string) {
288
304
  await this.connect()
289
305
  const response = await this.internalQuery(getSqlQuery(query))
@@ -36,7 +36,10 @@ const SCHEMA: Integration = {
36
36
  type: "Relational",
37
37
  description:
38
38
  "MySQL Database Service is a fully managed database service to deploy cloud-native applications. ",
39
- features: [DatasourceFeature.CONNECTION_CHECKING],
39
+ features: [
40
+ DatasourceFeature.CONNECTION_CHECKING,
41
+ DatasourceFeature.FETCH_TABLE_NAMES,
42
+ ],
40
43
  datasource: {
41
44
  host: {
42
45
  type: DatasourceFieldType.STRING,
@@ -214,20 +217,11 @@ class MySQLIntegration extends Sql implements DatasourcePlus {
214
217
 
215
218
  async buildSchema(datasourceId: string, entities: Record<string, Table>) {
216
219
  const tables: { [key: string]: Table } = {}
217
- const database = this.config.database
218
220
  await this.connect()
219
221
 
220
222
  try {
221
223
  // get the tables first
222
- const tablesResp: Record<string, string>[] = await this.internalQuery(
223
- { sql: "SHOW TABLES;" },
224
- { connect: false }
225
- )
226
- const tableNames: string[] = tablesResp.map(
227
- (obj: any) =>
228
- obj[`Tables_in_${database}`] ||
229
- obj[`Tables_in_${database.toLowerCase()}`]
230
- )
224
+ const tableNames = await this.queryTableNames()
231
225
  for (let tableName of tableNames) {
232
226
  const primaryKeys = []
233
227
  const schema: TableSchema = {}
@@ -274,6 +268,28 @@ class MySQLIntegration extends Sql implements DatasourcePlus {
274
268
  this.schemaErrors = final.errors
275
269
  }
276
270
 
271
+ async queryTableNames() {
272
+ const database = this.config.database
273
+ const tablesResp: Record<string, string>[] = await this.internalQuery(
274
+ { sql: "SHOW TABLES;" },
275
+ { connect: false }
276
+ )
277
+ return tablesResp.map(
278
+ (obj: any) =>
279
+ obj[`Tables_in_${database}`] ||
280
+ obj[`Tables_in_${database.toLowerCase()}`]
281
+ )
282
+ }
283
+
284
+ async getTableNames() {
285
+ await this.connect()
286
+ try {
287
+ return this.queryTableNames()
288
+ } finally {
289
+ await this.disconnect()
290
+ }
291
+ }
292
+
277
293
  async create(query: SqlQuery | string) {
278
294
  const results = await this.internalQuery(getSqlQuery(query))
279
295
  return results.length ? results : [{ created: true }]
@@ -50,7 +50,10 @@ const SCHEMA: Integration = {
50
50
  type: "Relational",
51
51
  description:
52
52
  "Oracle Database is an object-relational database management system developed by Oracle Corporation",
53
- features: [DatasourceFeature.CONNECTION_CHECKING],
53
+ features: [
54
+ DatasourceFeature.CONNECTION_CHECKING,
55
+ DatasourceFeature.FETCH_TABLE_NAMES,
56
+ ],
54
57
  datasource: {
55
58
  host: {
56
59
  type: DatasourceFieldType.STRING,
@@ -323,6 +326,13 @@ class OracleIntegration extends Sql implements DatasourcePlus {
323
326
  this.schemaErrors = final.errors
324
327
  }
325
328
 
329
+ async getTableNames() {
330
+ const columnsResponse = await this.internalQuery<OracleColumnsResponse>({
331
+ sql: this.COLUMNS_SQL,
332
+ })
333
+ return (columnsResponse.rows || []).map(row => row.TABLE_NAME)
334
+ }
335
+
326
336
  async testConnection() {
327
337
  const response: ConnectionInfo = {
328
338
  connected: false,
@@ -52,7 +52,10 @@ const SCHEMA: Integration = {
52
52
  type: "Relational",
53
53
  description:
54
54
  "PostgreSQL, also known as Postgres, is a free and open-source relational database management system emphasizing extensibility and SQL compliance.",
55
- features: [DatasourceFeature.CONNECTION_CHECKING],
55
+ features: [
56
+ DatasourceFeature.CONNECTION_CHECKING,
57
+ DatasourceFeature.FETCH_TABLE_NAMES,
58
+ ],
56
59
  datasource: {
57
60
  host: {
58
61
  type: DatasourceFieldType.STRING,
@@ -126,14 +129,15 @@ class PostgresIntegration extends Sql implements DatasourcePlus {
126
129
 
127
130
  COLUMNS_SQL!: string
128
131
 
129
- PRIMARY_KEYS_SQL = `
130
- select tc.table_schema, tc.table_name, kc.column_name as primary_key
131
- from information_schema.table_constraints tc
132
- join
133
- information_schema.key_column_usage kc on kc.table_name = tc.table_name
134
- and kc.table_schema = tc.table_schema
135
- and kc.constraint_name = tc.constraint_name
136
- where tc.constraint_type = 'PRIMARY KEY';
132
+ PRIMARY_KEYS_SQL = () => `
133
+ SELECT pg_namespace.nspname table_schema
134
+ , pg_class.relname table_name
135
+ , pg_attribute.attname primary_key
136
+ FROM pg_class
137
+ JOIN pg_index ON pg_class.oid = pg_index.indrelid AND pg_index.indisprimary
138
+ JOIN pg_attribute ON pg_attribute.attrelid = pg_class.oid AND pg_attribute.attnum = ANY(pg_index.indkey)
139
+ JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
140
+ WHERE pg_namespace.nspname = '${this.config.schema}';
137
141
  `
138
142
 
139
143
  constructor(config: PostgresConfig) {
@@ -239,7 +243,9 @@ class PostgresIntegration extends Sql implements DatasourcePlus {
239
243
  let tableKeys: { [key: string]: string[] } = {}
240
244
  await this.openConnection()
241
245
  try {
242
- const primaryKeysResponse = await this.client.query(this.PRIMARY_KEYS_SQL)
246
+ const primaryKeysResponse = await this.client.query(
247
+ this.PRIMARY_KEYS_SQL()
248
+ )
243
249
  for (let table of primaryKeysResponse.rows) {
244
250
  const tableName = table.table_name
245
251
  if (!tableKeys[tableName]) {
@@ -311,6 +317,17 @@ class PostgresIntegration extends Sql implements DatasourcePlus {
311
317
  }
312
318
  }
313
319
 
320
+ async getTableNames() {
321
+ try {
322
+ await this.openConnection()
323
+ const columnsResponse: { rows: PostgresColumn[] } =
324
+ await this.client.query(this.COLUMNS_SQL)
325
+ return columnsResponse.rows.map(row => row.table_name)
326
+ } finally {
327
+ await this.closeConnection()
328
+ }
329
+ }
330
+
314
331
  async create(query: SqlQuery | string) {
315
332
  const response = await this.internalQuery(getSqlQuery(query))
316
333
  return response.rows.length ? response.rows : [{ created: true }]
@@ -17,14 +17,15 @@ jest.mock("google-spreadsheet")
17
17
  const { GoogleSpreadsheet } = require("google-spreadsheet")
18
18
 
19
19
  const sheetsByTitle: { [title: string]: GoogleSpreadsheetWorksheet } = {}
20
+ const sheetsByIndex: GoogleSpreadsheetWorksheet[] = []
21
+ const mockGoogleIntegration = {
22
+ useOAuth2Client: jest.fn(),
23
+ loadInfo: jest.fn(),
24
+ sheetsByTitle,
25
+ sheetsByIndex,
26
+ }
20
27
 
21
- GoogleSpreadsheet.mockImplementation(() => {
22
- return {
23
- useOAuth2Client: jest.fn(),
24
- loadInfo: jest.fn(),
25
- sheetsByTitle,
26
- }
27
- })
28
+ GoogleSpreadsheet.mockImplementation(() => mockGoogleIntegration)
28
29
 
29
30
  import { structures } from "@budibase/backend-core/tests"
30
31
  import TestConfiguration from "../../tests/utilities/TestConfiguration"
@@ -53,6 +54,8 @@ describe("Google Sheets Integration", () => {
53
54
  },
54
55
  })
55
56
  await config.init()
57
+
58
+ jest.clearAllMocks()
56
59
  })
57
60
 
58
61
  function createBasicTable(name: string, columns: string[]): Table {
@@ -88,7 +91,7 @@ describe("Google Sheets Integration", () => {
88
91
  }
89
92
 
90
93
  describe("update table", () => {
91
- test("adding a new field will be adding a new header row", async () => {
94
+ it("adding a new field will be adding a new header row", async () => {
92
95
  await config.doInContext(structures.uuid(), async () => {
93
96
  const tableColumns = ["name", "description", "new field"]
94
97
  const table = createBasicTable(structures.uuid(), tableColumns)
@@ -103,7 +106,7 @@ describe("Google Sheets Integration", () => {
103
106
  })
104
107
  })
105
108
 
106
- test("removing an existing field will remove the header from the google sheet", async () => {
109
+ it("removing an existing field will remove the header from the google sheet", async () => {
107
110
  const sheet = await config.doInContext(structures.uuid(), async () => {
108
111
  const tableColumns = ["name"]
109
112
  const table = createBasicTable(structures.uuid(), tableColumns)
@@ -123,4 +126,33 @@ describe("Google Sheets Integration", () => {
123
126
  expect((sheet.setHeaderRow as any).mock.calls[0][0]).toHaveLength(1)
124
127
  })
125
128
  })
129
+
130
+ describe("getTableNames", () => {
131
+ it("can fetch table names", async () => {
132
+ await config.doInContext(structures.uuid(), async () => {
133
+ const sheetNames: string[] = []
134
+ for (let i = 0; i < 5; i++) {
135
+ const sheet = createSheet({ headerValues: [] })
136
+ sheetsByIndex.push(sheet)
137
+ sheetNames.push(sheet.title)
138
+ }
139
+
140
+ const res = await integration.getTableNames()
141
+
142
+ expect(mockGoogleIntegration.loadInfo).toBeCalledTimes(1)
143
+ expect(res).toEqual(sheetNames)
144
+ })
145
+ })
146
+ })
147
+
148
+ describe("testConnection", () => {
149
+ it("can test successful connections", async () => {
150
+ await config.doInContext(structures.uuid(), async () => {
151
+ const res = await integration.testConnection()
152
+
153
+ expect(mockGoogleIntegration.loadInfo).toBeCalledTimes(1)
154
+ expect(res).toEqual({ connected: true })
155
+ })
156
+ })
157
+ })
126
158
  })
@@ -35,7 +35,7 @@ export const getComponentLibraryManifest = async (library: string) => {
35
35
  const filename = "manifest.json"
36
36
 
37
37
  if (env.isDev() || env.isTest()) {
38
- const path = join(TOP_LEVEL_PATH, "../client", filename)
38
+ const path = join(TOP_LEVEL_PATH, "packages/client", filename)
39
39
  // always load from new so that updates are refreshed
40
40
  delete require.cache[require.resolve(path)]
41
41
  return require(path)
@@ -1,4 +1,4 @@
1
- import { join } from "path"
1
+ import path, { join } from "path"
2
2
  import { ObjectStoreBuckets } from "../../constants"
3
3
  import fs from "fs"
4
4
  import { objectStore } from "@budibase/backend-core"
@@ -6,6 +6,10 @@ import { resolve } from "../centralPath"
6
6
  import env from "../../environment"
7
7
  import { TOP_LEVEL_PATH } from "./filesystem"
8
8
 
9
+ export function devClientLibPath() {
10
+ return require.resolve("@budibase/client")
11
+ }
12
+
9
13
  /**
10
14
  * Client library paths in the object store:
11
15
  * Previously, the entire client library package was downloaded from NPM
@@ -89,9 +93,10 @@ export async function updateClientLibrary(appId: string) {
89
93
  let manifest, client
90
94
 
91
95
  if (env.isDev()) {
96
+ const clientPath = devClientLibPath()
92
97
  // Load the symlinked version in dev which is always the newest
93
- manifest = require.resolve("@budibase/client/manifest.json")
94
- client = require.resolve("@budibase/client")
98
+ manifest = join(path.dirname(path.dirname(clientPath)), "manifest.json")
99
+ client = clientPath
95
100
  } else {
96
101
  // Load the bundled version in prod
97
102
  manifest = resolve(TOP_LEVEL_PATH, "client", "manifest.json")
@@ -4,9 +4,11 @@ import { budibaseTempDir } from "../budibaseDir"
4
4
  import { join } from "path"
5
5
  import env from "../../environment"
6
6
  import tar from "tar"
7
+ import environment from "../../environment"
7
8
  const uuid = require("uuid/v4")
8
9
 
9
- export const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..")
10
+ export const TOP_LEVEL_PATH =
11
+ environment.TOP_LEVEL_PATH || join(__dirname, "..", "..", "..")
10
12
 
11
13
  /**
12
14
  * Upon first startup of instance there may not be everything we need in tmp directory, set it up.
@@ -10,7 +10,15 @@
10
10
  "incremental": true,
11
11
  "types": ["node", "jest"],
12
12
  "outDir": "dist/src",
13
- "skipLibCheck": true
13
+ "skipLibCheck": true,
14
+ "baseUrl": ".",
15
+ "paths": {
16
+ "@budibase/types": ["../types/src"],
17
+ "@budibase/backend-core": ["../backend-core/src"],
18
+ "@budibase/backend-core/*": ["../backend-core/*"],
19
+ "@budibase/shared-core": ["../shared-core/src"],
20
+ "@budibase/pro": ["../pro/packages/pro/src"]
21
+ }
14
22
  },
15
23
  "include": ["src/**/*"],
16
24
  "exclude": [
package/tsconfig.json CHANGED
@@ -5,25 +5,12 @@
5
5
  "declaration": true,
6
6
  "sourceMap": true,
7
7
  "baseUrl": ".",
8
- "outDir": "dist",
9
- "paths": {
10
- "@budibase/types": ["../types/src"],
11
- "@budibase/backend-core": ["../backend-core/src"],
12
- "@budibase/backend-core/*": ["../backend-core/*"],
13
- "@budibase/shared-core": ["../shared-core/src"],
14
- "@budibase/pro": ["../pro/packages/pro/src"]
15
- }
8
+ "outDir": "dist"
16
9
  },
17
10
  "ts-node": {
18
11
  "require": ["tsconfig-paths/register"],
19
12
  "swc": true
20
13
  },
21
- "references": [
22
- { "path": "../types" },
23
- { "path": "../backend-core" },
24
- { "path": "../shared-core" },
25
- { "path": "../../../budibase-pro/packages/pro" }
26
- ],
27
14
  "include": ["src/**/*", "specs"],
28
15
  "exclude": ["node_modules", "dist"]
29
16
  }
@@ -1,46 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.ping = exports.isEnabled = void 0;
13
- const backend_core_1 = require("@budibase/backend-core");
14
- const types_1 = require("@budibase/types");
15
- const utils_1 = require("../../db/utils");
16
- const backend_core_2 = require("@budibase/backend-core");
17
- const isEnabled = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
18
- const enabled = yield backend_core_1.events.analytics.enabled();
19
- ctx.body = {
20
- enabled,
21
- };
22
- });
23
- exports.isEnabled = isEnabled;
24
- const ping = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
25
- const body = ctx.request.body;
26
- switch (body.source) {
27
- case types_1.PingSource.APP: {
28
- const db = backend_core_2.context.getAppDB({ skip_setup: true });
29
- const appInfo = yield db.get(utils_1.DocumentType.APP_METADATA);
30
- let appId = backend_core_2.context.getAppId();
31
- if ((0, utils_1.isDevAppID)(appId)) {
32
- yield backend_core_1.events.serve.servedAppPreview(appInfo, body.timezone);
33
- }
34
- else {
35
- yield backend_core_1.events.serve.servedApp(appInfo, body.timezone);
36
- }
37
- break;
38
- }
39
- case types_1.PingSource.BUILDER: {
40
- yield backend_core_1.events.serve.servedBuilder(body.timezone);
41
- break;
42
- }
43
- }
44
- ctx.status = 200;
45
- });
46
- exports.ping = ping;
@@ -1,72 +0,0 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.update = exports.fetch = void 0;
13
- const backend_core_1 = require("@budibase/backend-core");
14
- const KEYS_DOC = backend_core_1.db.StaticDatabases.GLOBAL.docs.apiKeys;
15
- function getBuilderMainDoc() {
16
- return __awaiter(this, void 0, void 0, function* () {
17
- const db = backend_core_1.tenancy.getGlobalDB();
18
- try {
19
- return yield db.get(KEYS_DOC);
20
- }
21
- catch (err) {
22
- // doesn't exist yet, nothing to get
23
- return {
24
- _id: KEYS_DOC,
25
- };
26
- }
27
- });
28
- }
29
- function setBuilderMainDoc(doc) {
30
- return __awaiter(this, void 0, void 0, function* () {
31
- // make sure to override the ID
32
- doc._id = KEYS_DOC;
33
- const db = backend_core_1.tenancy.getGlobalDB();
34
- return db.put(doc);
35
- });
36
- }
37
- function fetch(ctx) {
38
- return __awaiter(this, void 0, void 0, function* () {
39
- try {
40
- const mainDoc = yield getBuilderMainDoc();
41
- ctx.body = mainDoc.apiKeys ? mainDoc.apiKeys : {};
42
- }
43
- catch (err) {
44
- /* istanbul ignore next */
45
- ctx.throw(400, err);
46
- }
47
- });
48
- }
49
- exports.fetch = fetch;
50
- function update(ctx) {
51
- return __awaiter(this, void 0, void 0, function* () {
52
- const key = ctx.params.key;
53
- const value = ctx.request.body.value;
54
- try {
55
- const mainDoc = yield getBuilderMainDoc();
56
- if (mainDoc.apiKeys == null) {
57
- mainDoc.apiKeys = {};
58
- }
59
- mainDoc.apiKeys[key] = value;
60
- const resp = yield setBuilderMainDoc(mainDoc);
61
- ctx.body = {
62
- _id: resp.id,
63
- _rev: resp.rev,
64
- };
65
- }
66
- catch (err) {
67
- /* istanbul ignore next */
68
- ctx.throw(400, err);
69
- }
70
- });
71
- }
72
- exports.update = update;