@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
@@ -15,284 +15,281 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  const types_1 = require("@budibase/types");
16
16
  const utils_1 = require("./utils");
17
17
  const sql_1 = __importDefault(require("./base/sql"));
18
- var PostgresModule;
19
- (function (PostgresModule) {
20
- const { Client, types } = require("pg");
21
- const { escapeDangerousCharacters } = require("../utilities");
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) => val); // timestamp
27
- types.setTypeParser(1082, (val) => val); // date
28
- types.setTypeParser(1184, (val) => val); // timestampz
29
- }
30
- const JSON_REGEX = /'{.*}'::json/s;
31
- const SCHEMA = {
32
- docs: "https://node-postgres.com",
33
- plus: true,
34
- friendlyName: "PostgreSQL",
35
- type: "Relational",
36
- description: "PostgreSQL, also known as Postgres, is a free and open-source relational database management system emphasizing extensibility and SQL compliance.",
37
- datasource: {
38
- host: {
39
- type: types_1.DatasourceFieldType.STRING,
40
- default: "localhost",
41
- required: true,
42
- },
43
- port: {
44
- type: types_1.DatasourceFieldType.NUMBER,
45
- required: true,
46
- default: 5432,
47
- },
48
- database: {
49
- type: types_1.DatasourceFieldType.STRING,
50
- default: "postgres",
51
- required: true,
52
- },
53
- user: {
54
- type: types_1.DatasourceFieldType.STRING,
55
- default: "root",
56
- required: true,
57
- },
58
- password: {
59
- type: types_1.DatasourceFieldType.PASSWORD,
60
- default: "root",
61
- required: true,
62
- },
63
- schema: {
64
- type: types_1.DatasourceFieldType.STRING,
65
- default: "public",
66
- required: true,
67
- },
68
- ssl: {
69
- type: types_1.DatasourceFieldType.BOOLEAN,
70
- default: false,
71
- required: false,
72
- },
73
- rejectUnauthorized: {
74
- type: types_1.DatasourceFieldType.BOOLEAN,
75
- default: false,
76
- required: false,
77
- },
78
- ca: {
79
- type: types_1.DatasourceFieldType.LONGFORM,
80
- default: false,
81
- required: false,
82
- },
18
+ const { Client, types } = require("pg");
19
+ const { escapeDangerousCharacters } = require("../utilities");
20
+ // Return "date" and "timestamp" types as plain strings.
21
+ // This lets us reference the original stored timezone.
22
+ // types is undefined when running in a test env for some reason.
23
+ if (types) {
24
+ types.setTypeParser(1114, (val) => val); // timestamp
25
+ types.setTypeParser(1082, (val) => val); // date
26
+ types.setTypeParser(1184, (val) => val); // timestampz
27
+ }
28
+ const JSON_REGEX = /'{.*}'::json/s;
29
+ const SCHEMA = {
30
+ docs: "https://node-postgres.com",
31
+ plus: true,
32
+ friendlyName: "PostgreSQL",
33
+ type: "Relational",
34
+ description: "PostgreSQL, also known as Postgres, is a free and open-source relational database management system emphasizing extensibility and SQL compliance.",
35
+ datasource: {
36
+ host: {
37
+ type: types_1.DatasourceFieldType.STRING,
38
+ default: "localhost",
39
+ required: true,
83
40
  },
84
- query: {
85
- create: {
86
- type: types_1.QueryType.SQL,
87
- },
88
- read: {
89
- type: types_1.QueryType.SQL,
90
- },
91
- update: {
92
- type: types_1.QueryType.SQL,
93
- },
94
- delete: {
95
- type: types_1.QueryType.SQL,
96
- },
41
+ port: {
42
+ type: types_1.DatasourceFieldType.NUMBER,
43
+ required: true,
44
+ default: 5432,
97
45
  },
98
- };
99
- class PostgresIntegration extends sql_1.default {
100
- constructor(config) {
101
- super(utils_1.SqlClient.POSTGRES);
102
- this.index = 1;
103
- this.tables = {};
104
- this.schemaErrors = {};
105
- this.PRIMARY_KEYS_SQL = `
106
- select tc.table_schema, tc.table_name, kc.column_name as primary_key
107
- from information_schema.table_constraints tc
108
- join
109
- information_schema.key_column_usage kc on kc.table_name = tc.table_name
110
- and kc.table_schema = tc.table_schema
111
- and kc.constraint_name = tc.constraint_name
112
- where tc.constraint_type = 'PRIMARY KEY';
113
- `;
114
- this.config = config;
115
- let newConfig = Object.assign(Object.assign({}, this.config), { ssl: this.config.ssl
116
- ? {
117
- rejectUnauthorized: this.config.rejectUnauthorized,
118
- ca: this.config.ca,
119
- }
120
- : undefined });
121
- this.client = new Client(newConfig);
122
- this.open = false;
123
- }
124
- getBindingIdentifier() {
125
- return `$${this.index++}`;
126
- }
127
- getStringConcat(parts) {
128
- return parts.join(" || ");
129
- }
130
- openConnection() {
131
- return __awaiter(this, void 0, void 0, function* () {
132
- yield this.client.connect();
133
- if (!this.config.schema) {
134
- this.config.schema = "public";
135
- }
136
- this.client.query(`SET search_path TO ${this.config.schema}`);
137
- this.COLUMNS_SQL = `select * from information_schema.columns where table_schema = '${this.config.schema}'`;
138
- this.open = true;
139
- });
140
- }
141
- closeConnection() {
142
- const pg = this;
143
- return new Promise((resolve, reject) => {
144
- this.client.end((err) => {
145
- pg.open = false;
146
- if (err) {
147
- reject(err);
148
- }
149
- else {
150
- resolve();
151
- }
152
- });
153
- });
154
- }
155
- internalQuery(query, close = true) {
156
- return __awaiter(this, void 0, void 0, function* () {
157
- if (!this.open) {
158
- yield this.openConnection();
159
- }
160
- const client = this.client;
161
- this.index = 1;
162
- // need to handle a specific issue with json data types in postgres,
163
- // new lines inside the JSON data will break it
164
- if (query && query.sql) {
165
- const matches = query.sql.match(JSON_REGEX);
166
- if (matches && matches.length > 0) {
167
- for (let match of matches) {
168
- const escaped = escapeDangerousCharacters(match);
169
- query.sql = query.sql.replace(match, escaped);
170
- }
171
- }
172
- }
173
- try {
174
- return yield client.query(query.sql, query.bindings || []);
46
+ database: {
47
+ type: types_1.DatasourceFieldType.STRING,
48
+ default: "postgres",
49
+ required: true,
50
+ },
51
+ user: {
52
+ type: types_1.DatasourceFieldType.STRING,
53
+ default: "root",
54
+ required: true,
55
+ },
56
+ password: {
57
+ type: types_1.DatasourceFieldType.PASSWORD,
58
+ default: "root",
59
+ required: true,
60
+ },
61
+ schema: {
62
+ type: types_1.DatasourceFieldType.STRING,
63
+ default: "public",
64
+ required: true,
65
+ },
66
+ ssl: {
67
+ type: types_1.DatasourceFieldType.BOOLEAN,
68
+ default: false,
69
+ required: false,
70
+ },
71
+ rejectUnauthorized: {
72
+ type: types_1.DatasourceFieldType.BOOLEAN,
73
+ default: false,
74
+ required: false,
75
+ },
76
+ ca: {
77
+ type: types_1.DatasourceFieldType.LONGFORM,
78
+ default: false,
79
+ required: false,
80
+ },
81
+ },
82
+ query: {
83
+ create: {
84
+ type: types_1.QueryType.SQL,
85
+ },
86
+ read: {
87
+ type: types_1.QueryType.SQL,
88
+ },
89
+ update: {
90
+ type: types_1.QueryType.SQL,
91
+ },
92
+ delete: {
93
+ type: types_1.QueryType.SQL,
94
+ },
95
+ },
96
+ };
97
+ class PostgresIntegration extends sql_1.default {
98
+ constructor(config) {
99
+ super(utils_1.SqlClient.POSTGRES);
100
+ this.index = 1;
101
+ this.tables = {};
102
+ this.schemaErrors = {};
103
+ this.PRIMARY_KEYS_SQL = `
104
+ select tc.table_schema, tc.table_name, kc.column_name as primary_key
105
+ from information_schema.table_constraints tc
106
+ join
107
+ information_schema.key_column_usage kc on kc.table_name = tc.table_name
108
+ and kc.table_schema = tc.table_schema
109
+ and kc.constraint_name = tc.constraint_name
110
+ where tc.constraint_type = 'PRIMARY KEY';
111
+ `;
112
+ this.config = config;
113
+ let newConfig = Object.assign(Object.assign({}, this.config), { ssl: this.config.ssl
114
+ ? {
115
+ rejectUnauthorized: this.config.rejectUnauthorized,
116
+ ca: this.config.ca,
175
117
  }
176
- catch (err) {
177
- yield this.closeConnection();
178
- // @ts-ignore
179
- throw new Error(err);
118
+ : undefined });
119
+ this.client = new Client(newConfig);
120
+ this.open = false;
121
+ }
122
+ getBindingIdentifier() {
123
+ return `$${this.index++}`;
124
+ }
125
+ getStringConcat(parts) {
126
+ return parts.join(" || ");
127
+ }
128
+ openConnection() {
129
+ return __awaiter(this, void 0, void 0, function* () {
130
+ yield this.client.connect();
131
+ if (!this.config.schema) {
132
+ this.config.schema = "public";
133
+ }
134
+ this.client.query(`SET search_path TO ${this.config.schema}`);
135
+ this.COLUMNS_SQL = `select * from information_schema.columns where table_schema = '${this.config.schema}'`;
136
+ this.open = true;
137
+ });
138
+ }
139
+ closeConnection() {
140
+ const pg = this;
141
+ return new Promise((resolve, reject) => {
142
+ this.client.end((err) => {
143
+ pg.open = false;
144
+ if (err) {
145
+ reject(err);
180
146
  }
181
- finally {
182
- if (close) {
183
- yield this.closeConnection();
184
- }
147
+ else {
148
+ resolve();
185
149
  }
186
150
  });
187
- }
188
- /**
189
- * Fetches the tables from the postgres table and assigns them to the datasource.
190
- * @param {*} datasourceId - datasourceId to fetch
191
- * @param entities - the tables that are to be built
192
- */
193
- buildSchema(datasourceId, entities) {
194
- return __awaiter(this, void 0, void 0, function* () {
195
- let tableKeys = {};
151
+ });
152
+ }
153
+ internalQuery(query, close = true) {
154
+ return __awaiter(this, void 0, void 0, function* () {
155
+ if (!this.open) {
196
156
  yield this.openConnection();
197
- try {
198
- const primaryKeysResponse = yield this.client.query(this.PRIMARY_KEYS_SQL);
199
- for (let table of primaryKeysResponse.rows) {
200
- const tableName = table.table_name;
201
- if (!tableKeys[tableName]) {
202
- tableKeys[tableName] = [];
203
- }
204
- const key = table.column_name || table.primary_key;
205
- // only add the unique keys
206
- if (key && tableKeys[tableName].indexOf(key) === -1) {
207
- tableKeys[tableName].push(key);
208
- }
157
+ }
158
+ const client = this.client;
159
+ this.index = 1;
160
+ // need to handle a specific issue with json data types in postgres,
161
+ // new lines inside the JSON data will break it
162
+ if (query && query.sql) {
163
+ const matches = query.sql.match(JSON_REGEX);
164
+ if (matches && matches.length > 0) {
165
+ for (let match of matches) {
166
+ const escaped = escapeDangerousCharacters(match);
167
+ query.sql = query.sql.replace(match, escaped);
209
168
  }
210
169
  }
211
- catch (err) {
212
- tableKeys = {};
170
+ }
171
+ try {
172
+ return yield client.query(query.sql, query.bindings || []);
173
+ }
174
+ catch (err) {
175
+ yield this.closeConnection();
176
+ // @ts-ignore
177
+ throw new Error(err);
178
+ }
179
+ finally {
180
+ if (close) {
181
+ yield this.closeConnection();
213
182
  }
214
- try {
215
- const columnsResponse = yield this.client.query(this.COLUMNS_SQL);
216
- const tables = {};
217
- for (let column of columnsResponse.rows) {
218
- const tableName = column.table_name;
219
- const columnName = column.column_name;
220
- // table key doesn't exist yet
221
- if (!tables[tableName] || !tables[tableName].schema) {
222
- tables[tableName] = {
223
- _id: (0, utils_1.buildExternalTableId)(datasourceId, tableName),
224
- primary: tableKeys[tableName] || [],
225
- name: tableName,
226
- schema: {},
227
- };
228
- }
229
- const identity = !!(column.identity_generation ||
230
- column.identity_start ||
231
- column.identity_increment);
232
- const hasDefault = typeof column.column_default === "string" &&
233
- column.column_default.startsWith("nextval");
234
- const isGenerated = column.is_generated && column.is_generated !== "NEVER";
235
- const isAuto = hasDefault || identity || isGenerated;
236
- tables[tableName].schema[columnName] = Object.assign(Object.assign({ autocolumn: isAuto, name: columnName }, (0, utils_1.convertSqlType)(column.data_type)), { externalType: column.data_type });
183
+ }
184
+ });
185
+ }
186
+ /**
187
+ * Fetches the tables from the postgres table and assigns them to the datasource.
188
+ * @param {*} datasourceId - datasourceId to fetch
189
+ * @param entities - the tables that are to be built
190
+ */
191
+ buildSchema(datasourceId, entities) {
192
+ return __awaiter(this, void 0, void 0, function* () {
193
+ let tableKeys = {};
194
+ yield this.openConnection();
195
+ try {
196
+ const primaryKeysResponse = yield this.client.query(this.PRIMARY_KEYS_SQL);
197
+ for (let table of primaryKeysResponse.rows) {
198
+ const tableName = table.table_name;
199
+ if (!tableKeys[tableName]) {
200
+ tableKeys[tableName] = [];
201
+ }
202
+ const key = table.column_name || table.primary_key;
203
+ // only add the unique keys
204
+ if (key && tableKeys[tableName].indexOf(key) === -1) {
205
+ tableKeys[tableName].push(key);
237
206
  }
238
- const final = (0, utils_1.finaliseExternalTables)(tables, entities);
239
- this.tables = final.tables;
240
- this.schemaErrors = final.errors;
241
- }
242
- catch (err) {
243
- // @ts-ignore
244
- throw new Error(err);
245
- }
246
- finally {
247
- yield this.closeConnection();
248
207
  }
249
- });
250
- }
251
- create(query) {
252
- return __awaiter(this, void 0, void 0, function* () {
253
- const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
254
- return response.rows.length ? response.rows : [{ created: true }];
255
- });
256
- }
257
- read(query) {
258
- return __awaiter(this, void 0, void 0, function* () {
259
- const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
260
- return response.rows;
261
- });
262
- }
263
- update(query) {
264
- return __awaiter(this, void 0, void 0, function* () {
265
- const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
266
- return response.rows.length ? response.rows : [{ updated: true }];
267
- });
268
- }
269
- delete(query) {
270
- return __awaiter(this, void 0, void 0, function* () {
271
- const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
272
- return response.rows.length ? response.rows : [{ deleted: true }];
273
- });
274
- }
275
- query(json) {
276
- return __awaiter(this, void 0, void 0, function* () {
277
- const operation = this._operation(json).toLowerCase();
278
- const input = this._query(json);
279
- if (Array.isArray(input)) {
280
- const responses = [];
281
- for (let query of input) {
282
- responses.push(yield this.internalQuery(query, false));
208
+ }
209
+ catch (err) {
210
+ tableKeys = {};
211
+ }
212
+ try {
213
+ const columnsResponse = yield this.client.query(this.COLUMNS_SQL);
214
+ const tables = {};
215
+ for (let column of columnsResponse.rows) {
216
+ const tableName = column.table_name;
217
+ const columnName = column.column_name;
218
+ // table key doesn't exist yet
219
+ if (!tables[tableName] || !tables[tableName].schema) {
220
+ tables[tableName] = {
221
+ _id: (0, utils_1.buildExternalTableId)(datasourceId, tableName),
222
+ primary: tableKeys[tableName] || [],
223
+ name: tableName,
224
+ schema: {},
225
+ };
283
226
  }
284
- yield this.closeConnection();
285
- return responses;
227
+ const identity = !!(column.identity_generation ||
228
+ column.identity_start ||
229
+ column.identity_increment);
230
+ const hasDefault = typeof column.column_default === "string" &&
231
+ column.column_default.startsWith("nextval");
232
+ const isGenerated = column.is_generated && column.is_generated !== "NEVER";
233
+ const isAuto = hasDefault || identity || isGenerated;
234
+ tables[tableName].schema[columnName] = Object.assign(Object.assign({ autocolumn: isAuto, name: columnName }, (0, utils_1.convertSqlType)(column.data_type)), { externalType: column.data_type });
286
235
  }
287
- else {
288
- const response = yield this.internalQuery(input);
289
- return response.rows.length ? response.rows : [{ [operation]: true }];
236
+ const final = (0, utils_1.finaliseExternalTables)(tables, entities);
237
+ this.tables = final.tables;
238
+ this.schemaErrors = final.errors;
239
+ }
240
+ catch (err) {
241
+ // @ts-ignore
242
+ throw new Error(err);
243
+ }
244
+ finally {
245
+ yield this.closeConnection();
246
+ }
247
+ });
248
+ }
249
+ create(query) {
250
+ return __awaiter(this, void 0, void 0, function* () {
251
+ const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
252
+ return response.rows.length ? response.rows : [{ created: true }];
253
+ });
254
+ }
255
+ read(query) {
256
+ return __awaiter(this, void 0, void 0, function* () {
257
+ const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
258
+ return response.rows;
259
+ });
260
+ }
261
+ update(query) {
262
+ return __awaiter(this, void 0, void 0, function* () {
263
+ const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
264
+ return response.rows.length ? response.rows : [{ updated: true }];
265
+ });
266
+ }
267
+ delete(query) {
268
+ return __awaiter(this, void 0, void 0, function* () {
269
+ const response = yield this.internalQuery((0, utils_1.getSqlQuery)(query));
270
+ return response.rows.length ? response.rows : [{ deleted: true }];
271
+ });
272
+ }
273
+ query(json) {
274
+ return __awaiter(this, void 0, void 0, function* () {
275
+ const operation = this._operation(json).toLowerCase();
276
+ const input = this._query(json);
277
+ if (Array.isArray(input)) {
278
+ const responses = [];
279
+ for (let query of input) {
280
+ responses.push(yield this.internalQuery(query, false));
290
281
  }
291
- });
292
- }
282
+ yield this.closeConnection();
283
+ return responses;
284
+ }
285
+ else {
286
+ const response = yield this.internalQuery(input);
287
+ return response.rows.length ? response.rows : [{ [operation]: true }];
288
+ }
289
+ });
293
290
  }
294
- module.exports = {
295
- schema: SCHEMA,
296
- integration: PostgresIntegration,
297
- };
298
- })(PostgresModule || (PostgresModule = {}));
291
+ }
292
+ exports.default = {
293
+ schema: SCHEMA,
294
+ integration: PostgresIntegration,
295
+ };