@budibase/server 2.5.8 → 2.5.10-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 (188) hide show
  1. package/builder/assets/index.24635afb.js +1794 -0
  2. package/builder/assets/index.4eae16b2.css +6 -0
  3. package/builder/index.html +2 -2
  4. package/dist/api/controllers/application.js +3 -4
  5. package/dist/api/controllers/automation.js +13 -7
  6. package/dist/api/controllers/datasource.js +1 -1
  7. package/dist/api/controllers/dev.js +1 -1
  8. package/dist/api/controllers/ops.js +40 -0
  9. package/dist/api/controllers/plugin/index.js +6 -37
  10. package/dist/api/controllers/query/index.js +2 -2
  11. package/dist/api/controllers/row/ExternalRequest.js +21 -14
  12. package/dist/api/controllers/table/utils.js +9 -3
  13. package/dist/api/controllers/user.js +1 -83
  14. package/dist/api/index.js +1 -2
  15. package/dist/api/routes/index.js +2 -2
  16. package/dist/api/routes/{cloud.js → ops.js} +19 -6
  17. package/dist/api/routes/user.js +0 -1
  18. package/dist/app.js +4 -13
  19. package/dist/automations/actions.js +32 -6
  20. package/dist/automations/index.js +3 -2
  21. package/dist/automations/steps/bash.js +6 -6
  22. package/dist/automations/steps/createRow.js +11 -11
  23. package/dist/automations/steps/delay.js +3 -3
  24. package/dist/automations/steps/deleteRow.js +8 -8
  25. package/dist/automations/steps/discord.js +8 -8
  26. package/dist/automations/steps/executeQuery.js +9 -9
  27. package/dist/automations/steps/executeScript.js +6 -6
  28. package/dist/automations/steps/filter.js +6 -6
  29. package/dist/automations/steps/integromat.js +10 -10
  30. package/dist/automations/steps/loop.js +9 -9
  31. package/dist/automations/steps/outgoingWebhook.js +10 -10
  32. package/dist/automations/steps/queryRows.js +14 -14
  33. package/dist/automations/steps/sendSmtpEmail.js +9 -9
  34. package/dist/automations/steps/serverLog.js +4 -4
  35. package/dist/automations/steps/slack.js +6 -6
  36. package/dist/automations/steps/updateRow.js +11 -11
  37. package/dist/automations/steps/zapier.js +9 -9
  38. package/dist/automations/triggerInfo/app.js +5 -5
  39. package/dist/automations/triggerInfo/cron.js +4 -4
  40. package/dist/automations/triggerInfo/rowDeleted.js +5 -5
  41. package/dist/automations/triggerInfo/rowSaved.js +7 -7
  42. package/dist/automations/triggerInfo/rowUpdated.js +7 -7
  43. package/dist/automations/triggerInfo/webhook.js +6 -6
  44. package/dist/db/utils.js +3 -2
  45. package/dist/environment.js +0 -1
  46. package/dist/events/docUpdates/index.js +17 -0
  47. package/dist/events/docUpdates/processors.js +18 -0
  48. package/dist/events/docUpdates/syncUsers.js +49 -0
  49. package/dist/events/index.js +3 -0
  50. package/dist/integrations/base/sqlTable.js +9 -2
  51. package/dist/integrations/index.js +3 -3
  52. package/dist/integrations/microsoftSqlServer.js +5 -2
  53. package/dist/integrations/mysql.js +5 -3
  54. package/dist/integrations/postgres.js +7 -5
  55. package/dist/integrations/redis.js +7 -0
  56. package/dist/integrations/rest.js +4 -0
  57. package/dist/migrations/functions/syncQuotas.js +2 -0
  58. package/dist/migrations/functions/usageQuotas/syncApps.js +1 -2
  59. package/dist/migrations/functions/usageQuotas/syncRows.js +1 -2
  60. package/dist/migrations/functions/usageQuotas/syncUsers.js +21 -0
  61. package/dist/sdk/app/applications/sync.js +117 -23
  62. package/dist/sdk/app/backups/exports.js +14 -38
  63. package/dist/sdk/index.js +2 -0
  64. package/dist/sdk/plugins/index.js +27 -0
  65. package/dist/sdk/plugins/plugins.js +53 -0
  66. package/dist/sdk/users/utils.js +21 -4
  67. package/dist/startup.js +31 -28
  68. package/dist/threads/automation.js +16 -5
  69. package/dist/tsconfig.build.tsbuildinfo +1 -1
  70. package/dist/utilities/fileSystem/plugin.js +33 -23
  71. package/dist/utilities/global.js +17 -12
  72. package/dist/utilities/rowProcessor/utils.js +4 -5
  73. package/dist/watch.js +2 -2
  74. package/dist/websockets/client.js +14 -0
  75. package/dist/websockets/grid.js +60 -0
  76. package/dist/websockets/index.js +17 -0
  77. package/dist/websockets/websocket.js +78 -0
  78. package/package.json +16 -16
  79. package/scripts/dev/manage.js +2 -0
  80. package/scripts/integrations/mssql/data/entrypoint.sh +1 -0
  81. package/scripts/integrations/mssql/data/setup.sql +17 -17
  82. package/scripts/integrations/mysql/init.sql +1 -1
  83. package/scripts/integrations/postgres/init.sql +1 -0
  84. package/src/api/controllers/application.ts +4 -4
  85. package/src/api/controllers/automation.ts +12 -6
  86. package/src/api/controllers/datasource.ts +15 -5
  87. package/src/api/controllers/dev.ts +2 -2
  88. package/src/api/controllers/ops.ts +32 -0
  89. package/src/api/controllers/plugin/index.ts +8 -45
  90. package/src/api/controllers/query/index.ts +2 -2
  91. package/src/api/controllers/row/ExternalRequest.ts +21 -12
  92. package/src/api/controllers/row/internal.ts +9 -10
  93. package/src/api/controllers/row/utils.ts +2 -2
  94. package/src/api/controllers/table/utils.ts +10 -3
  95. package/src/api/controllers/user.ts +10 -96
  96. package/src/api/index.ts +2 -4
  97. package/src/api/routes/index.ts +2 -2
  98. package/src/api/routes/ops.ts +30 -0
  99. package/src/api/routes/tests/automation.spec.js +7 -4
  100. package/src/api/routes/tests/internalSearch.spec.js +1 -1
  101. package/src/api/routes/tests/user.spec.js +48 -37
  102. package/src/api/routes/user.ts +0 -5
  103. package/src/app.ts +4 -15
  104. package/src/automations/actions.ts +56 -24
  105. package/src/automations/index.ts +1 -1
  106. package/src/automations/steps/bash.ts +10 -7
  107. package/src/automations/steps/createRow.ts +15 -12
  108. package/src/automations/steps/delay.ts +6 -4
  109. package/src/automations/steps/deleteRow.ts +12 -9
  110. package/src/automations/steps/discord.ts +10 -8
  111. package/src/automations/steps/executeQuery.ts +13 -10
  112. package/src/automations/steps/executeScript.ts +10 -7
  113. package/src/automations/steps/filter.ts +8 -6
  114. package/src/automations/steps/integromat.ts +12 -10
  115. package/src/automations/steps/loop.ts +16 -10
  116. package/src/automations/steps/outgoingWebhook.ts +14 -11
  117. package/src/automations/steps/queryRows.ts +18 -15
  118. package/src/automations/steps/sendSmtpEmail.ts +11 -9
  119. package/src/automations/steps/serverLog.ts +6 -4
  120. package/src/automations/steps/slack.ts +8 -6
  121. package/src/automations/steps/updateRow.ts +15 -12
  122. package/src/automations/steps/zapier.ts +11 -9
  123. package/src/automations/tests/utilities/index.ts +2 -2
  124. package/src/automations/triggerInfo/app.ts +8 -5
  125. package/src/automations/triggerInfo/cron.ts +7 -4
  126. package/src/automations/triggerInfo/rowDeleted.ts +8 -5
  127. package/src/automations/triggerInfo/rowSaved.ts +10 -7
  128. package/src/automations/triggerInfo/rowUpdated.ts +10 -7
  129. package/src/automations/triggerInfo/webhook.ts +9 -6
  130. package/src/db/utils.ts +1 -0
  131. package/src/environment.ts +0 -1
  132. package/src/events/docUpdates/index.ts +1 -0
  133. package/src/events/docUpdates/processors.ts +14 -0
  134. package/src/events/docUpdates/syncUsers.ts +35 -0
  135. package/src/events/index.ts +1 -0
  136. package/src/integration-test/postgres.spec.ts +3 -1
  137. package/src/integrations/base/sqlTable.ts +9 -2
  138. package/src/integrations/index.ts +3 -3
  139. package/src/integrations/microsoftSqlServer.ts +5 -2
  140. package/src/integrations/mysql.ts +5 -3
  141. package/src/integrations/postgres.ts +7 -5
  142. package/src/integrations/redis.ts +8 -0
  143. package/src/integrations/rest.ts +3 -0
  144. package/src/migrations/functions/syncQuotas.ts +2 -0
  145. package/src/migrations/functions/usageQuotas/syncApps.ts +2 -3
  146. package/src/migrations/functions/usageQuotas/syncRows.ts +2 -3
  147. package/src/migrations/functions/usageQuotas/syncUsers.ts +9 -0
  148. package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +2 -2
  149. package/src/migrations/functions/usageQuotas/tests/syncUsers.spec.ts +26 -0
  150. package/src/migrations/index.ts +1 -0
  151. package/src/sdk/app/applications/sync.ts +129 -22
  152. package/src/sdk/app/applications/tests/sync.spec.ts +137 -0
  153. package/src/sdk/app/backups/exports.ts +17 -41
  154. package/src/sdk/index.ts +2 -0
  155. package/src/sdk/plugins/index.ts +5 -0
  156. package/src/sdk/plugins/plugins.ts +41 -0
  157. package/src/sdk/users/tests/utils.spec.ts +1 -32
  158. package/src/sdk/users/utils.ts +23 -5
  159. package/src/startup.ts +36 -34
  160. package/src/tests/jestEnv.ts +0 -1
  161. package/src/tests/jestSetup.ts +0 -1
  162. package/src/tests/utilities/TestConfiguration.ts +28 -0
  163. package/src/tests/utilities/structures.ts +25 -17
  164. package/src/threads/automation.ts +18 -6
  165. package/src/utilities/fileSystem/plugin.ts +13 -4
  166. package/src/utilities/global.ts +21 -16
  167. package/src/utilities/rowProcessor/utils.ts +9 -10
  168. package/src/watch.ts +2 -2
  169. package/src/websockets/client.ts +11 -0
  170. package/src/websockets/grid.ts +55 -0
  171. package/src/websockets/index.ts +14 -0
  172. package/src/websockets/websocket.ts +83 -0
  173. package/tsconfig.build.json +3 -5
  174. package/tsconfig.json +2 -1
  175. package/builder/assets/index.4e1df157.js +0 -1817
  176. package/builder/assets/index.7f9a008b.css +0 -6
  177. package/dist/api/controllers/cloud.js +0 -130
  178. package/dist/elasticApm.js +0 -14
  179. package/dist/package.json +0 -180
  180. package/dist/websocket.js +0 -22
  181. package/scripts/likeCypress.ts +0 -35
  182. package/src/api/controllers/cloud.ts +0 -119
  183. package/src/api/routes/cloud.ts +0 -18
  184. package/src/api/routes/tests/cloud.spec.ts +0 -54
  185. package/src/elasticApm.ts +0 -10
  186. package/src/migrations/functions/tests/syncQuotas.spec.js +0 -26
  187. package/src/tests/logging.ts +0 -34
  188. package/src/websocket.ts +0 -26
