@budibase/server 1.3.21-alpha.1 → 1.3.21

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