@budibase/server 1.0.95 → 1.0.98-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (241) hide show
  1. package/builder/assets/{index.7c8961b4.css → index.0b7cf958.css} +1 -1
  2. package/builder/assets/index.55c226d0.js +1292 -0
  3. package/builder/assets/{vendor.a7c6ad0a.js → vendor.8e34a169.js} +1 -1
  4. package/builder/index.html +3 -3
  5. package/coverage/clover.xml +274 -273
  6. package/coverage/coverage-final.json +18 -18
  7. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/application.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/auth.js.html +2 -2
  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 +4 -4
  15. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/index.html +1 -1
  18. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  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/index.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/query/validation.js.html +2 -2
  26. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/index.html +10 -10
  30. package/coverage/lcov-report/api/controllers/row/index.js.html +20 -20
  31. package/coverage/lcov-report/api/controllers/row/internal.js.html +47 -35
  32. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/row/utils.js.html +6 -6
  35. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/table/external.js.html +4 -4
  39. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  40. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/table/internal.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/table/utils.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  44. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  45. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  46. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  47. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  48. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  49. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  50. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  51. package/coverage/lcov-report/api/index.html +15 -15
  52. package/coverage/lcov-report/api/index.js.html +15 -27
  53. package/coverage/lcov-report/api/routes/analytics.js.html +3 -3
  54. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/application.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/index.html +1 -1
  65. package/coverage/lcov-report/api/routes/index.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  74. package/coverage/lcov-report/api/routes/row.js.html +1 -1
  75. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  76. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  77. package/coverage/lcov-report/api/routes/static.js.html +3 -6
  78. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  79. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  80. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  81. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  82. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  83. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  84. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  85. package/coverage/lcov-report/automations/actions.js.html +1 -1
  86. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  87. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  88. package/coverage/lcov-report/automations/index.html +1 -1
  89. package/coverage/lcov-report/automations/index.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/createRow.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/deleteRow.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  96. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  97. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  98. package/coverage/lcov-report/automations/steps/index.html +1 -1
  99. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  100. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  101. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  102. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  103. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  104. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  105. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  106. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  107. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  108. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  109. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  110. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  111. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  112. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  113. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  114. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  115. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  116. package/coverage/lcov-report/automations/triggers.js.html +3 -3
  117. package/coverage/lcov-report/automations/utils.js.html +1 -1
  118. package/coverage/lcov-report/constants/index.html +1 -1
  119. package/coverage/lcov-report/constants/index.js.html +1 -1
  120. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  121. package/coverage/lcov-report/constants/screens.js.html +1 -1
  122. package/coverage/lcov-report/db/client.js.html +1 -1
  123. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  124. package/coverage/lcov-report/db/index.html +1 -1
  125. package/coverage/lcov-report/db/index.js.html +1 -1
  126. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  127. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  128. package/coverage/lcov-report/db/linkedRows/index.js.html +10 -10
  129. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +7 -7
  130. package/coverage/lcov-report/db/newid.js.html +2 -2
  131. package/coverage/lcov-report/db/utils.js.html +4 -4
  132. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  133. package/coverage/lcov-report/events/index.html +1 -1
  134. package/coverage/lcov-report/events/index.js.html +1 -1
  135. package/coverage/lcov-report/events/utils.js.html +1 -1
  136. package/coverage/lcov-report/index.html +25 -25
  137. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  138. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  139. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  140. package/coverage/lcov-report/middleware/authorized.js.html +1 -1
  141. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  142. package/coverage/lcov-report/middleware/currentapp.js.html +15 -12
  143. package/coverage/lcov-report/middleware/index.html +11 -11
  144. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  145. package/coverage/lcov-report/middleware/publicApi.js.html +3 -3
  146. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  147. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  148. package/coverage/lcov-report/middleware/usageQuota.js.html +1 -1
  149. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  150. package/coverage/lcov-report/threads/automation.js.html +1 -1
  151. package/coverage/lcov-report/threads/index.html +1 -1
  152. package/coverage/lcov-report/threads/index.js.html +1 -1
  153. package/coverage/lcov-report/threads/query.js.html +1 -1
  154. package/coverage/lcov-report/threads/utils.js.html +1 -1
  155. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  156. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  157. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  158. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  159. package/coverage/lcov-report/utilities/global.js.html +1 -1
  160. package/coverage/lcov-report/utilities/index.html +1 -1
  161. package/coverage/lcov-report/utilities/index.js.html +1 -1
  162. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  163. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  164. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  165. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  166. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  167. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +24 -24
  168. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +8 -8
  169. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  170. package/coverage/lcov-report/utilities/security.js.html +1 -1
  171. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  172. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  173. package/coverage/lcov-report/utilities/usageQuota/index.js.html +1 -1
  174. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  175. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  176. package/coverage/lcov-report/utilities/users.js.html +1 -1
  177. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  178. package/coverage/lcov.info +415 -416
  179. package/dist/api/controllers/auth.js +1 -1
  180. package/dist/api/controllers/public/rows.js +2 -2
  181. package/dist/api/controllers/query/import/index.js +2 -1
  182. package/dist/api/controllers/query/import/sources/base/index.js +12 -1
  183. package/dist/api/controllers/query/import/sources/curl.js +2 -2
  184. package/dist/api/controllers/query/import/sources/openapi3.js +174 -0
  185. package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  186. package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  187. package/dist/api/controllers/row/internal.js +2 -1
  188. package/dist/api/controllers/static/index.js +2 -15
  189. package/dist/api/controllers/table/external.js +3 -3
  190. package/dist/api/index.js +3 -6
  191. package/dist/api/routes/analytics.js +2 -2
  192. package/dist/api/routes/static.js +1 -2
  193. package/dist/db/views/staticViews.js +2 -0
  194. package/dist/definitions/datasource.js +1 -0
  195. package/dist/integrations/base/sql.js +16 -9
  196. package/dist/integrations/dynamodb.js +3 -1
  197. package/dist/integrations/firebase.js +192 -0
  198. package/dist/integrations/index.js +3 -0
  199. package/dist/integrations/rest.js +2 -1
  200. package/dist/middleware/currentapp.js +7 -6
  201. package/dist/middleware/publicApi.js +2 -2
  202. package/dist/package.json +7 -8
  203. package/dist/tests/utilities/TestConfiguration.js +1 -1
  204. package/dist/tsconfig.tsbuildinfo +1 -1
  205. package/package.json +8 -9
  206. package/scripts/dev/manage.js +2 -1
  207. package/src/api/controllers/auth.js +1 -1
  208. package/src/api/controllers/public/rows.ts +2 -4
  209. package/src/api/controllers/query/import/index.ts +2 -1
  210. package/src/api/controllers/query/import/sources/base/index.ts +12 -2
  211. package/src/api/controllers/query/import/sources/curl.ts +2 -2
  212. package/src/api/controllers/query/import/sources/openapi3.ts +205 -0
  213. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
  214. package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.yaml +153 -0
  215. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
  216. package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.yaml +804 -0
  217. package/src/api/controllers/query/import/sources/tests/openapi3/openapi3.spec.js +240 -0
  218. package/src/api/controllers/query/import/tests/index.spec.js +43 -0
  219. package/src/api/controllers/row/internal.js +5 -1
  220. package/src/api/controllers/static/index.js +2 -18
  221. package/src/api/controllers/table/external.js +3 -3
  222. package/src/api/index.js +3 -7
  223. package/src/api/routes/analytics.js +2 -2
  224. package/src/api/routes/static.js +1 -2
  225. package/src/api/routes/tests/misc.spec.js +2 -2
  226. package/src/db/views/staticViews.js +2 -0
  227. package/src/definitions/datasource.ts +1 -0
  228. package/src/definitions/openapi.ts +472 -472
  229. package/src/integrations/base/sql.ts +14 -9
  230. package/src/integrations/dynamodb.ts +3 -1
  231. package/src/integrations/firebase.ts +205 -0
  232. package/src/integrations/index.ts +3 -0
  233. package/src/integrations/rest.ts +2 -1
  234. package/src/integrations/tests/sql.spec.js +51 -0
  235. package/src/middleware/currentapp.js +7 -6
  236. package/src/middleware/publicApi.js +2 -2
  237. package/src/middleware/tests/authorized.spec.js +1 -3
  238. package/src/middleware/tests/currentapp.spec.js +4 -4
  239. package/src/tests/utilities/TestConfiguration.js +1 -1
  240. package/.eslintrc +0 -13
  241. package/builder/assets/index.3544c466.js +0 -1291
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.0.95",
4
+ "version": "1.0.98-alpha.0",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -21,10 +21,7 @@
21
21
  "dev:stack:down": "node scripts/dev/manage.js down",
