@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
@@ -25,437 +25,430 @@ import oracledb, {
25
25
  import Sql from "./base/sql"
26
26
  import { FieldTypes } from "../constants"
27
27
 
28
- module OracleModule {
29
- oracledb.outFormat = oracledb.OUT_FORMAT_OBJECT
30
-
31
- interface OracleConfig {
32
- host: string
33
- port: number
34
- database: string
35
- user: string
36
- password: string
37
- }
28
+ oracledb.outFormat = oracledb.OUT_FORMAT_OBJECT
29
+
30
+ interface OracleConfig {
31
+ host: string
32
+ port: number
33
+ database: string
34
+ user: string
35
+ password: string
36
+ }
38
37
 
39
- const SCHEMA: Integration = {
40
- docs: "https://github.com/oracle/node-oracledb",
41
- plus: true,
42
- friendlyName: "Oracle",
43
- type: "Relational",
44
- description:
45
- "Oracle Database is an object-relational database management system developed by Oracle Corporation",
46
- datasource: {
47
- host: {
48
- type: DatasourceFieldType.STRING,
49
- default: "localhost",
50
- required: true,
51
- },
52
- port: {
53
- type: DatasourceFieldType.NUMBER,
54
- required: true,
55
- default: 1521,
56
- },
57
- database: {
58
- type: DatasourceFieldType.STRING,
59
- required: true,
60
- },
61
- user: {
62
- type: DatasourceFieldType.STRING,
63
- required: true,
64
- },
65
- password: {
66
- type: DatasourceFieldType.PASSWORD,
67
- required: true,
68
- },
38
+ const SCHEMA: Integration = {
39
+ docs: "https://github.com/oracle/node-oracledb",
40
+ plus: true,
41
+ friendlyName: "Oracle",
42
+ type: "Relational",
43
+ description:
44
+ "Oracle Database is an object-relational database management system developed by Oracle Corporation",
45
+ datasource: {
46
+ host: {
47
+ type: DatasourceFieldType.STRING,
48
+ default: "localhost",
49
+ required: true,
69
50
  },
70
- query: {
71
- create: {
72
- type: QueryType.SQL,
73
- },
74
- read: {
75
- type: QueryType.SQL,
76
- },
77
- update: {
78
- type: QueryType.SQL,
79
- },
80
- delete: {
81
- type: QueryType.SQL,
82
- },
51
+ port: {
52
+ type: DatasourceFieldType.NUMBER,
53
+ required: true,
54
+ default: 1521,
83
55
  },
84
- }
56
+ database: {
57
+ type: DatasourceFieldType.STRING,
58
+ required: true,
59
+ },
60
+ user: {
61
+ type: DatasourceFieldType.STRING,
62
+ required: true,
63
+ },
64
+ password: {
65
+ type: DatasourceFieldType.PASSWORD,
66
+ required: true,
67
+ },
68
+ },
69
+ query: {
70
+ create: {
71
+ type: QueryType.SQL,
72
+ },
73
+ read: {
74
+ type: QueryType.SQL,
75
+ },
76
+ update: {
77
+ type: QueryType.SQL,
78
+ },
79
+ delete: {
80
+ type: QueryType.SQL,
81
+ },
82
+ },
83
+ }
85
84
 
86
- const UNSUPPORTED_TYPES = ["BLOB", "CLOB", "NCLOB"]
85
+ const UNSUPPORTED_TYPES = ["BLOB", "CLOB", "NCLOB"]
86
+
87
+ /**
88
+ * Raw query response
89
+ */
90
+ interface ColumnsResponse {
91
+ TABLE_NAME: string
92
+ COLUMN_NAME: string
93
+ DATA_TYPE: string
94
+ DATA_DEFAULT: string | null
95
+ COLUMN_ID: number
96
+ CONSTRAINT_NAME: string | null
97
+ CONSTRAINT_TYPE: string | null
98
+ R_CONSTRAINT_NAME: string | null
99
+ SEARCH_CONDITION: string | null
100
+ }
87
101
 
88
- /**
89
- * Raw query response
90
- */
91
- interface ColumnsResponse {
92
- TABLE_NAME: string
93
- COLUMN_NAME: string
94
- DATA_TYPE: string
95
- DATA_DEFAULT: string | null
96
- COLUMN_ID: number
97
- CONSTRAINT_NAME: string | null
98
- CONSTRAINT_TYPE: string | null
99
- R_CONSTRAINT_NAME: string | null
100
- SEARCH_CONDITION: string | null
101
- }
102
+ /**
103
+ * An oracle constraint
104
+ */
105
+ interface OracleConstraint {
106
+ name: string
107
+ type: string
108
+ relatedConstraintName: string | null
109
+ searchCondition: string | null
110
+ }
102
111
 
103
- /**
104
- * An oracle constraint
105
- */
106
- interface OracleConstraint {
107
- name: string
108
- type: string
109
- relatedConstraintName: string | null
110
- searchCondition: string | null
111
- }
112
+ /**
113
+ * An oracle column and it's related constraints
114
+ */
115
+ interface OracleColumn {
116
+ name: string
117
+ type: string
118
+ default: string | null
119
+ id: number
120
+ constraints: { [key: string]: OracleConstraint }
121
+ }
112
122
 
113
- /**
114
- * An oracle column and it's related constraints
115
- */
116
- interface OracleColumn {
117
- name: string
118
- type: string
119
- default: string | null
120
- id: number
121
- constraints: { [key: string]: OracleConstraint }
122
- }
123
+ /**
124
+ * An oracle table and it's related columns
125
+ */
126
+ interface OracleTable {
127
+ name: string
128
+ columns: { [key: string]: OracleColumn }
129
+ }
123
130
 
124
- /**
125
- * An oracle table and it's related columns
126
- */
127
- interface OracleTable {
128
- name: string
129
- columns: { [key: string]: OracleColumn }
130
- }
131
+ const OracleContraintTypes = {
132
+ PRIMARY: "P",
133
+ NOT_NULL_OR_CHECK: "C",
134
+ FOREIGN_KEY: "R",
135
+ UNIQUE: "U",
136
+ }
131
137
 
132
- const OracleContraintTypes = {
133
- PRIMARY: "P",
134
- NOT_NULL_OR_CHECK: "C",
135
- FOREIGN_KEY: "R",
136
- UNIQUE: "U",
138
+ class OracleIntegration extends Sql implements DatasourcePlus {
139
+ private readonly config: OracleConfig
140
+ private index: number = 1
141
+
142
+ public tables: Record<string, Table> = {}
143
+ public schemaErrors: Record<string, string> = {}
144
+
145
+ private readonly COLUMNS_SQL = `
146
+ SELECT
147
+ tabs.table_name,
148
+ cols.column_name,
149
+ cols.data_type,
150
+ cols.data_default,
151
+ cols.column_id,
152
+ cons.constraint_name,
153
+ cons.constraint_type,
154
+ cons.r_constraint_name,
155
+ cons.search_condition
156
+ FROM
157
+ user_tables tabs
158
+ JOIN
159
+ user_tab_columns cols
160
+ ON tabs.table_name = cols.table_name
161
+ LEFT JOIN
162
+ user_cons_columns col_cons
163
+ ON cols.column_name = col_cons.column_name
164
+ AND cols.table_name = col_cons.table_name
165
+ LEFT JOIN
166
+ user_constraints cons
167
+ ON col_cons.constraint_name = cons.constraint_name
168
+ AND cons.table_name = cols.table_name
169
+ WHERE
170
+ (cons.status = 'ENABLED'
171
+ OR cons.status IS NULL)
172
+ `
173
+ constructor(config: OracleConfig) {
174
+ super(SqlClient.ORACLE)
175
+ this.config = config
137
176
  }
138
177
 
139
- class OracleIntegration extends Sql implements DatasourcePlus {
140
- private readonly config: OracleConfig
141
- private index: number = 1
142
-
143
- public tables: Record<string, Table> = {}
144
- public schemaErrors: Record<string, string> = {}
145
-
146
- private readonly COLUMNS_SQL = `
147
- SELECT
148
- tabs.table_name,
149
- cols.column_name,
150
- cols.data_type,
151
- cols.data_default,
152
- cols.column_id,
153
- cons.constraint_name,
154
- cons.constraint_type,
155
- cons.r_constraint_name,
156
- cons.search_condition
157
- FROM
158
- user_tables tabs
159
- JOIN
160
- user_tab_columns cols
161
- ON tabs.table_name = cols.table_name
162
- LEFT JOIN
163
- user_cons_columns col_cons
164
- ON cols.column_name = col_cons.column_name
165
- AND cols.table_name = col_cons.table_name
166
- LEFT JOIN
167
- user_constraints cons
168
- ON col_cons.constraint_name = cons.constraint_name
169
- AND cons.table_name = cols.table_name
170
- WHERE
171
- (cons.status = 'ENABLED'
172
- OR cons.status IS NULL)
173
- `
174
- constructor(config: OracleConfig) {
175
- super(SqlClient.ORACLE)
176
- this.config = config
177
- }
178
-
179
- getBindingIdentifier(): string {
180
- return `:${this.index++}`
181
- }
178
+ getBindingIdentifier(): string {
179
+ return `:${this.index++}`
180
+ }
182
181
 
183
- getStringConcat(parts: string[]): string {
184
- return parts.join(" || ")
185
- }
182
+ getStringConcat(parts: string[]): string {
183
+ return parts.join(" || ")
184
+ }
186
185
 
187
- /**
188
- * Map the flat tabular columns and constraints data into a nested object
189
- */
190
- private mapColumns(result: Result<ColumnsResponse>): {
191
- [key: string]: OracleTable
192
- } {
193
- const oracleTables: { [key: string]: OracleTable } = {}
194
-
195
- if (result.rows) {
196
- result.rows.forEach(row => {
197
- const tableName = row.TABLE_NAME
198
- const columnName = row.COLUMN_NAME
199
- const dataType = row.DATA_TYPE
200
- const dataDefault = row.DATA_DEFAULT
201
- const columnId = row.COLUMN_ID
202
- const constraintName = row.CONSTRAINT_NAME
203
- const constraintType = row.CONSTRAINT_TYPE
204
- const relatedConstraintName = row.R_CONSTRAINT_NAME
205
- const searchCondition = row.SEARCH_CONDITION
206
-
207
- let table = oracleTables[tableName]
208
- if (!table) {
209
- table = {
210
- name: tableName,
211
- columns: {},
212
- }
213
- oracleTables[tableName] = table
186
+ /**
187
+ * Map the flat tabular columns and constraints data into a nested object
188
+ */
189
+ private mapColumns(result: Result<ColumnsResponse>): {
190
+ [key: string]: OracleTable
191
+ } {
192
+ const oracleTables: { [key: string]: OracleTable } = {}
193
+
194
+ if (result.rows) {
195
+ result.rows.forEach(row => {
196
+ const tableName = row.TABLE_NAME
197
+ const columnName = row.COLUMN_NAME
198
+ const dataType = row.DATA_TYPE
199
+ const dataDefault = row.DATA_DEFAULT
200
+ const columnId = row.COLUMN_ID
201
+ const constraintName = row.CONSTRAINT_NAME
202
+ const constraintType = row.CONSTRAINT_TYPE
203
+ const relatedConstraintName = row.R_CONSTRAINT_NAME
204
+ const searchCondition = row.SEARCH_CONDITION
205
+
206
+ let table = oracleTables[tableName]
207
+ if (!table) {
208
+ table = {
209
+ name: tableName,
210
+ columns: {},
214
211
  }
212
+ oracleTables[tableName] = table
213
+ }
215
214
 
216
- let column = table.columns[columnName]
217
- if (!column) {
218
- column = {
219
- name: columnName,
220
- type: dataType,
221
- default: dataDefault,
222
- id: columnId,
223
- constraints: {},
224
- }
225
- table.columns[columnName] = column
215
+ let column = table.columns[columnName]
216
+ if (!column) {
217
+ column = {
218
+ name: columnName,
219
+ type: dataType,
220
+ default: dataDefault,
221
+ id: columnId,
222
+ constraints: {},
226
223
  }
224
+ table.columns[columnName] = column
225
+ }
227
226
 
228
- if (constraintName && constraintType) {
229
- let constraint = column.constraints[constraintName]
230
- if (!constraint) {
231
- constraint = {
232
- name: constraintName,
233
- type: constraintType,
234
- relatedConstraintName: relatedConstraintName,
235
- searchCondition: searchCondition,
236
- }
227
+ if (constraintName && constraintType) {
228
+ let constraint = column.constraints[constraintName]
229
+ if (!constraint) {
230
+ constraint = {
231
+ name: constraintName,
232
+ type: constraintType,
233
+ relatedConstraintName: relatedConstraintName,
234
+ searchCondition: searchCondition,
237
235
  }
238
- column.constraints[constraintName] = constraint
239
236
  }
240
- })
241
- }
242
-
243
- return oracleTables
237
+ column.constraints[constraintName] = constraint
238
+ }
239
+ })
244
240
  }
245
241
 
246
- private static isSupportedColumn(column: OracleColumn) {
247
- return !UNSUPPORTED_TYPES.includes(column.type)
248
- }
242
+ return oracleTables
243
+ }
249
244
 
250
- private static isAutoColumn(column: OracleColumn) {
251
- return !!(
252
- column.default && column.default.toLowerCase().includes("nextval")
253
- )
254
- }
245
+ private static isSupportedColumn(column: OracleColumn) {
246
+ return !UNSUPPORTED_TYPES.includes(column.type)
247
+ }
255
248
 
256
- /**
257
- * No native boolean in oracle. Best we can do is to check if a manual 1 or 0 number constraint has been set up
258
- * This matches the default behaviour for generating DDL used in knex.
259
- */
260
- private isBooleanType(column: OracleColumn): boolean {
261
- return (
262
- column.type.toLowerCase() === "number" &&
263
- Object.values(column.constraints).filter(c => {
264
- if (
265
- c.type === OracleContraintTypes.NOT_NULL_OR_CHECK &&
266
- c.searchCondition
267
- ) {
268
- const condition = c.searchCondition
269
- .replace(/\s/g, "") // remove spaces
270
- .replace(/[']+/g, "") // remove quotes
271
- if (
272
- condition.includes("in(0,1)") ||
273
- condition.includes("in(1,0)")
274
- ) {
275
- return true
276
- }
277
- }
278
- return false
279
- }).length > 0
280
- )
281
- }
249
+ private static isAutoColumn(column: OracleColumn) {
250
+ return !!(
251
+ column.default && column.default.toLowerCase().includes("nextval")
252
+ )
253
+ }
282
254
 
283
- private internalConvertType(column: OracleColumn): { type: string } {
284
- if (this.isBooleanType(column)) {
285
- return { type: FieldTypes.BOOLEAN }
286
- }
255
+ /**
256
+ * No native boolean in oracle. Best we can do is to check if a manual 1 or 0 number constraint has been set up
257
+ * This matches the default behaviour for generating DDL used in knex.
258
+ */
259
+ private isBooleanType(column: OracleColumn): boolean {
260
+ return (
261
+ column.type.toLowerCase() === "number" &&
262
+ Object.values(column.constraints).filter(c => {
263
+ if (
264
+ c.type === OracleContraintTypes.NOT_NULL_OR_CHECK &&
265
+ c.searchCondition
266
+ ) {
267
+ const condition = c.searchCondition
268
+ .replace(/\s/g, "") // remove spaces
269
+ .replace(/[']+/g, "") // remove quotes
270
+ if (condition.includes("in(0,1)") || condition.includes("in(1,0)")) {
271
+ return true
272
+ }
273
+ }
274
+ return false
275
+ }).length > 0
276
+ )
277
+ }
287
278
 
288
- return convertSqlType(column.type)
279
+ private internalConvertType(column: OracleColumn): { type: string } {
280
+ if (this.isBooleanType(column)) {
281
+ return { type: FieldTypes.BOOLEAN }
289
282
  }
290
283
 
291
- /**
292
- * Fetches the tables from the oracle table and assigns them to the datasource.
293
- * @param {*} datasourceId - datasourceId to fetch
294
- * @param entities - the tables that are to be built
295
- */
296
- async buildSchema(datasourceId: string, entities: Record<string, Table>) {
297
- const columnsResponse = await this.internalQuery<ColumnsResponse>({
298
- sql: this.COLUMNS_SQL,
299
- })
300
- const oracleTables = this.mapColumns(columnsResponse)
301
-
302
- const tables: { [key: string]: Table } = {}
284
+ return convertSqlType(column.type)
285
+ }
303
286
 
304
- // iterate each table
305
- Object.values(oracleTables).forEach(oracleTable => {
306
- let table = tables[oracleTable.name]
307
- if (!table) {
308
- table = {
309
- _id: buildExternalTableId(datasourceId, oracleTable.name),
310
- primary: [],
311
- name: oracleTable.name,
312
- schema: {},
313
- }
314
- tables[oracleTable.name] = table
287
+ /**
288
+ * Fetches the tables from the oracle table and assigns them to the datasource.
289
+ * @param {*} datasourceId - datasourceId to fetch
290
+ * @param entities - the tables that are to be built
291
+ */
292
+ async buildSchema(datasourceId: string, entities: Record<string, Table>) {
293
+ const columnsResponse = await this.internalQuery<ColumnsResponse>({
294
+ sql: this.COLUMNS_SQL,
295
+ })
296
+ const oracleTables = this.mapColumns(columnsResponse)
297
+
298
+ const tables: { [key: string]: Table } = {}
299
+
300
+ // iterate each table
301
+ Object.values(oracleTables).forEach(oracleTable => {
302
+ let table = tables[oracleTable.name]
303
+ if (!table) {
304
+ table = {
305
+ _id: buildExternalTableId(datasourceId, oracleTable.name),
306
+ primary: [],
307
+ name: oracleTable.name,
308
+ schema: {},
315
309
  }
310
+ tables[oracleTable.name] = table
311
+ }
316
312
 
317
- // iterate each column on the table
318
- Object.values(oracleTable.columns)
319
- // remove columns that we can't read / save
320
- .filter(oracleColumn =>
321
- OracleIntegration.isSupportedColumn(oracleColumn)
322
- )
323
- // match the order of the columns in the db
324
- .sort((c1, c2) => c1.id - c2.id)
325
- .forEach(oracleColumn => {
326
- const columnName = oracleColumn.name
327
- let fieldSchema = table.schema[columnName]
328
- if (!fieldSchema) {
329
- fieldSchema = {
330
- autocolumn: OracleIntegration.isAutoColumn(oracleColumn),
331
- name: columnName,
332
- ...this.internalConvertType(oracleColumn),
333
- }
334
- table.schema[columnName] = fieldSchema
313
+ // iterate each column on the table
314
+ Object.values(oracleTable.columns)
315
+ // remove columns that we can't read / save
316
+ .filter(oracleColumn =>
317
+ OracleIntegration.isSupportedColumn(oracleColumn)
318
+ )
319
+ // match the order of the columns in the db
320
+ .sort((c1, c2) => c1.id - c2.id)
321
+ .forEach(oracleColumn => {
322
+ const columnName = oracleColumn.name
323
+ let fieldSchema = table.schema[columnName]
324
+ if (!fieldSchema) {
325
+ fieldSchema = {
326
+ autocolumn: OracleIntegration.isAutoColumn(oracleColumn),
327
+ name: columnName,
328
+ ...this.internalConvertType(oracleColumn),
335
329
  }
330
+ table.schema[columnName] = fieldSchema
331
+ }
336
332
 
337
- // iterate each constraint on the column
338
- Object.values(oracleColumn.constraints).forEach(
339
- oracleConstraint => {
340
- if (oracleConstraint.type === OracleContraintTypes.PRIMARY) {
341
- table.primary!.push(columnName)
342
- }
343
- }
344
- )
333
+ // iterate each constraint on the column
334
+ Object.values(oracleColumn.constraints).forEach(oracleConstraint => {
335
+ if (oracleConstraint.type === OracleContraintTypes.PRIMARY) {
336
+ table.primary!.push(columnName)
337
+ }
345
338
  })
346
- })
339
+ })
340
+ })
347
341
 
348
- const final = finaliseExternalTables(tables, entities)
349
- this.tables = final.tables
350
- this.schemaErrors = final.errors
351
- }
342
+ const final = finaliseExternalTables(tables, entities)
343
+ this.tables = final.tables
344
+ this.schemaErrors = final.errors
345
+ }
352
346
 
353
- private async internalQuery<T>(query: SqlQuery): Promise<Result<T>> {
354
- let connection
355
- try {
356
- this.index = 1
357
- connection = await this.getConnection()
358
-
359
- const options: ExecuteOptions = { autoCommit: true }
360
- const bindings: BindParameters = query.bindings || []
361
-
362
- return await connection.execute<T>(query.sql, bindings, options)
363
- } finally {
364
- if (connection) {
365
- try {
366
- await connection.close()
367
- } catch (err) {
368
- console.error(err)
369
- }
347
+ private async internalQuery<T>(query: SqlQuery): Promise<Result<T>> {
348
+ let connection
349
+ try {
350
+ this.index = 1
351
+ connection = await this.getConnection()
352
+
353
+ const options: ExecuteOptions = { autoCommit: true }
354
+ const bindings: BindParameters = query.bindings || []
355
+
356
+ return await connection.execute<T>(query.sql, bindings, options)
357
+ } finally {
358
+ if (connection) {
359
+ try {
360
+ await connection.close()
361
+ } catch (err) {
362
+ console.error(err)
370
363
  }
371
364
  }
372
365
  }
366
+ }
373
367
 
374
- private getConnection = async (): Promise<Connection> => {
375
- //connectString : "(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA =(SID= ORCL)))"
376
- const connectString = `${this.config.host}:${this.config.port || 1521}/${
377
- this.config.database
378
- }`
379
- const attributes: ConnectionAttributes = {
380
- user: this.config.user,
381
- password: this.config.password,
382
- connectString,
383
- }
384
- return oracledb.getConnection(attributes)
368
+ private getConnection = async (): Promise<Connection> => {
369
+ //connectString : "(DESCRIPTION =(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))(CONNECT_DATA =(SID= ORCL)))"
370
+ const connectString = `${this.config.host}:${this.config.port || 1521}/${
371
+ this.config.database
372
+ }`
373
+ const attributes: ConnectionAttributes = {
374
+ user: this.config.user,
375
+ password: this.config.password,
376
+ connectString,
385
377
  }
378
+ return oracledb.getConnection(attributes)
379
+ }
386
380
 
387
- async create(query: SqlQuery | string): Promise<any[]> {
388
- const response = await this.internalQuery<any>(getSqlQuery(query))
389
- return response.rows && response.rows.length
390
- ? response.rows
391
- : [{ created: true }]
392
- }
381
+ async create(query: SqlQuery | string): Promise<any[]> {
382
+ const response = await this.internalQuery<any>(getSqlQuery(query))
383
+ return response.rows && response.rows.length
384
+ ? response.rows
385
+ : [{ created: true }]
386
+ }
393
387
 
394
- async read(query: SqlQuery | string): Promise<any[]> {
395
- const response = await this.internalQuery<any>(getSqlQuery(query))
396
- return response.rows ? response.rows : []
397
- }
388
+ async read(query: SqlQuery | string): Promise<any[]> {
389
+ const response = await this.internalQuery<any>(getSqlQuery(query))
390
+ return response.rows ? response.rows : []
391
+ }
398
392
 
399
- async update(query: SqlQuery | string): Promise<any[]> {
400
- const response = await this.internalQuery(getSqlQuery(query))
401
- return response.rows && response.rows.length
402
- ? response.rows
403
- : [{ updated: true }]
404
- }
393
+ async update(query: SqlQuery | string): Promise<any[]> {
394
+ const response = await this.internalQuery(getSqlQuery(query))
395
+ return response.rows && response.rows.length
396
+ ? response.rows
397
+ : [{ updated: true }]
398
+ }
405
399
 
406
- async delete(query: SqlQuery | string): Promise<any[]> {
407
- const response = await this.internalQuery(getSqlQuery(query))
408
- return response.rows && response.rows.length
409
- ? response.rows
410
- : [{ deleted: true }]
411
- }
400
+ async delete(query: SqlQuery | string): Promise<any[]> {
401
+ const response = await this.internalQuery(getSqlQuery(query))
402
+ return response.rows && response.rows.length
403
+ ? response.rows
404
+ : [{ deleted: true }]
405
+ }
412
406
 
413
- async query(json: QueryJson) {
414
- const operation = this._operation(json)
415
- const input = this._query(json, { disableReturning: true })
416
- if (Array.isArray(input)) {
417
- const responses = []
418
- for (let query of input) {
419
- responses.push(await this.internalQuery(query))
420
- }
421
- return responses
422
- } else {
423
- // read the row to be deleted up front for the return
424
- let deletedRows
425
- if (operation === Operation.DELETE) {
426
- const queryFn = (query: any) => this.internalQuery(query)
427
- deletedRows = await this.getReturningRow(queryFn, json)
428
- }
407
+ async query(json: QueryJson) {
408
+ const operation = this._operation(json)
409
+ const input = this._query(json, { disableReturning: true })
410
+ if (Array.isArray(input)) {
411
+ const responses = []
412
+ for (let query of input) {
413
+ responses.push(await this.internalQuery(query))
414
+ }
415
+ return responses
416
+ } else {
417
+ // read the row to be deleted up front for the return
418
+ let deletedRows
419
+ if (operation === Operation.DELETE) {
420
+ const queryFn = (query: any) => this.internalQuery(query)
421
+ deletedRows = await this.getReturningRow(queryFn, json)
422
+ }
429
423
 
430
- // run the query
431
- const response = await this.internalQuery(input)
424
+ // run the query
425
+ const response = await this.internalQuery(input)
432
426
 
433
- // get the results or return the created / updated / deleted row
434
- if (deletedRows?.rows?.length) {
435
- return deletedRows.rows
436
- } else if (response.rows?.length) {
437
- return response.rows
427
+ // get the results or return the created / updated / deleted row
428
+ if (deletedRows?.rows?.length) {
429
+ return deletedRows.rows
430
+ } else if (response.rows?.length) {
431
+ return response.rows
432
+ } else {
433
+ // get the last row that was updated
434
+ if (
435
+ response.lastRowid &&
436
+ json.endpoint?.entityId &&
437
+ operation !== Operation.DELETE
438
+ ) {
439
+ const lastRow = await this.internalQuery({
440
+ sql: `SELECT * FROM \"${json.endpoint.entityId}\" WHERE ROWID = '${response.lastRowid}'`,
441
+ })
442
+ return lastRow.rows
438
443
  } else {
439
- // get the last row that was updated
440
- if (
441
- response.lastRowid &&
442
- json.endpoint?.entityId &&
443
- operation !== Operation.DELETE
444
- ) {
445
- const lastRow = await this.internalQuery({
446
- sql: `SELECT * FROM \"${json.endpoint.entityId}\" WHERE ROWID = '${response.lastRowid}'`,
447
- })
448
- return lastRow.rows
449
- } else {
450
- return [{ [operation.toLowerCase()]: true }]
451
- }
444
+ return [{ [operation.toLowerCase()]: true }]
452
445
  }
453
446
  }
454
447
  }
455
448
  }
449
+ }
456
450
 
457
- module.exports = {
458
- schema: SCHEMA,
459
- integration: OracleIntegration,
460
- }
451
+ export default {
452
+ schema: SCHEMA,
453
+ integration: OracleIntegration,
461
454
  }