@budibase/server 2.6.19-alpha.0 → 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
@@ -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(NODE_MODULES_PATH, "@budibase", "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;