22
22
  "dev:stack:nuke": "node scripts/dev/manage.js nuke",
23
23
  "dev:builder": "yarn run dev:stack:up && nodemon",
24
- "format": "prettier --config ../../.prettierrc.json 'src/**/*.ts' --write",
25
24
  "specs": "node specs/generate.js && openapi-typescript specs/openapi.yaml --output src/definitions/openapi.ts",
26
- "lint": "eslint --fix src/",
27
- "lint:fix": "yarn run format && yarn run lint",
28
25
  "initialise": "node scripts/initialise.js",
29
26
  "env:multi:enable": "node scripts/multiTenancy.js enable",
30
27
  "env:multi:disable": "node scripts/multiTenancy.js disable",
@@ -71,12 +68,13 @@
71
68
  "license": "GPL-3.0",
72
69
  "dependencies": {
73
70
  "@apidevtools/swagger-parser": "^10.0.3",
74
- "@budibase/backend-core": "^1.0.95",
75
- "@budibase/client": "^1.0.95",
76
- "@budibase/string-templates": "^1.0.95",
71
+ "@budibase/backend-core": "^1.0.98-alpha.0",
72
+ "@budibase/client": "^1.0.98-alpha.0",
73
+ "@budibase/string-templates": "^1.0.98-alpha.0",
77
74
  "@bull-board/api": "^3.7.0",
78
75
  "@bull-board/koa": "^3.7.0",
79
76
  "@elastic/elasticsearch": "7.10.0",
77
+ "@google-cloud/firestore": "^5.0.2",
80
78
  "@koa/router": "8.0.0",
81
79
  "@sendgrid/mail": "7.1.1",
82
80
  "@sentry/node": "^6.0.0",
@@ -148,15 +146,16 @@
148
146
  "@types/jest": "^26.0.23",
149
147
  "@types/koa": "^2.13.3",
150
148
  "@types/koa-router": "^7.4.2",
149
+ "@types/lodash": "4.14.180",
151
150
  "@types/node": "^15.12.4",
152
151
  "@types/oracledb": "^5.2.1",
153
152
  "@types/redis": "^4.0.11",
154
- "@typescript-eslint/parser": "4.28.0",
155
153
  "apidoc": "^0.50.2",
156
154
  "babel-jest": "^27.0.2",
157
155
  "copyfiles": "^2.4.1",
158
156
  "docker-compose": "^0.23.6",
159
157
  "eslint": "^6.8.0",
158
+ "is-wsl": "^2.2.0",
160
159
  "jest": "^27.0.5",
161
160
  "jest-openapi": "^0.14.2",
162
161
  "nodemon": "^2.0.4",
@@ -175,5 +174,5 @@
175
174
  "optionalDependencies": {
176
175
  "oracledb": "^5.3.0"
177
176
  },
178
- "gitHead": "c276c8512415296ffab3647edf16a750f2ef613f"
177
+ "gitHead": "b5f8bddd3eb3abcfcb8279b386f75fe7383daadc"
179
178
  }
