@budibase/server 1.3.21 → 1.3.22-alpha.1

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 (310) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/index.96c69636.js +1008 -0
  3. package/builder/assets/index.c167b5c3.css +6 -0
  4. package/builder/index.html +2 -4
  5. package/coverage/clover.xml +308 -338
  6. package/coverage/coverage-final.json +19 -21
  7. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/auth.js.html +41 -8
  9. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/datasource.js.html +73 -34
  13. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/index.html +27 -57
  15. package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
  16. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/row/external.js.html +2 -2
  25. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  43. package/coverage/lcov-report/api/index.html +1 -1
  44. package/coverage/lcov-report/api/index.js.html +13 -13
  45. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  46. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/index.html +1 -1
  56. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/table.js.html +2 -2
  67. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/utils/index.html +9 -9
  70. package/coverage/lcov-report/api/routes/utils/validators.js.html +75 -12
  71. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  73. package/coverage/lcov-report/automations/actions.js.html +1 -1
  74. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  75. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  76. package/coverage/lcov-report/automations/index.html +1 -1
  77. package/coverage/lcov-report/automations/index.js.html +1 -1
  78. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  79. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/index.html +1 -1
  85. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  95. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  96. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  104. package/coverage/lcov-report/constants/index.html +1 -1
  105. package/coverage/lcov-report/constants/index.js.html +1 -1
  106. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  107. package/coverage/lcov-report/constants/screens.js.html +1 -1
  108. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  109. package/coverage/lcov-report/db/index.html +14 -14
  110. package/coverage/lcov-report/db/index.js.html +1 -1
  111. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  112. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  115. package/coverage/lcov-report/db/newid.js.html +2 -2
  116. package/coverage/lcov-report/db/utils.js.html +30 -18
  117. package/coverage/lcov-report/events/AutomationEmitter.js.html +3 -3
  118. package/coverage/lcov-report/events/index.html +1 -1
  119. package/coverage/lcov-report/events/index.js.html +1 -1
  120. package/coverage/lcov-report/events/utils.js.html +1 -1
  121. package/coverage/lcov-report/index.html +44 -44
  122. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  123. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  124. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  125. package/coverage/lcov-report/middleware/builder.js.html +12 -12
  126. package/coverage/lcov-report/middleware/currentapp.js.html +46 -40
  127. package/coverage/lcov-report/middleware/index.html +15 -15
  128. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  129. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  130. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  131. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  132. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  133. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
  134. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  135. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  136. package/coverage/lcov-report/utilities/global.js.html +16 -16
  137. package/coverage/lcov-report/utilities/index.html +15 -15
  138. package/coverage/lcov-report/utilities/index.js.html +24 -24
  139. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  140. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  141. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  142. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  143. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  144. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  146. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  147. package/coverage/lcov-report/utilities/security.js.html +2 -2
  148. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  149. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  150. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  151. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  152. package/coverage/lcov-report/utilities/users.js.html +1 -1
  153. package/coverage/lcov-report/utilities/workerRequests.js.html +32 -8
  154. package/coverage/lcov.info +521 -558
  155. package/dist/api/controllers/application.js +5 -5
  156. package/dist/api/controllers/auth.js +9 -0
  157. package/dist/api/controllers/component.js +19 -6
  158. package/dist/api/controllers/datasource.js +21 -8
  159. package/dist/api/controllers/deploy/index.js +1 -8
  160. package/dist/api/controllers/integration.js +4 -4
  161. package/dist/{migrations/functions/usageQuotas/syncDevelopers.js → api/controllers/plugin/file.js} +13 -13
  162. package/dist/api/controllers/plugin/github.js +69 -0
  163. package/dist/api/controllers/plugin/index.js +144 -0
  164. package/dist/api/controllers/plugin/npm.js +58 -0
  165. package/dist/api/controllers/plugin/uploaders.js +11 -0
  166. package/dist/{migrations/functions/usageQuotas/syncPublishedApps.js → api/controllers/plugin/url.js} +13 -15
  167. package/dist/api/controllers/plugin/utils.js +26 -0
  168. package/dist/api/controllers/row/external.js +1 -1
  169. package/dist/api/controllers/screen.js +62 -14
  170. package/dist/api/controllers/static/index.js +1 -0
  171. package/dist/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  172. package/dist/api/controllers/static/templates/preview.hbs +5 -1
  173. package/dist/api/index.js +1 -1
  174. package/dist/api/routes/application.js +3 -2
  175. package/dist/api/routes/index.js +2 -0
  176. package/dist/{migrations/functions/publishedAppsQuota.js → api/routes/plugin.js} +13 -21
  177. package/dist/api/routes/public/rows.js +1 -82
  178. package/dist/api/routes/public/tables.js +1 -1
  179. package/dist/api/routes/table.js +1 -1
  180. package/dist/api/routes/utils/validators.js +20 -2
  181. package/dist/app.js +16 -1
  182. package/dist/db/utils.js +3 -0
  183. package/dist/environment.js +1 -0
  184. package/dist/integrations/airtable.js +126 -129
  185. package/dist/integrations/arangodb.js +86 -89
  186. package/dist/integrations/base/query.js +2 -2
  187. package/dist/integrations/base/sqlTable.js +3 -1
  188. package/dist/integrations/couchdb.js +80 -83
  189. package/dist/integrations/dynamodb.js +161 -164
  190. package/dist/integrations/elasticsearch.js +135 -138
  191. package/dist/integrations/firebase.js +154 -157
  192. package/dist/integrations/googlesheets.js +323 -327
  193. package/dist/integrations/index.js +99 -51
  194. package/dist/integrations/microsoftSqlServer.js +240 -243
  195. package/dist/integrations/mongodb.js +239 -242
  196. package/dist/integrations/mysql.js +215 -219
  197. package/dist/integrations/oracle.js +318 -322
  198. package/dist/integrations/postgres.js +262 -265
  199. package/dist/integrations/redis.js +134 -139
  200. package/dist/integrations/rest.js +289 -292
  201. package/dist/integrations/s3.js +61 -64
  202. package/dist/integrations/snowflake.js +83 -86
  203. package/dist/middleware/currentapp.js +2 -0
  204. package/dist/migrations/functions/backfill/global.js +0 -3
  205. package/dist/migrations/index.js +0 -10
  206. package/dist/package.json +9 -6
  207. package/dist/tests/utilities/TestConfiguration.js +1 -1
  208. package/dist/threads/query.js +2 -2
  209. package/dist/tsconfig.build.tsbuildinfo +1 -1
  210. package/dist/utilities/fileSystem/index.js +105 -1
  211. package/dist/utilities/workerRequests.js +4 -0
  212. package/dist/watch.js +77 -0
  213. package/dist/websocket.js +22 -0
  214. package/package.json +10 -7
  215. package/scripts/dev/manage.js +4 -0
  216. package/scripts/localdomain.js +3 -1
  217. package/specs/openapi.json +115 -112
  218. package/specs/openapi.yaml +96 -94
  219. package/specs/resources/misc.js +116 -0
  220. package/specs/resources/query.js +1 -1
  221. package/src/api/controllers/application.ts +1 -2
  222. package/src/api/controllers/auth.js +11 -0
  223. package/src/api/controllers/component.ts +57 -0
  224. package/src/api/controllers/datasource.js +21 -8
  225. package/src/api/controllers/deploy/index.ts +1 -6
  226. package/src/api/controllers/integration.js +4 -4
  227. package/src/api/controllers/plugin/file.ts +15 -0
  228. package/src/api/controllers/plugin/github.ts +75 -0
  229. package/src/api/controllers/plugin/index.ts +134 -0
  230. package/src/api/controllers/plugin/npm.ts +56 -0
  231. package/src/api/controllers/plugin/uploaders.ts +4 -0
  232. package/src/api/controllers/plugin/url.ts +12 -0
  233. package/src/api/controllers/plugin/utils.ts +19 -0
  234. package/src/api/controllers/public/mapping/types.ts +8 -0
  235. package/src/api/controllers/row/external.js +1 -1
  236. package/src/api/controllers/screen.ts +122 -0
  237. package/src/api/controllers/static/index.ts +1 -1
  238. package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  239. package/src/api/controllers/static/templates/preview.hbs +5 -1
  240. package/src/api/index.js +1 -1
  241. package/src/api/routes/application.ts +13 -2
  242. package/src/api/routes/index.ts +2 -0
  243. package/src/api/routes/plugin.ts +14 -0
  244. package/src/api/routes/public/rows.ts +1 -82
  245. package/src/api/routes/public/tables.ts +1 -1
  246. package/src/api/routes/table.js +1 -1
  247. package/src/api/routes/tests/query.spec.js +8 -25
  248. package/src/api/routes/tests/user.spec.js +0 -2
  249. package/src/api/routes/utils/validators.js +26 -5
  250. package/src/app.ts +25 -2
  251. package/src/db/utils.js +4 -0
  252. package/src/definitions/openapi.ts +56 -55
  253. package/src/environment.js +1 -0
  254. package/src/integrations/airtable.ts +116 -118
  255. package/src/integrations/arangodb.ts +87 -89
  256. package/src/integrations/base/query.ts +2 -2
  257. package/src/integrations/base/sqlTable.ts +3 -1
  258. package/src/integrations/couchdb.ts +83 -89
  259. package/src/integrations/dynamodb.ts +173 -175
  260. package/src/integrations/elasticsearch.ts +120 -122
  261. package/src/integrations/firebase.ts +157 -159
  262. package/src/integrations/googlesheets.ts +328 -338
  263. package/src/integrations/index.ts +64 -21
  264. package/src/integrations/microsoftSqlServer.ts +249 -251
  265. package/src/integrations/mongodb.ts +261 -258
  266. package/src/integrations/mysql.ts +229 -234
  267. package/src/integrations/oracle.ts +373 -380
  268. package/src/integrations/postgres.ts +264 -268
  269. package/src/integrations/redis.ts +128 -132
  270. package/src/integrations/rest.ts +324 -329
  271. package/src/integrations/s3.ts +68 -71
  272. package/src/integrations/snowflake.ts +80 -82
  273. package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
  274. package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
  275. package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
  276. package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
  277. package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
  278. package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
  279. package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
  280. package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
  281. package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
  282. package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
  283. package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
  284. package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
  285. package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +22 -14
  286. package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
  287. package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
  288. package/src/middleware/currentapp.js +2 -0
  289. package/src/migrations/functions/backfill/global.ts +0 -3
  290. package/src/migrations/index.ts +0 -16
  291. package/src/module.d.ts +2 -0
  292. package/src/tests/utilities/TestConfiguration.js +1 -1
  293. package/src/threads/query.ts +2 -2
  294. package/src/utilities/fileSystem/index.js +123 -0
  295. package/src/utilities/workerRequests.js +8 -0
  296. package/src/watch.ts +38 -0
  297. package/src/websocket.ts +26 -0
  298. package/builder/assets/index.8d12d461.css +0 -6
  299. package/builder/assets/index.d354271c.js +0 -879
  300. package/builder/assets/vendor.5e1fe644.css +0 -1
  301. package/builder/assets/vendor.67dbd8fa.js +0 -248
  302. package/coverage/lcov-report/api/controllers/component.js.html +0 -199
  303. package/coverage/lcov-report/api/controllers/screen.js.html +0 -259
  304. package/dist/migrations/functions/developerQuota.js +0 -49
  305. package/src/api/controllers/component.js +0 -38
  306. package/src/api/controllers/screen.js +0 -58
  307. package/src/migrations/functions/developerQuota.ts +0 -15
  308. package/src/migrations/functions/publishedAppsQuota.ts +0 -13
  309. package/src/migrations/functions/usageQuotas/syncDevelopers.ts +0 -19
  310. package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +0 -21
