@budibase/server 1.3.19 → 1.3.21-alpha.0

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 (308) hide show
  1. package/__mocks__/mongodb.ts +1 -1
  2. package/builder/assets/index.75653b72.js +1005 -0
  3. package/builder/assets/index.f1b70f52.css +6 -0
  4. package/builder/index.html +2 -4
  5. package/coverage/clover.xml +451 -390
  6. package/coverage/coverage-final.json +21 -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/component.js.html +68 -11
  13. package/coverage/lcov-report/api/controllers/datasource.js.html +73 -34
  14. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/index.html +46 -46
  16. package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
  17. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  22. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/external.js.html +2 -2
  26. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/screen.js.html +207 -12
  32. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  36. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  45. package/coverage/lcov-report/api/index.html +1 -1
  46. package/coverage/lcov-report/api/index.js.html +13 -13
  47. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/index.html +1 -1
  58. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/table.js.html +2 -2
  69. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/utils/index.html +9 -9
  72. package/coverage/lcov-report/api/routes/utils/validators.js.html +75 -12
  73. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  75. package/coverage/lcov-report/automations/actions.js.html +1 -1
  76. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  77. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  78. package/coverage/lcov-report/automations/index.html +1 -1
  79. package/coverage/lcov-report/automations/index.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/index.html +1 -1
  87. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  105. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  106. package/coverage/lcov-report/constants/index.html +1 -1
  107. package/coverage/lcov-report/constants/index.js.html +1 -1
  108. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  109. package/coverage/lcov-report/constants/screens.js.html +1 -1
  110. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  111. package/coverage/lcov-report/db/index.html +18 -18
  112. package/coverage/lcov-report/db/index.js.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  116. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  117. package/coverage/lcov-report/db/newid.js.html +2 -2
  118. package/coverage/lcov-report/db/utils.js.html +56 -20
  119. package/coverage/lcov-report/events/AutomationEmitter.js.html +3 -3
  120. package/coverage/lcov-report/events/index.html +1 -1
  121. package/coverage/lcov-report/events/index.js.html +1 -1
  122. package/coverage/lcov-report/events/utils.js.html +1 -1
  123. package/coverage/lcov-report/index.html +46 -46
  124. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  125. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  126. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  127. package/coverage/lcov-report/middleware/builder.js.html +12 -12
  128. package/coverage/lcov-report/middleware/currentapp.js.html +46 -40
  129. package/coverage/lcov-report/middleware/index.html +15 -15
  130. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  131. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  132. package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
  133. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  134. package/coverage/lcov-report/middleware/utils.js.html +2 -2
  135. package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
  136. package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
  137. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  138. package/coverage/lcov-report/utilities/global.js.html +16 -16
  139. package/coverage/lcov-report/utilities/index.html +15 -15
  140. package/coverage/lcov-report/utilities/index.js.html +24 -24
  141. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
  142. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  143. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  144. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  146. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  147. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  148. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  149. package/coverage/lcov-report/utilities/security.js.html +2 -2
  150. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  151. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  152. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  153. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  154. package/coverage/lcov-report/utilities/users.js.html +1 -1
  155. package/coverage/lcov-report/utilities/workerRequests.js.html +32 -8
  156. package/coverage/lcov.info +798 -672
  157. package/dist/api/controllers/application.js +5 -5
  158. package/dist/api/controllers/auth.js +9 -0
  159. package/dist/api/controllers/component.js +14 -1
  160. package/dist/api/controllers/datasource.js +21 -8
  161. package/dist/api/controllers/deploy/index.js +1 -8
  162. package/dist/api/controllers/integration.js +4 -4
  163. package/dist/{migrations/functions/usageQuotas/syncDevelopers.js → api/controllers/plugin/file.js} +13 -13
  164. package/dist/api/controllers/plugin/github.js +69 -0
  165. package/dist/api/controllers/plugin/index.js +200 -0
  166. package/dist/api/controllers/plugin/npm.js +58 -0
  167. package/dist/api/controllers/plugin/uploaders.js +11 -0
  168. package/dist/{migrations/functions/usageQuotas/syncPublishedApps.js → api/controllers/plugin/url.js} +13 -15
  169. package/dist/api/controllers/plugin/utils.js +26 -0
  170. package/dist/api/controllers/row/external.js +1 -1
  171. package/dist/api/controllers/screen.js +52 -2
  172. package/dist/api/controllers/static/index.js +1 -0
  173. package/dist/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  174. package/dist/api/controllers/static/templates/preview.hbs +5 -1
  175. package/dist/api/index.js +1 -1
  176. package/dist/api/routes/application.js +3 -2
  177. package/dist/api/routes/index.js +2 -0
  178. package/dist/{migrations/functions/publishedAppsQuota.js → api/routes/plugin.js} +13 -21
  179. package/dist/api/routes/public/rows.js +1 -82
  180. package/dist/api/routes/public/tables.js +1 -1
  181. package/dist/api/routes/table.js +1 -1
  182. package/dist/api/routes/utils/validators.js +20 -2
  183. package/dist/app.js +16 -1
  184. package/dist/db/utils.js +10 -1
  185. package/dist/environment.js +1 -0
  186. package/dist/integrations/airtable.js +126 -129
  187. package/dist/integrations/arangodb.js +86 -89
  188. package/dist/integrations/base/query.js +2 -2
  189. package/dist/integrations/base/sqlTable.js +3 -1
  190. package/dist/integrations/couchdb.js +80 -83
  191. package/dist/integrations/dynamodb.js +161 -164
  192. package/dist/integrations/elasticsearch.js +135 -138
  193. package/dist/integrations/firebase.js +154 -157
  194. package/dist/integrations/googlesheets.js +323 -327
  195. package/dist/integrations/index.js +99 -51
  196. package/dist/integrations/microsoftSqlServer.js +240 -243
  197. package/dist/integrations/mongodb.js +239 -242
  198. package/dist/integrations/mysql.js +215 -219
  199. package/dist/integrations/oracle.js +318 -322
  200. package/dist/integrations/postgres.js +262 -265
  201. package/dist/integrations/redis.js +134 -139
  202. package/dist/integrations/rest.js +289 -292
  203. package/dist/integrations/s3.js +61 -64
  204. package/dist/integrations/snowflake.js +83 -86
  205. package/dist/middleware/currentapp.js +2 -0
  206. package/dist/migrations/functions/backfill/global.js +0 -3
  207. package/dist/migrations/index.js +0 -10
  208. package/dist/package.json +9 -6
  209. package/dist/tests/utilities/TestConfiguration.js +1 -1
  210. package/dist/threads/query.js +2 -2
  211. package/dist/tsconfig.build.tsbuildinfo +1 -1
  212. package/dist/utilities/fileSystem/index.js +111 -1
  213. package/dist/utilities/workerRequests.js +4 -0
  214. package/dist/watch.js +77 -0
  215. package/dist/websocket.js +22 -0
  216. package/package.json +10 -7
  217. package/scripts/dev/manage.js +4 -0
  218. package/scripts/localdomain.js +3 -1
  219. package/specs/openapi.json +115 -112
  220. package/specs/openapi.yaml +96 -94
  221. package/specs/resources/misc.js +116 -0
  222. package/specs/resources/query.js +1 -1
  223. package/src/api/controllers/application.ts +1 -2
  224. package/src/api/controllers/auth.js +11 -0
  225. package/src/api/controllers/component.js +21 -2
  226. package/src/api/controllers/datasource.js +21 -8
  227. package/src/api/controllers/deploy/index.ts +1 -6
  228. package/src/api/controllers/integration.js +4 -4
  229. package/src/api/controllers/plugin/file.ts +15 -0
  230. package/src/api/controllers/plugin/github.ts +75 -0
  231. package/src/api/controllers/plugin/index.ts +215 -0
  232. package/src/api/controllers/plugin/npm.ts +56 -0
  233. package/src/api/controllers/plugin/uploaders.ts +4 -0
  234. package/src/api/controllers/plugin/url.ts +12 -0
  235. package/src/api/controllers/plugin/utils.ts +19 -0
  236. package/src/api/controllers/public/mapping/types.ts +8 -0
  237. package/src/api/controllers/row/external.js +1 -1
  238. package/src/api/controllers/screen.js +66 -1
  239. package/src/api/controllers/static/index.ts +1 -1
  240. package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
  241. package/src/api/controllers/static/templates/preview.hbs +5 -1
  242. package/src/api/index.js +1 -1
  243. package/src/api/routes/application.ts +13 -2
  244. package/src/api/routes/index.ts +2 -0
  245. package/src/api/routes/plugin.ts +14 -0
  246. package/src/api/routes/public/rows.ts +1 -82
  247. package/src/api/routes/public/tables.ts +1 -1
  248. package/src/api/routes/table.js +1 -1
  249. package/src/api/routes/tests/query.spec.js +8 -25
  250. package/src/api/routes/tests/user.spec.js +0 -2
  251. package/src/api/routes/utils/validators.js +26 -5
  252. package/src/app.ts +25 -2
  253. package/src/db/utils.js +12 -0
  254. package/src/definitions/openapi.ts +56 -55
  255. package/src/environment.js +1 -0
  256. package/src/integrations/airtable.ts +116 -118
  257. package/src/integrations/arangodb.ts +87 -89
  258. package/src/integrations/base/query.ts +2 -2
  259. package/src/integrations/base/sqlTable.ts +3 -1
  260. package/src/integrations/couchdb.ts +83 -89
  261. package/src/integrations/dynamodb.ts +173 -175
  262. package/src/integrations/elasticsearch.ts +120 -122
  263. package/src/integrations/firebase.ts +157 -159
  264. package/src/integrations/googlesheets.ts +328 -338
  265. package/src/integrations/index.ts +64 -21
  266. package/src/integrations/microsoftSqlServer.ts +249 -251
  267. package/src/integrations/mongodb.ts +261 -258
  268. package/src/integrations/mysql.ts +229 -234
  269. package/src/integrations/oracle.ts +373 -380
  270. package/src/integrations/postgres.ts +264 -268
  271. package/src/integrations/redis.ts +128 -132
  272. package/src/integrations/rest.ts +324 -329
  273. package/src/integrations/s3.ts +68 -71
  274. package/src/integrations/snowflake.ts +80 -82
  275. package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
  276. package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
  277. package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
  278. package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
  279. package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
  280. package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
  281. package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
  282. package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
  283. package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
  284. package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
  285. package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
  286. package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
  287. package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +22 -14
  288. package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
  289. package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
  290. package/src/middleware/currentapp.js +2 -0
  291. package/src/migrations/functions/backfill/global.ts +0 -3
  292. package/src/migrations/index.ts +0 -16
  293. package/src/module.d.ts +2 -0
  294. package/src/tests/utilities/TestConfiguration.js +1 -1
  295. package/src/threads/query.ts +2 -2
  296. package/src/utilities/fileSystem/index.js +130 -0
  297. package/src/utilities/workerRequests.js +8 -0
  298. package/src/watch.ts +38 -0
  299. package/src/websocket.ts +26 -0
  300. package/builder/assets/index.9ce4f8c5.css +0 -6
  301. package/builder/assets/index.a1f7532b.js +0 -876
  302. package/builder/assets/vendor.5e1fe644.css +0 -1
  303. package/builder/assets/vendor.67dbd8fa.js +0 -248
  304. package/dist/migrations/functions/developerQuota.js +0 -49
  305. package/src/migrations/functions/developerQuota.ts +0 -15
  306. package/src/migrations/functions/publishedAppsQuota.ts +0 -13
  307. package/src/migrations/functions/usageQuotas/syncDevelopers.ts +0 -19
  308. 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
  }