@@ -2,10 +2,11 @@
2
2
  const compose = require("docker-compose")
3
3
  const path = require("path")
4
4
  const fs = require("fs")
5
+ const isWsl = require("is-wsl")
5
6
  const { processStringSync } = require("@budibase/string-templates")
6
7
 
7
8
  function isLinux() {
8
- return process.platform !== "darwin" && process.platform !== "win32"
9
+ return !isWsl && process.platform !== "darwin" && process.platform !== "win32"
9
10
  }
10
11
 
11
12
  // This script wraps docker-compose allowing you to manage your dev infrastructure with simple commands.
@@ -7,7 +7,7 @@ const { getAppDB, getAppId } = require("@budibase/backend-core/context")
7
7
  exports.fetchSelf = async ctx => {
8
8
  let userId = ctx.user.userId || ctx.user._id
9
9
  /* istanbul ignore next */
10
- if (!userId) {
10
+ if (!userId || !ctx.isAuthenticated) {
11
11
  ctx.body = {}
12
12
  return
13
13
  }
@@ -52,16 +52,14 @@ export async function read(ctx: any, next: any) {
52
52
  }
53
53
 
54
54
  export async function update(ctx: any, next: any) {
55
- ctx.request.body = await addRev(fixRow(ctx.request.body, ctx.params.tableId))
55
+ ctx.request.body = await addRev(fixRow(ctx.request.body, ctx.params))
56
56
  await rowController.save(ctx)
57
57
  await next()
58
58
  }
59
59
 
60
60
  export async function destroy(ctx: any, next: any) {
61
61
  // set the body as expected, with the _id and _rev fields
62
- ctx.request.body = await addRev(
63
- fixRow({ _id: ctx.params.rowId }, ctx.params.tableId)
64
- )
62
+ ctx.request.body = await addRev(fixRow({ _id: ctx.params.rowId }, ctx.params))
65
63
  await rowController.destroy(ctx)
66
64
  // destroy controller doesn't currently return the row as the body, need to adjust this
67
65
  // in the public API to be correct
@@ -2,6 +2,7 @@ import { queryValidation } from "../validation"
2
2
  import { generateQueryID } from "../../../../db/utils"
3
3
  import { ImportInfo, ImportSource } from "./sources/base"
4
4
  import { OpenAPI2 } from "./sources/openapi2"
5
+ import { OpenAPI3 } from "./sources/openapi3"
5
6
  import { Query } from "./../../../../definitions/common"
6
7
  import { Curl } from "./sources/curl"
7
8
  // @ts-ignore
@@ -18,7 +19,7 @@ export class RestImporter {
18
19
 
19
20
  constructor(data: string) {
20
21
  this.data = data
21
- this.sources = [new OpenAPI2(), new Curl()]
22
+ this.sources = [new OpenAPI2(), new OpenAPI3(), new Curl()]
22
23
  }
23
24
 
24
25
  init = async () => {
@@ -23,7 +23,7 @@ export abstract class ImportSource {
23
23
  name: string,
24
24
  method: string,
25
25
  path: string,
26
- url: URL,
26
+ url: URL | string | undefined,
27
27
  queryString: string,
28
28
  headers: object = {},
29
29
  parameters: QueryParameter[] = [],
@@ -34,7 +34,17 @@ export abstract class ImportSource {
34
34
  const transformer = "return data"
35
35
  const schema = {}
36
36
  path = this.processPath(path)
37
- path = `${url.origin}/${path}`
37
+ if (url) {
38
+ if (typeof url === "string") {
39
+ path = `${url}/${path}`
40
+ } else {
41
+ let href = url.href
42
+ if (href.endsWith("/")) {
43
+ href = href.slice(0, -1)
44
+ }
45
+ path = `${href}/${path}`
46
+ }
47
+ }
38
48
  queryString = this.processQuery(queryString)
39
49
  const requestBody = JSON.stringify(body, null, 2)
40
50
 
@@ -74,7 +74,7 @@ export class Curl extends ImportSource {
74
74
  getQueries = async (datasourceId: string): Promise<Query[]> => {
75
75
  const url = this.getUrl()
76
76
  const name = url.pathname
77
- const path = url.pathname
77
+ const path = url.origin + url.pathname
78
78
  const method = this.curl.method
79
79
  const queryString = url.search
80
80
  const headers = this.curl.headers
@@ -90,7 +90,7 @@ export class Curl extends ImportSource {
90
90
  name,
91
91
  method,
92
92
  path,
93
- url,
93
+ undefined,
94
94
  queryString,
95
95
  headers,
96
96
  [],
@@ -0,0 +1,205 @@
1
+ import { ImportInfo } from "./base"
2
+ import { Query, QueryParameter } from "../../../../../definitions/datasource"
3
+ import { OpenAPIV3 } from "openapi-types"
4
+ import { OpenAPISource } from "./base/openapi"
5
+ import { URL } from "url"
6
+
7
+ const parameterNotRef = (
8
+ param: OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject
9
+ ): param is OpenAPIV3.ParameterObject => {
10
+ // all refs are deferenced by parser library
11
+ return true
12
+ }
13
+
14
+ const requestBodyNotRef = (
15
+ param: OpenAPIV3.RequestBodyObject | OpenAPIV3.ReferenceObject | undefined
16
+ ): param is OpenAPIV3.RequestBodyObject => {
17
+ // all refs are deferenced by parser library
18
+ return param !== undefined
19
+ }
20
+
21
+ const schemaNotRef = (
22
+ param: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject | undefined
23
+ ): param is OpenAPIV3.SchemaObject => {
24
+ // all refs are deferenced by parser library
25
+ return param !== undefined
26
+ }
27
+
28
+ const isOpenAPI3 = (document: any): document is OpenAPIV3.Document => {
29
+ return document.openapi.includes("3.0")
30
+ }
31
+
32
+ const methods: string[] = Object.values(OpenAPIV3.HttpMethods)
33
+
34
+ const isOperation = (
35
+ key: string,
36
+ pathItem: any
37
+ ): pathItem is OpenAPIV3.OperationObject => {
38
+ return methods.includes(key)
39
+ }
40
+
41
+ const isParameter = (
42
+ key: string,
43
+ pathItem: any
44
+ ): pathItem is OpenAPIV3.ParameterObject => {
45
+ return !isOperation(key, pathItem)
46
+ }
47
+
48
+ const getRequestBody = (operation: OpenAPIV3.OperationObject) => {
49
+ if (requestBodyNotRef(operation.requestBody)) {
50
+ const request: OpenAPIV3.RequestBodyObject = operation.requestBody
51
+ const supportedMimeTypes = getMimeTypes(operation)
52
+ if (supportedMimeTypes.length > 0) {
53
+ const mimeType = supportedMimeTypes[0]
54
+
55
+ // try get example from request
56
+ const content = request.content[mimeType]
57
+ if (content.example) {
58
+ return content.example
59
+ }
60
+
61
+ // try get example from schema
62
+ if (schemaNotRef(content.schema)) {
63
+ const schema = content.schema
64
+ if (schema.example) {
65
+ return schema.example
66
+ }
67
+ }
68
+ }
69
+ }
70
+ return undefined
71
+ }
72
+
73
+ const getMimeTypes = (operation: OpenAPIV3.OperationObject): string[] => {
74
+ if (requestBodyNotRef(operation.requestBody)) {
75
+ const request: OpenAPIV3.RequestBodyObject = operation.requestBody
76
+ return Object.keys(request.content)
77
+ }
78
+ return []
79
+ }
80
+
81
+ /**
82
+ * OpenAPI Version 3.0
83
+ * https://github.com/OAI/OpenAPI-Specification/blob/main/versions/3.0.0.md
84
+ */
85
+ export class OpenAPI3 extends OpenAPISource {
86
+ document!: OpenAPIV3.Document
87
+
88
+ isSupported = async (data: string): Promise<boolean> => {
89
+ try {
90
+ const document: any = await this.parseData(data)
91
+ if (isOpenAPI3(document)) {
92
+ this.document = document
93
+ return true
94
+ } else {
95
+ return false
96
+ }
97
+ } catch (err) {
98
+ return false
99
+ }
100
+ }
101
+
102
+ getInfo = async (): Promise<ImportInfo> => {
103
+ const name = this.document.info.title || "OpenAPI Import"
104
+ return {
105
+ name,
106
+ }
107
+ }
108
+
109
+ getQueries = async (datasourceId: string): Promise<Query[]> => {
110
+ let url: string | URL | undefined
111
+ if (this.document.servers?.length) {
112
+ url = this.document.servers[0].url
113
+ try {
114
+ url = new URL(url)
115
+ } catch (err) {
116
+ // unable to construct url, e.g. with variables
117
+ // proceed with string form of url
118
+ }
119
+ }
120
+
121
+ const queries: Query[] = []
122
+
123
+ for (let [path, pathItemObject] of Object.entries(this.document.paths)) {
124
+ // parameters that apply to every operation in the path
125
+ let pathParams: OpenAPIV3.ParameterObject[] = []
126
+
127
+ // pathItemObject can be undefined
128
+ if (!pathItemObject) {
129
+ continue
130
+ }
131
+
132
+ for (let [key, opOrParams] of Object.entries(pathItemObject)) {
133
+ if (isParameter(key, opOrParams)) {
134
+ const pathParameters = opOrParams as OpenAPIV3.ParameterObject[]
135
+ pathParams.push(...pathParameters)
136
+ continue
137
+ }
138
+ // can not be a parameter, must be an operation
139
+ const operation = opOrParams as OpenAPIV3.OperationObject
140
+
141
+ const methodName = key
142
+ const name = operation.operationId || path
143
+ let queryString = ""
144
+ const headers: any = {}
145
+ let requestBody = getRequestBody(operation)
146
+ const parameters: QueryParameter[] = []
147
+ const mimeTypes = getMimeTypes(operation)
148
+
149
+ if (mimeTypes.length > 0) {
150
+ headers["Content-Type"] = mimeTypes[0]
151
+ }
152
+
153
+ // combine the path parameters with the operation parameters
154
+ const operationParams = operation.parameters || []
155
+ const allParams = [...pathParams, ...operationParams]
156
+
157
+ for (let param of allParams) {
158
+ if (parameterNotRef(param)) {
159
+ switch (param.in) {
160
+ case "query":
161
+ let prefix = ""
162
+ if (queryString) {
163
+ prefix = "&"
164
+ }
165
+ queryString = `${queryString}${prefix}${param.name}={{${param.name}}}`
166
+ break
167
+ case "header":
168
+ headers[param.name] = `{{${param.name}}}`
169
+ break
170
+ case "path":
171
+ // do nothing: param is already in the path
172
+ break
173
+ case "formData":
174
+ // future enhancement
175
+ break
176
+ }
177
+
178
+ // add the parameter if it can be bound in our config
179
+ if (["query", "header", "path"].includes(param.in)) {
180
+ parameters.push({
181
+ name: param.name,
182
+ default: "",
183
+ })
184
+ }
185
+ }
186
+ }
187
+
188
+ const query = this.constructQuery(
189
+ datasourceId,
190
+ name,
191
+ methodName,
192
+ path,
193
+ url,
194
+ queryString,
195
+ headers,
196
+ parameters,
197
+ requestBody
198
+ )
199
+ queries.push(query)
200
+ }
201
+ }
202
+
203
+ return queries
204
+ }
205
+ }
@@ -0,0 +1,253 @@
1
+ {
2
+ "openapi": "3.0.2",
3
+ "info": {
4
+ "description": "A basic swagger file",
5
+ "version": "1.0.0",
6
+ "title": "CRUD"
7
+ },
8
+ "servers": [
9
+ {
10
+ "url": "http://example.com"
11
+ }
12
+ ],
13
+ "tags": [
14
+ {
15
+ "name": "entity"
16
+ }
17
+ ],
18
+ "paths": {
19
+ "/entities": {
20
+ "post": {
21
+ "tags": [
22
+ "entity"
23
+ ],
24
+ "operationId": "createEntity",
25
+ "requestBody": {
26
+ "content": {
27
+ "application/json": {
28
+ "schema": {
29
+ "$ref": "#/components/schemas/CreateEntity"
30
+ }
31
+ }
32
+ }
33
+ },
34
+ "responses": {
35
+ "200": {
36
+ "description": "successful operation",
37
+ "content": {
38
+ "application/json": {
39
+ "schema": {
40
+ "$ref": "#/components/schemas/Entity"
41
+ }
42
+ }
43
+ }
44
+ }
45
+ }
46
+ },
47
+ "get": {
48
+ "tags": [
49
+ "entity"
50
+ ],
51
+ "operationId": "getEntities",
52
+ "parameters": [
53
+ {
54
+ "$ref": "#/components/parameters/PageParameter"
55
+ },
56
+ {
57
+ "$ref": "#/components/parameters/SizeParameter"
58
+ }
59
+ ],
60
+ "responses": {
61
+ "200": {
62
+ "description": "successful operation",
63
+ "content": {
64
+ "application/json": {
65
+ "schema": {
66
+ "$ref": "#/components/schemas/Entities"
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+ },
74
+ "/entities/{entityId}": {
75
+ "parameters": [
76
+ {
77
+ "$ref": "#/components/parameters/EntityIdParameter"
78
+ }
79
+ ],
80
+ "get": {
81
+ "tags": [
82
+ "entity"
83
+ ],
84
+ "operationId": "getEntity",
85
+ "responses": {
86
+ "200": {
87
+ "description": "successful operation",
88
+ "content": {
89
+ "application/json": {
90
+ "schema": {
91
+ "$ref": "#/components/schemas/Entity"
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
97
+ },
98
+ "put": {
99
+ "tags": [
100
+ "entity"
101
+ ],
102
+ "operationId": "updateEntity",
103
+ "requestBody": {
104
+ "content": {
105
+ "application/json": {
106
+ "schema": {
107
+ "$ref": "#/components/schemas/Entity"
108
+ }
109
+ }
110
+ }
111
+ },
112
+ "responses": {
113
+ "200": {
114
+ "description": "successful operation",
115
+ "content": {
116
+ "application/json": {
117
+ "schema": {
118
+ "$ref": "#/components/schemas/Entity"
119
+ }
120
+ }
121
+ }
122
+ }
123
+ }
124
+ },
125
+ "patch": {
126
+ "tags": [
127
+ "entity"
128
+ ],
129
+ "operationId": "patchEntity",
130
+ "requestBody": {
131
+ "content": {
132
+ "application/json": {
133
+ "schema": {
134
+ "$ref": "#/components/schemas/Entity"
135
+ }
136
+ }
137
+ }
138
+ },
139
+ "responses": {
140
+ "200": {
141
+ "description": "successful operation",
142
+ "content": {
143
+ "application/json": {
144
+ "schema": {
145
+ "$ref": "#/components/schemas/Entity"
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+ },
152
+ "delete": {
153
+ "tags": [
154
+ "entity"
155
+ ],
156
+ "parameters": [
157
+ {
158
+ "$ref": "#/components/parameters/APIKeyParameter"
159
+ }
160
+ ],
161
+ "operationId": "deleteEntity",
162
+ "responses": {
163
+ "204": {
164
+ "description": "successful operation"
165
+ }
166
+ }
167
+ }
168
+ }
169
+ },
170
+ "components": {
171
+ "parameters": {
172
+ "EntityIdParameter": {
173
+ "schema": {
174
+ "type": "integer",
175
+ "format": "int64"
176
+ },
177
+ "name": "entityId",
178
+ "in": "path",
179
+ "required": true
180
+ },
181
+ "PageParameter": {
182
+ "schema": {
183
+ "type": "integer",
184
+ "format": "int32"
185
+ },
186
+ "name": "page",
187
+ "in": "query",
188
+ "required": false
189
+ },
190
+ "SizeParameter": {
191
+ "schema": {
192
+ "type": "integer",
193
+ "format": "int32"
194
+ },
195
+ "name": "size",
196
+ "in": "query",
197
+ "required": false
198
+ },
199
+ "APIKeyParameter": {
200
+ "schema": {
201
+ "type": "string"
202
+ },
203
+ "name": "x-api-key",
204
+ "in": "header",
205
+ "required": false
206
+ }
207
+ },
208
+ "schemas": {
209
+ "CreateEntity": {
210
+ "type": "object",
211
+ "properties": {
212
+ "name": {
213
+ "type": "string"
214
+ },
215
+ "type": {
216
+ "type": "string"
217
+ }
218
+ },
219
+ "example": {
220
+ "name": "name",
221
+ "type": "type"
222
+ }
223
+ },
224
+ "Entity": {
225
+ "allOf": [
226
+ {
227
+ "type": "object",
228
+ "properties": {
229
+ "id": {
230
+ "type": "integer",
231
+ "format": "int64"
232
+ }
233
+ }
234
+ },
235
+ {
236
+ "$ref": "#/components/schemas/CreateEntity"
237
+ }
238
+ ],
239
+ "example": {
240
+ "id": 1,
241
+ "name": "name",
242
+ "type": "type"
243
+ }
244
+ },
245
+ "Entities" : {
246
+ "type": "array",
247
+ "items": {
248
+ "$ref": "#/components/schemas/Entity"
249
+ }
250
+ }
251
+ }
252
+ }
253
+ }