@@ -16,317 +16,313 @@ import {
16
16
  } from "./utils"
17
17
  import Sql from "./base/sql"
18
18
 
19
- module PostgresModule {
20
- const { Client, types } = require("pg")
21
- const { escapeDangerousCharacters } = require("../utilities")
19
+ const { Client, types } = require("pg")
20
+ const { escapeDangerousCharacters } = require("../utilities")
22
21
 
23
- // Return "date" and "timestamp" types as plain strings.
24
- // This lets us reference the original stored timezone.
25
- // types is undefined when running in a test env for some reason.
26
- if (types) {
27
- types.setTypeParser(1114, (val: any) => val) // timestamp
28
- types.setTypeParser(1082, (val: any) => val) // date
29
- types.setTypeParser(1184, (val: any) => val) // timestampz
30
- }
22
+ // Return "date" and "timestamp" types as plain strings.
23
+ // This lets us reference the original stored timezone.
24
+ // types is undefined when running in a test env for some reason.
25
+ if (types) {
26
+ types.setTypeParser(1114, (val: any) => val) // timestamp
27
+ types.setTypeParser(1082, (val: any) => val) // date
28
+ types.setTypeParser(1184, (val: any) => val) // timestampz
29
+ }
31
30
 
32
- const JSON_REGEX = /'{.*}'::json/s
31
+ const JSON_REGEX = /'{.*}'::json/s
33
32
 
34
- interface PostgresConfig {
35
- host: string
36
- port: number
37
- database: string
38
- user: string
39
- password: string
40
- schema: string
41
- ssl?: boolean
42
- ca?: string
43
- rejectUnauthorized?: boolean
44
- }
33
+ interface PostgresConfig {
34
+ host: string
35
+ port: number
36
+ database: string
37
+ user: string
38
+ password: string
39
+ schema: string
40
+ ssl?: boolean
41
+ ca?: string
42
+ rejectUnauthorized?: boolean
43
+ }
45
44
 
46
- const SCHEMA: Integration = {
47
- docs: "https://node-postgres.com",
48
- plus: true,
49
- friendlyName: "PostgreSQL",
50
- type: "Relational",
51
- description:
52
- "PostgreSQL, also known as Postgres, is a free and open-source relational database management system emphasizing extensibility and SQL compliance.",
53
- datasource: {
54
- host: {
55
- type: DatasourceFieldType.STRING,
56
- default: "localhost",
57
- required: true,
58
- },
59
- port: {
60
- type: DatasourceFieldType.NUMBER,
61
- required: true,
62
- default: 5432,
63
- },
64
- database: {
65
- type: DatasourceFieldType.STRING,
66
- default: "postgres",
67
- required: true,
68
- },
69
- user: {
70
- type: DatasourceFieldType.STRING,
71
- default: "root",
72
- required: true,
73
- },
74
- password: {
75
- type: DatasourceFieldType.PASSWORD,
76
- default: "root",
77
- required: true,
78
- },
79
- schema: {
80
- type: DatasourceFieldType.STRING,
81
- default: "public",
82
- required: true,
83
- },
84
- ssl: {
85
- type: DatasourceFieldType.BOOLEAN,
86
- default: false,
87
- required: false,
88
- },
89
- rejectUnauthorized: {
90
- type: DatasourceFieldType.BOOLEAN,
91
- default: false,
92
- required: false,
93
- },
94
- ca: {
95
- type: DatasourceFieldType.LONGFORM,
96
- default: false,
97
- required: false,
98
- },
45
+ const SCHEMA: Integration = {
46
+ docs: "https://node-postgres.com",
47
+ plus: true,
48
+ friendlyName: "PostgreSQL",
49
+ type: "Relational",
50
+ description:
51
+ "PostgreSQL, also known as Postgres, is a free and open-source relational database management system emphasizing extensibility and SQL compliance.",
52
+ datasource: {
53
+ host: {
54
+ type: DatasourceFieldType.STRING,
55
+ default: "localhost",
56
+ required: true,
99
57
  },
100
- query: {
101
- create: {
102
- type: QueryType.SQL,
103
- },
104
- read: {
105
- type: QueryType.SQL,
106
- },
107
- update: {
108
- type: QueryType.SQL,
109
- },
110
- delete: {
111
- type: QueryType.SQL,
112
- },
58
+ port: {
59
+ type: DatasourceFieldType.NUMBER,
60
+ required: true,
61
+ default: 5432,
113
62
  },
114
- }
63
+ database: {
64
+ type: DatasourceFieldType.STRING,
65
+ default: "postgres",
66
+ required: true,
67
+ },
68
+ user: {
69
+ type: DatasourceFieldType.STRING,
70
+ default: "root",
71
+ required: true,
72
+ },
73
+ password: {
74
+ type: DatasourceFieldType.PASSWORD,
75
+ default: "root",
76
+ required: true,
77
+ },
78
+ schema: {
79
+ type: DatasourceFieldType.STRING,
80
+ default: "public",
81
+ required: true,
82
+ },
83
+ ssl: {
84
+ type: DatasourceFieldType.BOOLEAN,
85
+ default: false,
86
+ required: false,
87
+ },
88
+ rejectUnauthorized: {
89
+ type: DatasourceFieldType.BOOLEAN,
90
+ default: false,
91
+ required: false,
92
+ },
93
+ ca: {
94
+ type: DatasourceFieldType.LONGFORM,
95
+ default: false,
96
+ required: false,
97
+ },
98
+ },
99
+ query: {
100
+ create: {
101
+ type: QueryType.SQL,
102
+ },
103
+ read: {
104
+ type: QueryType.SQL,
105
+ },
106
+ update: {
107
+ type: QueryType.SQL,
108
+ },
109
+ delete: {
110
+ type: QueryType.SQL,
111
+ },
112
+ },
113
+ }
115
114
 
116
- class PostgresIntegration extends Sql implements DatasourcePlus {
117
- private readonly client: any
118
- private readonly config: PostgresConfig
119
- private index: number = 1
120
- private open: boolean
121
- public tables: Record<string, Table> = {}
122
- public schemaErrors: Record<string, string> = {}
115
+ class PostgresIntegration extends Sql implements DatasourcePlus {
116
+ private readonly client: any
117
+ private readonly config: PostgresConfig
118
+ private index: number = 1
119
+ private open: boolean
120
+ public tables: Record<string, Table> = {}
121
+ public schemaErrors: Record<string, string> = {}
123
122
 
124
- COLUMNS_SQL!: string
123
+ COLUMNS_SQL!: string
125
124
 
126
- PRIMARY_KEYS_SQL = `
127
- select tc.table_schema, tc.table_name, kc.column_name as primary_key
128
- from information_schema.table_constraints tc
129
- join
130
- information_schema.key_column_usage kc on kc.table_name = tc.table_name
131
- and kc.table_schema = tc.table_schema
132
- and kc.constraint_name = tc.constraint_name
133
- where tc.constraint_type = 'PRIMARY KEY';
134
- `
125
+ PRIMARY_KEYS_SQL = `
126
+ select tc.table_schema, tc.table_name, kc.column_name as primary_key
127
+ from information_schema.table_constraints tc
128
+ join
129
+ information_schema.key_column_usage kc on kc.table_name = tc.table_name
130
+ and kc.table_schema = tc.table_schema
131
+ and kc.constraint_name = tc.constraint_name
132
+ where tc.constraint_type = 'PRIMARY KEY';
133
+ `
135
134
 
136
- constructor(config: PostgresConfig) {
137
- super(SqlClient.POSTGRES)
138
- this.config = config
135
+ constructor(config: PostgresConfig) {
136
+ super(SqlClient.POSTGRES)
137
+ this.config = config
139
138
 
140
- let newConfig = {
141
- ...this.config,
142
- ssl: this.config.ssl
143
- ? {
144
- rejectUnauthorized: this.config.rejectUnauthorized,
145
- ca: this.config.ca,
146
- }
147
- : undefined,
148
- }
149
- this.client = new Client(newConfig)
150
- this.open = false
139
+ let newConfig = {
140
+ ...this.config,
141
+ ssl: this.config.ssl
142
+ ? {
143
+ rejectUnauthorized: this.config.rejectUnauthorized,
144
+ ca: this.config.ca,
145
+ }
146
+ : undefined,
151
147
  }
148
+ this.client = new Client(newConfig)
149
+ this.open = false
150
+ }
152
151
 
153
- getBindingIdentifier(): string {
154
- return `$${this.index++}`
155
- }
152
+ getBindingIdentifier(): string {
153
+ return `$${this.index++}`
154
+ }
156
155
 
157
- getStringConcat(parts: string[]): string {
158
- return parts.join(" || ")
159
- }
156
+ getStringConcat(parts: string[]): string {
157
+ return parts.join(" || ")
158
+ }
160
159
 
161
- async openConnection() {
162
- await this.client.connect()
163
- if (!this.config.schema) {
164
- this.config.schema = "public"
165
- }
166
- this.client.query(`SET search_path TO ${this.config.schema}`)
167
- this.COLUMNS_SQL = `select * from information_schema.columns where table_schema = '${this.config.schema}'`
168
- this.open = true
160
+ async openConnection() {
161
+ await this.client.connect()
162
+ if (!this.config.schema) {
163
+ this.config.schema = "public"
169
164
  }
165
+ this.client.query(`SET search_path TO ${this.config.schema}`)
166
+ this.COLUMNS_SQL = `select * from information_schema.columns where table_schema = '${this.config.schema}'`
167
+ this.open = true
168
+ }
170
169
 
171
- closeConnection() {
172
- const pg = this
173
- return new Promise<void>((resolve, reject) => {
174
- this.client.end((err: any) => {
175
- pg.open = false
176
- if (err) {
177
- reject(err)
178
- } else {
179
- resolve()
180
- }
181
- })
170
+ closeConnection() {
171
+ const pg = this
172
+ return new Promise<void>((resolve, reject) => {
173
+ this.client.end((err: any) => {
174
+ pg.open = false
175
+ if (err) {
176
+ reject(err)
177
+ } else {
178
+ resolve()
179
+ }
182
180
  })
183
- }
181
+ })
182
+ }
184
183
 
185
- async internalQuery(query: SqlQuery, close: boolean = true) {
186
- if (!this.open) {
187
- await this.openConnection()
188
- }
189
- const client = this.client
190
- this.index = 1
191
- // need to handle a specific issue with json data types in postgres,
192
- // new lines inside the JSON data will break it
193
- if (query && query.sql) {
194
- const matches = query.sql.match(JSON_REGEX)
195
- if (matches && matches.length > 0) {
196
- for (let match of matches) {
197
- const escaped = escapeDangerousCharacters(match)
198
- query.sql = query.sql.replace(match, escaped)
199
- }
184
+ async internalQuery(query: SqlQuery, close: boolean = true) {
185
+ if (!this.open) {
186
+ await this.openConnection()
187
+ }
188
+ const client = this.client
189
+ this.index = 1
190
+ // need to handle a specific issue with json data types in postgres,
191
+ // new lines inside the JSON data will break it
192
+ if (query && query.sql) {
193
+ const matches = query.sql.match(JSON_REGEX)
194
+ if (matches && matches.length > 0) {
195
+ for (let match of matches) {
196
+ const escaped = escapeDangerousCharacters(match)
197
+ query.sql = query.sql.replace(match, escaped)
200
198
  }
201
199
  }
202
- try {
203
- return await client.query(query.sql, query.bindings || [])
204
- } catch (err) {
200
+ }
201
+ try {
202
+ return await client.query(query.sql, query.bindings || [])
203
+ } catch (err) {
204
+ await this.closeConnection()
205
+ // @ts-ignore
206
+ throw new Error(err)
207
+ } finally {
208
+ if (close) {
205
209
  await this.closeConnection()
206
- // @ts-ignore
207
- throw new Error(err)
208
- } finally {
209
- if (close) {
210
- await this.closeConnection()
211
- }
212
210
  }
213
211
  }
212
+ }
214
213
 
215
- /**
216
- * Fetches the tables from the postgres table and assigns them to the datasource.
217
- * @param {*} datasourceId - datasourceId to fetch
218
- * @param entities - the tables that are to be built
219
- */
220
- async buildSchema(datasourceId: string, entities: Record<string, Table>) {
221
- let tableKeys: { [key: string]: string[] } = {}
222
- await this.openConnection()
223
- try {
224
- const primaryKeysResponse = await this.client.query(
225
- this.PRIMARY_KEYS_SQL
226
- )
227
- for (let table of primaryKeysResponse.rows) {
228
- const tableName = table.table_name
229
- if (!tableKeys[tableName]) {
230
- tableKeys[tableName] = []
231
- }
232
- const key = table.column_name || table.primary_key
233
- // only add the unique keys
234
- if (key && tableKeys[tableName].indexOf(key) === -1) {
235
- tableKeys[tableName].push(key)
236
- }
214
+ /**
215
+ * Fetches the tables from the postgres table and assigns them to the datasource.
216
+ * @param {*} datasourceId - datasourceId to fetch
217
+ * @param entities - the tables that are to be built
218
+ */
219
+ async buildSchema(datasourceId: string, entities: Record<string, Table>) {
220
+ let tableKeys: { [key: string]: string[] } = {}
221
+ await this.openConnection()
222
+ try {
223
+ const primaryKeysResponse = await this.client.query(this.PRIMARY_KEYS_SQL)
224
+ for (let table of primaryKeysResponse.rows) {
225
+ const tableName = table.table_name
226
+ if (!tableKeys[tableName]) {
227
+ tableKeys[tableName] = []
228
+ }
229
+ const key = table.column_name || table.primary_key
230
+ // only add the unique keys
231
+ if (key && tableKeys[tableName].indexOf(key) === -1) {
232
+ tableKeys[tableName].push(key)
237
233
  }
238
- } catch (err) {
239
- tableKeys = {}
240
234
  }
235
+ } catch (err) {
236
+ tableKeys = {}
237
+ }
241
238
 
242
- try {
243
- const columnsResponse = await this.client.query(this.COLUMNS_SQL)
244
-
245
- const tables: { [key: string]: Table } = {}
239
+ try {
240
+ const columnsResponse = await this.client.query(this.COLUMNS_SQL)
246
241
 
247
- for (let column of columnsResponse.rows) {
248
- const tableName: string = column.table_name
249
- const columnName: string = column.column_name
242
+ const tables: { [key: string]: Table } = {}
250
243
 
251
- // table key doesn't exist yet
252
- if (!tables[tableName] || !tables[tableName].schema) {
253
- tables[tableName] = {
254
- _id: buildExternalTableId(datasourceId, tableName),
255
- primary: tableKeys[tableName] || [],
256
- name: tableName,
257
- schema: {},
258
- }
259
- }
244
+ for (let column of columnsResponse.rows) {
245
+ const tableName: string = column.table_name
246
+ const columnName: string = column.column_name
260
247
 
261
- const identity = !!(
262
- column.identity_generation ||
263
- column.identity_start ||
264
- column.identity_increment
265
- )
266
- const hasDefault =
267
- typeof column.column_default === "string" &&
268
- column.column_default.startsWith("nextval")
269
- const isGenerated =
270
- column.is_generated && column.is_generated !== "NEVER"
271
- const isAuto: boolean = hasDefault || identity || isGenerated
272
- tables[tableName].schema[columnName] = {
273
- autocolumn: isAuto,
274
- name: columnName,
275
- ...convertSqlType(column.data_type),
276
- externalType: column.data_type,
248
+ // table key doesn't exist yet
249
+ if (!tables[tableName] || !tables[tableName].schema) {
250
+ tables[tableName] = {
251
+ _id: buildExternalTableId(datasourceId, tableName),
252
+ primary: tableKeys[tableName] || [],
253
+ name: tableName,
254
+ schema: {},
277
255
  }
278
256
  }
279
257
 
280
- const final = finaliseExternalTables(tables, entities)
281
- this.tables = final.tables
282
- this.schemaErrors = final.errors
283
- } catch (err) {
284
- // @ts-ignore
285
- throw new Error(err)
286
- } finally {
287
- await this.closeConnection()
258
+ const identity = !!(
259
+ column.identity_generation ||
260
+ column.identity_start ||
261
+ column.identity_increment
262
+ )
263
+ const hasDefault =
264
+ typeof column.column_default === "string" &&
265
+ column.column_default.startsWith("nextval")
266
+ const isGenerated =
267
+ column.is_generated && column.is_generated !== "NEVER"
268
+ const isAuto: boolean = hasDefault || identity || isGenerated
269
+ tables[tableName].schema[columnName] = {
270
+ autocolumn: isAuto,
271
+ name: columnName,
272
+ ...convertSqlType(column.data_type),
273
+ externalType: column.data_type,
274
+ }
288
275
  }
289
- }
290
276
 
291
- async create(query: SqlQuery | string) {
292
- const response = await this.internalQuery(getSqlQuery(query))
293
- return response.rows.length ? response.rows : [{ created: true }]
277
+ const final = finaliseExternalTables(tables, entities)
278
+ this.tables = final.tables
279
+ this.schemaErrors = final.errors
280
+ } catch (err) {
281
+ // @ts-ignore
282
+ throw new Error(err)
283
+ } finally {
284
+ await this.closeConnection()
294
285
  }
286
+ }
295
287
 
296
- async read(query: SqlQuery | string) {
297
- const response = await this.internalQuery(getSqlQuery(query))
298
- return response.rows
299
- }
288
+ async create(query: SqlQuery | string) {
289
+ const response = await this.internalQuery(getSqlQuery(query))
290
+ return response.rows.length ? response.rows : [{ created: true }]
291
+ }
300
292
 
301
- async update(query: SqlQuery | string) {
302
- const response = await this.internalQuery(getSqlQuery(query))
303
- return response.rows.length ? response.rows : [{ updated: true }]
304
- }
293
+ async read(query: SqlQuery | string) {
294
+ const response = await this.internalQuery(getSqlQuery(query))
295
+ return response.rows
296
+ }
305
297
 
306
- async delete(query: SqlQuery | string) {
307
- const response = await this.internalQuery(getSqlQuery(query))
308
- return response.rows.length ? response.rows : [{ deleted: true }]
309
- }
298
+ async update(query: SqlQuery | string) {
299
+ const response = await this.internalQuery(getSqlQuery(query))
300
+ return response.rows.length ? response.rows : [{ updated: true }]
301
+ }
310
302
 
311
- async query(json: QueryJson) {
312
- const operation = this._operation(json).toLowerCase()
313
- const input = this._query(json)
314
- if (Array.isArray(input)) {
315
- const responses = []
316
- for (let query of input) {
317
- responses.push(await this.internalQuery(query, false))
318
- }
319
- await this.closeConnection()
320
- return responses
321
- } else {
322
- const response = await this.internalQuery(input)
323
- return response.rows.length ? response.rows : [{ [operation]: true }]
303
+ async delete(query: SqlQuery | string) {
304
+ const response = await this.internalQuery(getSqlQuery(query))
305
+ return response.rows.length ? response.rows : [{ deleted: true }]
306
+ }
307
+
308
+ async query(json: QueryJson) {
309
+ const operation = this._operation(json).toLowerCase()
310
+ const input = this._query(json)
311
+ if (Array.isArray(input)) {
312
+ const responses = []
313
+ for (let query of input) {
314
+ responses.push(await this.internalQuery(query, false))
324
315
  }
316
+ await this.closeConnection()
317
+ return responses
318
+ } else {
319
+ const response = await this.internalQuery(input)
320
+ return response.rows.length ? response.rows : [{ [operation]: true }]
325
321
  }
326
322
  }
323
+ }
327
324
 
328
- module.exports = {
329
- schema: SCHEMA,
330
- integration: PostgresIntegration,
331
- }
325
+ export default {
326
+ schema: SCHEMA,
327
+ integration: PostgresIntegration,
332
328
  }