@@ -57,6 +57,7 @@ describe("/users", () => {
57
57
  it("should be able to update the user", async () => {
58
58
  const user = await config.createUser({ id: `us_update${utils.newid()}` })
59
59
  user.roleId = BUILTIN_ROLE_IDS.BASIC
60
+ delete user._rev
60
61
  const res = await request
61
62
  .put(`/api/users/metadata`)
62
63
  .set(config.defaultHeaders())
@@ -65,6 +66,46 @@ describe("/users", () => {
65
66
  .expect("Content-Type", /json/)
66
67
  expect(res.body.ok).toEqual(true)
67
68
  })
69
+
70
+ it("should be able to update the user multiple times", async () => {
71
+ const user = await config.createUser()
72
+ delete user._rev
73
+
74
+ const res1 = await request
75
+ .put(`/api/users/metadata`)
76
+ .set(config.defaultHeaders())
77
+ .send({ ...user, roleId: BUILTIN_ROLE_IDS.BASIC })
78
+ .expect(200)
79
+ .expect("Content-Type", /json/)
80
+
81
+ const res = await request
82
+ .put(`/api/users/metadata`)
83
+ .set(config.defaultHeaders())
84
+ .send({ ...user, _rev: res1.body.rev, roleId: BUILTIN_ROLE_IDS.POWER })
85
+ .expect(200)
86
+ .expect("Content-Type", /json/)
87
+
88
+ expect(res.body.ok).toEqual(true)
89
+ })
90
+
91
+ it("should require the _rev field for multiple updates", async () => {
92
+ const user = await config.createUser()
93
+ delete user._rev
94
+
95
+ await request
96
+ .put(`/api/users/metadata`)
97
+ .set(config.defaultHeaders())
98
+ .send({ ...user, roleId: BUILTIN_ROLE_IDS.BASIC })
99
+ .expect(200)
100
+ .expect("Content-Type", /json/)
101
+
102
+ await request
103
+ .put(`/api/users/metadata`)
104
+ .set(config.defaultHeaders())
105
+ .send({ ...user, roleId: BUILTIN_ROLE_IDS.POWER })
106
+ .expect(409)
107
+ .expect("Content-Type", /json/)
108
+ })
68
109
  })
69
110
 
70
111
  describe("destroy", () => {
@@ -92,6 +133,7 @@ describe("/users", () => {
92
133
  expect(res.body.tableId).toBeDefined()
93
134
  })
94
135
  })
136
+
95
137
  describe("setFlag", () => {
96
138
  it("should throw an error if a flag is not provided", async () => {
97
139
  await config.createUser()
@@ -101,8 +143,9 @@ describe("/users", () => {
101
143
  .send({ value: "test" })
102
144
  .expect(400)
103
145
  .expect("Content-Type", /json/)
104
- expect(res.body.message).toEqual("Must supply a 'flag' field in request body.")
105
-
146
+ expect(res.body.message).toEqual(
147
+ "Must supply a 'flag' field in request body."
148
+ )
106
149
  })
107
150
 
108
151
  it("should be able to set a flag on the user", async () => {
@@ -146,8 +189,9 @@ describe("/users", () => {
146
189
  .send({ value: "test" })
147
190
  .expect(400)
148
191
  .expect("Content-Type", /json/)
149
- expect(res.body.message).toEqual("Must supply a 'flag' field in request body.")
150
-
192
+ expect(res.body.message).toEqual(
193
+ "Must supply a 'flag' field in request body."
194
+ )
151
195
  })
152
196
 
153
197
  it("should be able to set a flag on the user", async () => {
@@ -161,37 +205,4 @@ describe("/users", () => {
161
205
  expect(res.body.message).toEqual("Flag set successfully")
162
206
  })
163
207
  })
164
-
165
- describe("syncUser", () => {
166
- it("should sync the user", async () => {
167
- let user = await config.createUser()
168
- await config.createApp('New App')
169
- let res = await request
170
- .post(`/api/users/metadata/sync/${user._id}`)
171
- .set(config.defaultHeaders())
172
- .expect(200)
173
- .expect("Content-Type", /json/)
174
- expect(res.body.message).toEqual('User synced.')
175
- })
176
-
177
-
178
- it("should sync the user when a previous user is specified", async () => {
179
- const app1 = await config.createApp('App 1')
180
- const app2 = await config.createApp('App 2')
181
-
182
- let user = await config.createUser({
183
- builder: false,
184
- admin: true,
185
- roles: { [app1.appId]: 'ADMIN' }
186
- })
187
- let res = await request
188
- .post(`/api/users/metadata/sync/${user._id}`)
189
- .set(config.defaultHeaders())
190
- .send({ previousUser: { ...user, roles: { ...user.roles, [app2.appId]: 'BASIC' } } })
191
- .expect(200)
192
- .expect("Content-Type", /json/)
193
-
194
- expect(res.body.message).toEqual('User synced.')
195
- })
196
- })
197
208
  })
@@ -32,11 +32,6 @@ router
32
32
  authorized(PermissionType.USER, PermissionLevel.WRITE),
33
33
  controller.destroyMetadata
34
34
  )
35
- .post(
36
- "/api/users/metadata/sync/:id",
37
- authorized(PermissionType.USER, PermissionLevel.WRITE),
38
- controller.syncUser
39
- )
40
35
  .post(
41
36
  "/api/users/flags",
42
37
  authorized(PermissionType.USER, PermissionLevel.WRITE),
package/src/app.ts CHANGED
@@ -2,21 +2,9 @@ if (process.env.DD_APM_ENABLED) {
2
2
  require("./ddApm")
3
3
  }
4
4
 
5
- if (process.env.ELASTIC_APM_ENABLED) {
6
- require("./elasticApm")
7
- }
8
-
9
5
  // need to load environment first
10
6
  import env from "./environment"
11
7
 
12
- // enable APM if configured
13
- if (process.env.ELASTIC_APM_ENABLED) {
14
- const apm = require("elastic-apm-node").start({
15
- serviceName: process.env.SERVICE,
16
- environment: process.env.BUDIBASE_ENVIRONMENT,
17
- })
18
- }
19
-
20
8
  import { ExtendableContext } from "koa"
21
9
  import * as db from "./db"
22
10
  db.init()
@@ -27,8 +15,8 @@ import * as api from "./api"
27
15
  import * as automations from "./automations"
28
16
  import { Thread } from "./threads"
29
17
  import * as redis from "./utilities/redis"
18
+ import { initialise as initialiseWebsockets } from "./websockets"
30
19
  import { events, logging, middleware, timers } from "@budibase/backend-core"
31
- import { initialise as initialiseWebsockets } from "./websocket"
32
20
  import { startup } from "./startup"
33
21
  const Sentry = require("@sentry/node")
34
22
  const destroyable = require("server-destroy")
@@ -53,7 +41,8 @@ app.use(
53
41
  })
54
42
  )
55
43
 
56
- app.use(middleware.logging)
44
+ app.use(middleware.correlation)
45
+ app.use(middleware.pino)
57
46
  app.use(userAgent)
58
47
 
59
48
  if (env.isProd()) {
@@ -72,7 +61,7 @@ if (env.isProd()) {
72
61
 
73
62
  const server = http.createServer(app.callback())
74
63
  destroyable(server)
75
- initialiseWebsockets(server)
64
+ initialiseWebsockets(app, server)
76
65
 
77
66
  let shuttingDown = false,
78
67
  errCode = 0
@@ -15,7 +15,14 @@ import * as delay from "./steps/delay"
15
15
  import * as queryRow from "./steps/queryRows"
16
16
  import * as loop from "./steps/loop"
17
17
  import env from "../environment"
18
- import { AutomationStepSchema, AutomationStepInput } from "@budibase/types"
18
+ import {
19
+ AutomationStepSchema,
20
+ AutomationStepInput,
21
+ PluginType,
22
+ AutomationStep,
23
+ } from "@budibase/types"
24
+ import sdk from "../sdk"
25
+ import { getAutomationPlugin } from "../utilities/fileSystem"
19
26
 
20
27
  const ACTION_IMPLS: Record<
21
28
  string,
@@ -38,25 +45,26 @@ const ACTION_IMPLS: Record<
38
45
  zapier: zapier.run,
39
46
  integromat: integromat.run,
40
47
  }
41
- export const ACTION_DEFINITIONS: Record<string, AutomationStepSchema> = {
42
- SEND_EMAIL_SMTP: sendSmtpEmail.definition,
43
- CREATE_ROW: createRow.definition,
44
- UPDATE_ROW: updateRow.definition,
45
- DELETE_ROW: deleteRow.definition,
46
- OUTGOING_WEBHOOK: outgoingWebhook.definition,
47
- EXECUTE_SCRIPT: executeScript.definition,
48
- EXECUTE_QUERY: executeQuery.definition,
49
- SERVER_LOG: serverLog.definition,
50
- DELAY: delay.definition,
51
- FILTER: filter.definition,
52
- QUERY_ROWS: queryRow.definition,
53
- LOOP: loop.definition,
54
- // these used to be lowercase step IDs, maintain for backwards compat
55
- discord: discord.definition,
56
- slack: slack.definition,
57
- zapier: zapier.definition,
58
- integromat: integromat.definition,
59
- }
48
+ export const BUILTIN_ACTION_DEFINITIONS: Record<string, AutomationStepSchema> =
49
+ {
50
+ SEND_EMAIL_SMTP: sendSmtpEmail.definition,
51
+ CREATE_ROW: createRow.definition,
52
+ UPDATE_ROW: updateRow.definition,
53
+ DELETE_ROW: deleteRow.definition,
54
+ OUTGOING_WEBHOOK: outgoingWebhook.definition,
55
+ EXECUTE_SCRIPT: executeScript.definition,
56
+ EXECUTE_QUERY: executeQuery.definition,
57
+ SERVER_LOG: serverLog.definition,
58
+ DELAY: delay.definition,
59
+ FILTER: filter.definition,
60
+ QUERY_ROWS: queryRow.definition,
61
+ LOOP: loop.definition,
62
+ // these used to be lowercase step IDs, maintain for backwards compat
63
+ discord: discord.definition,
64
+ slack: slack.definition,
65
+ zapier: zapier.definition,
66
+ integromat: integromat.definition,
67
+ }
60
68
 
61
69
  // don't add the bash script/definitions unless in self host
62
70
  // the fact this isn't included in any definitions means it cannot be
@@ -66,12 +74,36 @@ if (env.SELF_HOSTED) {
66
74
  // @ts-ignore
67
75
  ACTION_IMPLS["EXECUTE_BASH"] = bash.run
68
76
  // @ts-ignore
69
- ACTION_DEFINITIONS["EXECUTE_BASH"] = bash.definition
77
+ BUILTIN_ACTION_DEFINITIONS["EXECUTE_BASH"] = bash.definition
78
+ }
79
+
80
+ export async function getActionDefinitions() {
81
+ const actionDefinitions = BUILTIN_ACTION_DEFINITIONS
82
+ if (env.SELF_HOSTED) {
83
+ const plugins = await sdk.plugins.fetch(PluginType.AUTOMATION)
84
+ for (let plugin of plugins) {
85
+ const schema = plugin.schema.schema as AutomationStep
86
+ actionDefinitions[schema.stepId] = {
87
+ ...schema,
88
+ custom: true,
89
+ }
90
+ }
91
+ }
92
+ return actionDefinitions
70
93
  }
71
94
 
72
95
  /* istanbul ignore next */
73
- export async function getAction(actionName: string) {
74
- if (ACTION_IMPLS[actionName] != null) {
75
- return ACTION_IMPLS[actionName]
96
+ export async function getAction(stepId: string) {
97
+ if (ACTION_IMPLS[stepId] != null) {
98
+ return ACTION_IMPLS[stepId]
99
+ }
100
+ // must be a plugin
101
+ if (env.SELF_HOSTED) {
102
+ const plugins = await sdk.plugins.fetch(PluginType.AUTOMATION)
103
+ const found = plugins.find(plugin => plugin.schema.schema.stepId === stepId)
104
+ if (!found) {
105
+ throw new Error(`Unable to find action implementation for "${stepId}"`)
106
+ }
107
+ return (await getAutomationPlugin(found)).action
76
108
  }
77
109
  }
@@ -6,7 +6,7 @@ import BullQueue from "bull"
6
6
  export { automationQueue } from "./bullboard"
7
7
  export { shutdown } from "./bullboard"
8
8
  export { TRIGGER_DEFINITIONS } from "./triggers"
9
- export { ACTION_DEFINITIONS } from "./actions"
9
+ export { BUILTIN_ACTION_DEFINITIONS, getActionDefinitions } from "./actions"
10
10
 
11
11
  /**
12
12
  * This module is built purely to kick off the worker farm and manage the inputs/outputs
@@ -4,8 +4,11 @@ import * as automationUtils from "../automationUtils"
4
4
  import environment from "../../environment"
5
5
  import {
6
6
  AutomationActionStepId,
7
- AutomationStepSchema,
7
+ AutomationCustomIOType,
8
+ AutomationIOType,
8
9
  AutomationStepInput,
10
+ AutomationStepSchema,
11
+ AutomationStepType,
9
12
  } from "@budibase/types"
10
13
 
11
14
  export const definition: AutomationStepSchema = {
@@ -13,7 +16,7 @@ export const definition: AutomationStepSchema = {
13
16
  tagline: "Execute a bash command",
14
17
  icon: "JourneyEvent",
15
18
  description: "Run a bash script",
16
- type: "ACTION",
19
+ type: AutomationStepType.ACTION,
17
20
  internal: true,
18
21
  stepId: AutomationActionStepId.EXECUTE_BASH,
19
22
  inputs: {},
@@ -21,8 +24,8 @@ export const definition: AutomationStepSchema = {
21
24
  inputs: {
22
25
  properties: {
23
26
  code: {
24
- type: "string",
25
- customType: "code",
27
+ type: AutomationIOType.STRING,
28
+ customType: AutomationCustomIOType.CODE,
26
29
  title: "Code",
27
30
  },
28
31
  },
@@ -31,16 +34,16 @@ export const definition: AutomationStepSchema = {
31
34
  outputs: {
32
35
  properties: {
33
36
  stdout: {
34
- type: "string",
37
+ type: AutomationIOType.STRING,
35
38
  description: "Standard output of your bash command or script",
36
39
  },
37
40
  success: {
38
- type: "boolean",
41
+ type: AutomationIOType.BOOLEAN,
39
42
  description: "Whether the command was successful",
40
43
  },
41
44
  },
45
+ required: ["stdout"],
42
46
  },
43
- required: ["stdout"],
44
47
  },
45
48
  }
46
49
 
@@ -3,8 +3,11 @@ import { cleanUpRow, getError } from "../automationUtils"
3
3
  import { buildCtx } from "./utils"
4
4
  import {
5
5
  AutomationActionStepId,
6
- AutomationStepSchema,
6
+ AutomationCustomIOType,
7
+ AutomationIOType,
7
8
  AutomationStepInput,
9
+ AutomationStepSchema,
10
+ AutomationStepType,
8
11
  } from "@budibase/types"
9
12
 
10
13
  export const definition: AutomationStepSchema = {
@@ -12,7 +15,7 @@ export const definition: AutomationStepSchema = {
12
15
  tagline: "Create a {{inputs.enriched.table.name}} row",
13
16
  icon: "TableRowAddBottom",
14
17
  description: "Add a row to your database",
15
- type: "ACTION",
18
+ type: AutomationStepType.ACTION,
16
19
  internal: true,
17
20
  stepId: AutomationActionStepId.CREATE_ROW,
18
21
  inputs: {},
@@ -20,14 +23,14 @@ export const definition: AutomationStepSchema = {
20
23
  inputs: {
21
24
  properties: {
22
25
  row: {
23
- type: "object",
26
+ type: AutomationIOType.OBJECT,
24
27
  properties: {
25
28
  tableId: {
26
- type: "string",
27
- customType: "table",
29
+ type: AutomationIOType.STRING,
30
+ customType: AutomationCustomIOType.TABLE,
28
31
  },
29
32
  },
30
- customType: "row",
33
+ customType: AutomationCustomIOType.ROW,
31
34
  title: "Table",
32
35
  required: ["tableId"],
33
36
  },
@@ -37,24 +40,24 @@ export const definition: AutomationStepSchema = {
37
40
  outputs: {
38
41
  properties: {
39
42
  row: {
40
- type: "object",
41
- customType: "row",
43
+ type: AutomationIOType.OBJECT,
44
+ customType: AutomationCustomIOType.ROW,
42
45
  description: "The new row",
43
46
  },
44
47
  response: {
45
- type: "object",
48
+ type: AutomationIOType.OBJECT,
46
49
  description: "The response from the table",
47
50
  },
48
51
  success: {
49
- type: "boolean",
52
+ type: AutomationIOType.BOOLEAN,
50
53
  description: "Whether the row creation was successful",
51
54
  },
52
55
  id: {
53
- type: "string",
56
+ type: AutomationIOType.STRING,
54
57
  description: "The identifier of the new row",
55
58
  },
56
59
  revision: {
57
- type: "string",
60
+ type: AutomationIOType.STRING,
58
61
  description: "The revision of the new row",
59
62
  },
60
63
  },
@@ -1,8 +1,10 @@
1
1
  import { wait } from "../../utilities"
2
2
  import {
3
3
  AutomationActionStepId,
4
- AutomationStepSchema,
4
+ AutomationIOType,
5
5
  AutomationStepInput,
6
+ AutomationStepSchema,
7
+ AutomationStepType,
6
8
  } from "@budibase/types"
7
9
 
8
10
  export const definition: AutomationStepSchema = {
@@ -17,7 +19,7 @@ export const definition: AutomationStepSchema = {
17
19
  inputs: {
18
20
  properties: {
19
21
  time: {
20
- type: "number",
22
+ type: AutomationIOType.NUMBER,
21
23
  title: "Delay in milliseconds",
22
24
  },
23
25
  },
@@ -26,14 +28,14 @@ export const definition: AutomationStepSchema = {
26
28
  outputs: {
27
29
  properties: {
28
30
  success: {
29
- type: "boolean",
31
+ type: AutomationIOType.BOOLEAN,
30
32
  description: "Whether the delay was successful",
31
33
  },
32
34
  },
33
35
  required: ["success"],
34
36
  },
35
37
  },
36
- type: "LOGIC",
38
+ type: AutomationStepType.LOGIC,
37
39
  }
38
40
 
39
41
  export async function run({ inputs }: AutomationStepInput) {
@@ -3,8 +3,11 @@ import { buildCtx } from "./utils"
3
3
  import { getError } from "../automationUtils"
4
4
  import {
5
5
  AutomationActionStepId,
6
- AutomationStepSchema,
7
6
  AutomationStepInput,
7
+ AutomationStepSchema,
8
+ AutomationStepType,
9
+ AutomationIOType,
10
+ AutomationCustomIOType,
8
11
  } from "@budibase/types"
9
12
 
10
13
  export const definition: AutomationStepSchema = {
@@ -12,7 +15,7 @@ export const definition: AutomationStepSchema = {
12
15
  icon: "TableRowRemoveCenter",
13
16
  name: "Delete Row",
14
17
  tagline: "Delete a {{inputs.enriched.table.name}} row",
15
- type: "ACTION",
18
+ type: AutomationStepType.ACTION,
16
19
  stepId: AutomationActionStepId.DELETE_ROW,
17
20
  internal: true,
18
21
  inputs: {},
@@ -20,12 +23,12 @@ export const definition: AutomationStepSchema = {
20
23
  inputs: {
21
24
  properties: {
22
25
  tableId: {
23
- type: "string",
24
- customType: "table",
26
+ type: AutomationIOType.STRING,
27
+ customType: AutomationCustomIOType.TABLE,
25
28
  title: "Table",
26
29
  },
27
30
  id: {
28
- type: "string",
31
+ type: AutomationIOType.STRING,
29
32
  title: "Row ID",
30
33
  },
31
34
  },
@@ -34,16 +37,16 @@ export const definition: AutomationStepSchema = {
34
37
  outputs: {
35
38
  properties: {
36
39
  row: {
37
- type: "object",
38
- customType: "row",
40
+ type: AutomationIOType.OBJECT,
41
+ customType: AutomationCustomIOType.ROW,
39
42
  description: "The deleted row",
40
43
  },
41
44
  response: {
42
- type: "object",
45
+ type: AutomationIOType.OBJECT,
43
46
  description: "The response from the table",
44
47
  },
45
48
  success: {
46
- type: "boolean",
49
+ type: AutomationIOType.BOOLEAN,
47
50
  description: "Whether the deletion was successful",
48
51
  },
49
52
  },
@@ -4,6 +4,8 @@ import {
4
4
  AutomationActionStepId,
5
5
  AutomationStepSchema,
6
6
  AutomationStepInput,
7
+ AutomationStepType,
8
+ AutomationIOType,
7
9
  } from "@budibase/types"
8
10
 
9
11
  const DEFAULT_USERNAME = "Budibase Automate"
@@ -15,26 +17,26 @@ export const definition: AutomationStepSchema = {
15
17
  description: "Send a message to a Discord server",
16
18
  icon: "ri-discord-line",
17
19
  stepId: AutomationActionStepId.discord,
18
- type: "ACTION",
20
+ type: AutomationStepType.ACTION,
19
21
  internal: false,
20
22
  inputs: {},
21
23
  schema: {
22
24
  inputs: {
23
25
  properties: {
24
26
  url: {
25
- type: "string",
27
+ type: AutomationIOType.STRING,
26
28
  title: "Discord Webhook URL",
27
29
  },
28
30
  username: {
29
- type: "string",
31
+ type: AutomationIOType.STRING,
30
32
  title: "Bot Name",
31
33
  },
32
34
  avatar_url: {
33
- type: "string",
35
+ type: AutomationIOType.STRING,
34
36
  title: "Bot Avatar URL",
35
37
  },
36
38
  content: {
37
- type: "string",
39
+ type: AutomationIOType.STRING,
38
40
  title: "Message",
39
41
  },
40
42
  },
@@ -43,15 +45,15 @@ export const definition: AutomationStepSchema = {
43
45
  outputs: {
44
46
  properties: {
45
47
  httpStatus: {
46
- type: "number",
48
+ type: AutomationIOType.NUMBER,
47
49
  description: "The HTTP status code of the request",
48
50
  },
49
51
  response: {
50
- type: "string",
52
+ type: AutomationIOType.STRING,
51
53
  description: "The response from the Discord Webhook",
52
54
  },
53
55
  success: {
54
- type: "boolean",
56
+ type: AutomationIOType.BOOLEAN,
55
57
  description: "Whether the message sent successfully",
56
58
  },
57
59
  },
@@ -3,8 +3,11 @@ import { buildCtx } from "./utils"
3
3
  import * as automationUtils from "../automationUtils"
4
4
  import {
5
5
  AutomationActionStepId,
6
- AutomationStepSchema,
6
+ AutomationCustomIOType,
7
+ AutomationIOType,
7
8
  AutomationStepInput,
9
+ AutomationStepSchema,
10
+ AutomationStepType,
8
11
  } from "@budibase/types"
9
12
 
10
13
  export const definition: AutomationStepSchema = {
@@ -12,7 +15,7 @@ export const definition: AutomationStepSchema = {
12
15
  tagline: "Execute Data Connector",
13
16
  icon: "Data",
14
17
  description: "Execute a query in an external data connector",
15
- type: "ACTION",
18
+ type: AutomationStepType.ACTION,
16
19
  stepId: AutomationActionStepId.EXECUTE_QUERY,
17
20
  internal: true,
18
21
  inputs: {},
@@ -20,14 +23,14 @@ export const definition: AutomationStepSchema = {
20
23
  inputs: {
21
24
  properties: {
22
25
  query: {
23
- type: "object",
26
+ type: AutomationIOType.OBJECT,
24
27
  properties: {
25
28
  queryId: {
26
- type: "string",
27
- customType: "query",
29
+ type: AutomationIOType.STRING,
30
+ customType: AutomationCustomIOType.QUERY,
28
31
  },
29
32
  },
30
- customType: "queryParams",
33
+ customType: AutomationCustomIOType.QUERY_PARAMS,
31
34
  title: "Parameters",
32
35
  required: ["queryId"],
33
36
  },
@@ -37,21 +40,21 @@ export const definition: AutomationStepSchema = {
37
40
  outputs: {
38
41
  properties: {
39
42
  response: {
40
- type: "object",
43
+ type: AutomationIOType.OBJECT,
41
44
  description: "The response from the datasource execution",
42
45
  },
43
46
  info: {
44
- type: "object",
47
+ type: AutomationIOType.OBJECT,
45
48
  description:
46
49
  "Some query types may return extra data, like headers from a REST query",
47
50
  },
48
51
  success: {
49
- type: "boolean",
52
+ type: AutomationIOType.BOOLEAN,
50
53
  description: "Whether the action was successful",
51
54
  },
52
55
  },
56
+ required: ["response", "success"],
53
57
  },
54
- required: ["response", "success"],
55
58
  },
56
59
  }
57
60