@budibase/server 2.5.6-alpha.3 → 2.5.6-alpha.30

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 (126) hide show
  1. package/builder/assets/index.44a18341.css +6 -0
  2. package/builder/assets/{index.a33a6c3d.js → index.87d46c61.js} +382 -366
  3. package/builder/index.html +2 -2
  4. package/dist/api/controllers/application.js +2 -3
  5. package/dist/api/controllers/automation.js +13 -7
  6. package/dist/api/controllers/dev.js +1 -1
  7. package/dist/api/controllers/plugin/index.js +6 -37
  8. package/dist/api/controllers/query/index.js +2 -2
  9. package/dist/api/controllers/row/ExternalRequest.js +21 -14
  10. package/dist/api/controllers/table/utils.js +9 -3
  11. package/dist/api/index.js +1 -2
  12. package/dist/api/routes/index.js +0 -2
  13. package/dist/app.js +2 -2
  14. package/dist/automations/actions.js +32 -6
  15. package/dist/automations/index.js +3 -2
  16. package/dist/automations/steps/bash.js +6 -6
  17. package/dist/automations/steps/createRow.js +11 -11
  18. package/dist/automations/steps/delay.js +3 -3
  19. package/dist/automations/steps/deleteRow.js +8 -8
  20. package/dist/automations/steps/discord.js +8 -8
  21. package/dist/automations/steps/executeQuery.js +9 -9
  22. package/dist/automations/steps/executeScript.js +6 -6
  23. package/dist/automations/steps/filter.js +6 -6
  24. package/dist/automations/steps/integromat.js +10 -10
  25. package/dist/automations/steps/loop.js +9 -9
  26. package/dist/automations/steps/outgoingWebhook.js +10 -10
  27. package/dist/automations/steps/queryRows.js +14 -14
  28. package/dist/automations/steps/sendSmtpEmail.js +9 -9
  29. package/dist/automations/steps/serverLog.js +4 -4
  30. package/dist/automations/steps/slack.js +6 -6
  31. package/dist/automations/steps/updateRow.js +11 -11
  32. package/dist/automations/steps/zapier.js +9 -9
  33. package/dist/automations/triggerInfo/app.js +5 -5
  34. package/dist/automations/triggerInfo/cron.js +4 -4
  35. package/dist/automations/triggerInfo/rowDeleted.js +5 -5
  36. package/dist/automations/triggerInfo/rowSaved.js +7 -7
  37. package/dist/automations/triggerInfo/rowUpdated.js +7 -7
  38. package/dist/automations/triggerInfo/webhook.js +6 -6
  39. package/dist/integrations/base/sqlTable.js +9 -2
  40. package/dist/integrations/index.js +3 -3
  41. package/dist/migrations/functions/syncQuotas.js +2 -0
  42. package/dist/migrations/functions/usageQuotas/syncApps.js +0 -1
  43. package/dist/migrations/functions/usageQuotas/syncUsers.js +21 -0
  44. package/dist/sdk/app/backups/exports.js +1 -35
  45. package/dist/sdk/index.js +2 -0
  46. package/dist/{api/routes/cloud.js → sdk/plugins/index.js} +2 -14
  47. package/dist/sdk/plugins/plugins.js +53 -0
  48. package/dist/threads/automation.js +2 -2
  49. package/dist/tsconfig.build.tsbuildinfo +1 -1
  50. package/dist/utilities/fileSystem/plugin.js +33 -23
  51. package/dist/utilities/rowProcessor/utils.js +4 -5
  52. package/dist/watch.js +2 -2
  53. package/dist/websockets/client.js +14 -0
  54. package/dist/websockets/grid.js +60 -0
  55. package/dist/websockets/index.js +17 -0
  56. package/dist/websockets/websocket.js +78 -0
  57. package/package.json +11 -10
  58. package/src/api/controllers/application.ts +3 -3
  59. package/src/api/controllers/automation.ts +12 -6
  60. package/src/api/controllers/dev.ts +2 -2
  61. package/src/api/controllers/plugin/index.ts +8 -45
  62. package/src/api/controllers/query/index.ts +2 -2
  63. package/src/api/controllers/row/ExternalRequest.ts +21 -12
  64. package/src/api/controllers/table/utils.ts +10 -3
  65. package/src/api/index.ts +2 -4
  66. package/src/api/routes/index.ts +0 -2
  67. package/src/api/routes/tests/automation.spec.js +2 -2
  68. package/src/app.ts +2 -2
  69. package/src/automations/actions.ts +56 -24
  70. package/src/automations/index.ts +1 -1
  71. package/src/automations/steps/bash.ts +10 -7
  72. package/src/automations/steps/createRow.ts +15 -12
  73. package/src/automations/steps/delay.ts +6 -4
  74. package/src/automations/steps/deleteRow.ts +12 -9
  75. package/src/automations/steps/discord.ts +10 -8
  76. package/src/automations/steps/executeQuery.ts +13 -10
  77. package/src/automations/steps/executeScript.ts +10 -7
  78. package/src/automations/steps/filter.ts +8 -6
  79. package/src/automations/steps/integromat.ts +12 -10
  80. package/src/automations/steps/loop.ts +16 -10
  81. package/src/automations/steps/outgoingWebhook.ts +14 -11
  82. package/src/automations/steps/queryRows.ts +18 -15
  83. package/src/automations/steps/sendSmtpEmail.ts +11 -9
  84. package/src/automations/steps/serverLog.ts +6 -4
  85. package/src/automations/steps/slack.ts +8 -6
  86. package/src/automations/steps/updateRow.ts +15 -12
  87. package/src/automations/steps/zapier.ts +11 -9
  88. package/src/automations/tests/utilities/index.ts +2 -2
  89. package/src/automations/triggerInfo/app.ts +8 -5
  90. package/src/automations/triggerInfo/cron.ts +7 -4
  91. package/src/automations/triggerInfo/rowDeleted.ts +8 -5
  92. package/src/automations/triggerInfo/rowSaved.ts +10 -7
  93. package/src/automations/triggerInfo/rowUpdated.ts +10 -7
  94. package/src/automations/triggerInfo/webhook.ts +9 -6
  95. package/src/integration-test/postgres.spec.ts +2 -0
  96. package/src/integrations/base/sqlTable.ts +9 -2
  97. package/src/integrations/index.ts +3 -3
  98. package/src/migrations/functions/syncQuotas.ts +2 -0
  99. package/src/migrations/functions/usageQuotas/syncApps.ts +1 -2
  100. package/src/migrations/functions/usageQuotas/syncUsers.ts +9 -0
  101. package/src/migrations/functions/usageQuotas/tests/syncUsers.spec.ts +26 -0
  102. package/src/migrations/index.ts +1 -0
  103. package/src/sdk/app/backups/exports.ts +0 -35
  104. package/src/sdk/index.ts +2 -0
  105. package/src/sdk/plugins/index.ts +5 -0
  106. package/src/sdk/plugins/plugins.ts +41 -0
  107. package/src/tests/utilities/structures.ts +25 -17
  108. package/src/threads/automation.ts +2 -2
  109. package/src/utilities/fileSystem/plugin.ts +13 -4
  110. package/src/utilities/rowProcessor/utils.ts +9 -10
  111. package/src/watch.ts +2 -2
  112. package/src/websockets/client.ts +11 -0
  113. package/src/websockets/grid.ts +55 -0
  114. package/src/websockets/index.ts +14 -0
  115. package/src/websockets/websocket.ts +83 -0
  116. package/tsconfig.build.json +3 -5
  117. package/tsconfig.json +2 -1
  118. package/builder/assets/index.841e62d8.css +0 -6
  119. package/dist/api/controllers/cloud.js +0 -130
  120. package/dist/package.json +0 -179
  121. package/dist/websocket.js +0 -22
  122. package/src/api/controllers/cloud.ts +0 -119
  123. package/src/api/routes/cloud.ts +0 -18
  124. package/src/api/routes/tests/cloud.spec.ts +0 -54
  125. package/src/migrations/functions/tests/syncQuotas.spec.js +0 -26
  126. package/src/websocket.ts +0 -26
@@ -1,4 +1,7 @@
1
1
  import {
2
+ AutomationCustomIOType,
3
+ AutomationIOType,
4
+ AutomationStepType,
2
5
  AutomationTriggerSchema,
3
6
  AutomationTriggerStepId,
4
7
  } from "@budibase/types"
@@ -15,8 +18,8 @@ export const definition: AutomationTriggerSchema = {
15
18
  inputs: {
16
19
  properties: {
17
20
  tableId: {
18
- type: "string",
19
- customType: "table",
21
+ type: AutomationIOType.STRING,
22
+ customType: AutomationCustomIOType.TABLE,
20
23
  title: "Table",
21
24
  },
22
25
  },
@@ -25,13 +28,13 @@ export const definition: AutomationTriggerSchema = {
25
28
  outputs: {
26
29
  properties: {
27
30
  row: {
28
- type: "object",
29
- customType: "row",
31
+ type: AutomationIOType.OBJECT,
32
+ customType: AutomationCustomIOType.ROW,
30
33
  description: "The row that was deleted",
31
34
  },
32
35
  },
33
36
  required: ["row"],
34
37
  },
35
38
  },
36
- type: "TRIGGER",
39
+ type: AutomationStepType.TRIGGER,
37
40
  }
@@ -1,4 +1,7 @@
1
1
  import {
2
+ AutomationCustomIOType,
3
+ AutomationIOType,
4
+ AutomationStepType,
2
5
  AutomationTriggerSchema,
3
6
  AutomationTriggerStepId,
4
7
  } from "@budibase/types"
@@ -15,8 +18,8 @@ export const definition: AutomationTriggerSchema = {
15
18
  inputs: {
16
19
  properties: {
17
20
  tableId: {
18
- type: "string",
19
- customType: "table",
21
+ type: AutomationIOType.STRING,
22
+ customType: AutomationCustomIOType.TABLE,
20
23
  title: "Table",
21
24
  },
22
25
  },
@@ -25,21 +28,21 @@ export const definition: AutomationTriggerSchema = {
25
28
  outputs: {
26
29
  properties: {
27
30
  row: {
28
- type: "object",
29
- customType: "row",
31
+ type: AutomationIOType.OBJECT,
32
+ customType: AutomationCustomIOType.ROW,
30
33
  description: "The new row that was created",
31
34
  },
32
35
  id: {
33
- type: "string",
36
+ type: AutomationIOType.STRING,
34
37
  description: "Row ID - can be used for updating",
35
38
  },
36
39
  revision: {
37
- type: "string",
40
+ type: AutomationIOType.STRING,
38
41
  description: "Revision of row",
39
42
  },
40
43
  },
41
44
  required: ["row", "id"],
42
45
  },
43
46
  },
44
- type: "TRIGGER",
47
+ type: AutomationStepType.TRIGGER,
45
48
  }
@@ -1,4 +1,7 @@
1
1
  import {
2
+ AutomationCustomIOType,
3
+ AutomationIOType,
4
+ AutomationStepType,
2
5
  AutomationTriggerSchema,
3
6
  AutomationTriggerStepId,
4
7
  } from "@budibase/types"
@@ -15,8 +18,8 @@ export const definition: AutomationTriggerSchema = {
15
18
  inputs: {
16
19
  properties: {
17
20
  tableId: {
18
- type: "string",
19
- customType: "table",
21
+ type: AutomationIOType.STRING,
22
+ customType: AutomationCustomIOType.TABLE,
20
23
  title: "Table",
21
24
  },
22
25
  },
@@ -25,21 +28,21 @@ export const definition: AutomationTriggerSchema = {
25
28
  outputs: {
26
29
  properties: {
27
30
  row: {
28
- type: "object",
29
- customType: "row",
31
+ type: AutomationIOType.OBJECT,
32
+ customType: AutomationCustomIOType.ROW,
30
33
  description: "The row that was updated",
31
34
  },
32
35
  id: {
33
- type: "string",
36
+ type: AutomationIOType.STRING,
34
37
  description: "Row ID - can be used for updating",
35
38
  },
36
39
  revision: {
37
- type: "string",
40
+ type: AutomationIOType.STRING,
38
41
  description: "Revision of row",
39
42
  },
40
43
  },
41
44
  required: ["row", "id"],
42
45
  },
43
46
  },
44
- type: "TRIGGER",
47
+ type: AutomationStepType.TRIGGER,
45
48
  }
@@ -1,4 +1,7 @@
1
1
  import {
2
+ AutomationCustomIOType,
3
+ AutomationIOType,
4
+ AutomationStepType,
2
5
  AutomationTriggerSchema,
3
6
  AutomationTriggerStepId,
4
7
  } from "@budibase/types"
@@ -15,13 +18,13 @@ export const definition: AutomationTriggerSchema = {
15
18
  inputs: {
16
19
  properties: {
17
20
  schemaUrl: {
18
- type: "string",
19
- customType: "webhookUrl",
21
+ type: AutomationIOType.STRING,
22
+ customType: AutomationCustomIOType.WEBHOOK_URL,
20
23
  title: "Schema URL",
21
24
  },
22
25
  triggerUrl: {
23
- type: "string",
24
- customType: "webhookUrl",
26
+ type: AutomationIOType.STRING,
27
+ customType: AutomationCustomIOType.WEBHOOK_URL,
25
28
  title: "Trigger URL",
26
29
  },
27
30
  },
@@ -30,12 +33,12 @@ export const definition: AutomationTriggerSchema = {
30
33
  outputs: {
31
34
  properties: {
32
35
  body: {
33
- type: "object",
36
+ type: AutomationIOType.OBJECT,
34
37
  description: "Body of the request which hit the webhook",
35
38
  },
36
39
  },
37
40
  required: ["body"],
38
41
  },
39
42
  },
40
- type: "TRIGGER",
43
+ type: AutomationStepType.TRIGGER,
41
44
  }
@@ -921,6 +921,7 @@ describe("row api - postgres", () => {
921
921
  [m2mFieldName]: [
922
922
  {
923
923
  _id: row._id,
924
+ primaryDisplay: "Invalid display column",
924
925
  },
925
926
  ],
926
927
  })
@@ -929,6 +930,7 @@ describe("row api - postgres", () => {
929
930
  [m2mFieldName]: [
930
931
  {
931
932
  _id: row._id,
933
+ primaryDisplay: "Invalid display column",
932
934
  },
933
935
  ],
934
936
  })
@@ -79,10 +79,17 @@ function generateSchema(
79
79
  if (!relatedTable) {
80
80
  throw "Referenced table doesn't exist"
81
81
  }
82
- schema.integer(column.foreignKey).unsigned()
82
+ const relatedPrimary = relatedTable.primary[0]
83
+ const externalType = relatedTable.schema[relatedPrimary].externalType
84
+ if (externalType) {
85
+ schema.specificType(column.foreignKey, externalType)
86
+ } else {
87
+ schema.integer(column.foreignKey).unsigned()
88
+ }
89
+
83
90
  schema
84
91
  .foreign(column.foreignKey)
85
- .references(`${tableName}.${relatedTable.primary[0]}`)
92
+ .references(`${tableName}.${relatedPrimary}`)
86
93
  }
87
94
  break
88
95
  }
@@ -14,11 +14,11 @@ import firebase from "./firebase"
14
14
  import redis from "./redis"
15
15
  import snowflake from "./snowflake"
16
16
  import oracle from "./oracle"
17
- import { getPlugins } from "../api/controllers/plugin"
18
17
  import { SourceName, Integration, PluginType } from "@budibase/types"
19
18
  import { getDatasourcePlugin } from "../utilities/fileSystem"
20
19
  import env from "../environment"
21
20
  import { cloneDeep } from "lodash"
21
+ import sdk from "../sdk"
22
22
 
23
23
  const DEFINITIONS: { [key: string]: Integration } = {
24
24
  [SourceName.POSTGRES]: postgres.schema,
@@ -79,7 +79,7 @@ export async function getDefinition(source: SourceName): Promise<Integration> {
79
79
  export async function getDefinitions() {
80
80
  const pluginSchemas: { [key: string]: Integration } = {}
81
81
  if (env.SELF_HOSTED) {
82
- const plugins = await getPlugins(PluginType.DATASOURCE)
82
+ const plugins = await sdk.plugins.fetch(PluginType.DATASOURCE)
83
83
  // extract the actual schema from each custom
84
84
  for (let plugin of plugins) {
85
85
  const sourceId = plugin.name
@@ -103,7 +103,7 @@ export async function getIntegration(integration: string) {
103
103
  return INTEGRATIONS[integration]
104
104
  }
105
105
  if (env.SELF_HOSTED) {
106
- const plugins = await getPlugins(PluginType.DATASOURCE)
106
+ const plugins = await sdk.plugins.fetch(PluginType.DATASOURCE)
107
107
  for (let plugin of plugins) {
108
108
  if (plugin.name === integration) {
109
109
  // need to use commonJS require due to its dynamic runtime nature
@@ -2,6 +2,7 @@ import { runQuotaMigration } from "./usageQuotas"
2
2
  import * as syncApps from "./usageQuotas/syncApps"
3
3
  import * as syncRows from "./usageQuotas/syncRows"
4
4
  import * as syncPlugins from "./usageQuotas/syncPlugins"
5
+ import * as syncUsers from "./usageQuotas/syncUsers"
5
6
 
6
7
  /**
7
8
  * Synchronise quotas to the state of the db.
@@ -11,5 +12,6 @@ export const run = async () => {
11
12
  await syncApps.run()
12
13
  await syncRows.run()
13
14
  await syncPlugins.run()
15
+ await syncUsers.run()
14
16
  })
15
17
  }
@@ -1,4 +1,4 @@
1
- import { tenancy, db as dbCore } from "@budibase/backend-core"
1
+ import { db as dbCore } from "@budibase/backend-core"
2
2
  import { quotas } from "@budibase/pro"
3
3
  import { QuotaUsageType, StaticQuotaName } from "@budibase/types"
4
4
 
@@ -8,7 +8,6 @@ export const run = async () => {
8
8
  const appCount = devApps ? devApps.length : 0
9
9
 
10
10
  // sync app count
11
- const tenantId = tenancy.getTenantId()
12
11
  console.log(`Syncing app count: ${appCount}`)
13
12
  await quotas.setUsage(appCount, StaticQuotaName.APPS, QuotaUsageType.STATIC)
14
13
  }
@@ -0,0 +1,9 @@
1
+ import { users } from "@budibase/backend-core"
2
+ import { quotas } from "@budibase/pro"
3
+ import { QuotaUsageType, StaticQuotaName } from "@budibase/types"
4
+
5
+ export const run = async () => {
6
+ const userCount = await users.getUserCount()
7
+ console.log(`Syncing user count: ${userCount}`)
8
+ await quotas.setUsage(userCount, StaticQuotaName.USERS, QuotaUsageType.STATIC)
9
+ }
@@ -0,0 +1,26 @@
1
+ import TestConfig from "../../../../tests/utilities/TestConfiguration"
2
+ import * as syncUsers from "../syncUsers"
3
+ import { quotas } from "@budibase/pro"
4
+
5
+ describe("syncUsers", () => {
6
+ let config = new TestConfig(false)
7
+
8
+ beforeEach(async () => {
9
+ await config.init()
10
+ })
11
+
12
+ afterAll(config.end)
13
+
14
+ it("syncs users", async () => {
15
+ return config.doInContext(null, async () => {
16
+ await config.createUser()
17
+
18
+ await syncUsers.run()
19
+
20
+ const usageDoc = await quotas.getQuotaUsage()
21
+ // default + additional user
22
+ const userCount = 2
23
+ expect(usageDoc.usageQuota.users).toBe(userCount)
24
+ })
25
+ })
26
+ })
@@ -11,6 +11,7 @@ import env from "../environment"
11
11
  // migration functions
12
12
  import * as userEmailViewCasing from "./functions/userEmailViewCasing"
13
13
  import * as syncQuotas from "./functions/syncQuotas"
14
+ import * as syncUsers from "./functions/usageQuotas/syncUsers"
14
15
  import * as appUrls from "./functions/appUrls"
15
16
  import * as tableSettings from "./functions/tableSettings"
16
17
  import * as backfill from "./functions/backfill"
@@ -148,41 +148,6 @@ export async function exportApp(appId: string, config?: ExportOpts) {
148
148
  }
149
149
  }
150
150
 
151
- /**
152
- * Export all apps + global DB (if supplied) to a single tarball, this includes
153
- * the attachments for each app as well.
154
- * @param {object[]} appMetadata The IDs and names of apps to export.
155
- * @param {string} globalDbContents The contents of the global DB to export as well.
156
- * @return {string} The path to the tarball.
157
- */
158
- export async function exportMultipleApps(
159
- appMetadata: { appId: string; name: string }[],
160
- globalDbContents?: string
161
- ) {
162
- const tmpPath = join(budibaseTempDir(), uuid())
163
- fs.mkdirSync(tmpPath)
164
- let exportPromises: Promise<void>[] = []
165
- // export each app to a directory, then move it into the complete export
166
- const exportAndMove = async (appId: string, appName: string) => {
167
- const path = await exportApp(appId)
168
- await fs.promises.rename(path, join(tmpPath, appName))
169
- }
170
- for (let metadata of appMetadata) {
171
- exportPromises.push(exportAndMove(metadata.appId, metadata.name))
172
- }
173
- // wait for all exports to finish
174
- await Promise.all(exportPromises)
175
- // add the global DB contents
176
- if (globalDbContents) {
177
- fs.writeFileSync(join(tmpPath, GLOBAL_DB_EXPORT_FILE), globalDbContents)
178
- }
179
- const appNames = appMetadata.map(metadata => metadata.name)
180
- const tarPath = tarFilesToTmp(tmpPath, [...appNames, GLOBAL_DB_EXPORT_FILE])
181
- // clear up the tmp path now tarball generated
182
- fs.rmSync(tmpPath, { recursive: true, force: true })
183
- return tarPath
184
- }
185
-
186
151
  /**
187
152
  * Streams a backup of the database state for an app
188
153
  * @param {string} appId The ID of the app which is to be backed up.
package/src/sdk/index.ts CHANGED
@@ -6,6 +6,7 @@ import { default as datasources } from "./app/datasources"
6
6
  import { default as queries } from "./app/queries"
7
7
  import { default as rows } from "./app/rows"
8
8
  import { default as users } from "./users"
9
+ import { default as plugins } from "./plugins"
9
10
 
10
11
  const sdk = {
11
12
  backups,
@@ -16,6 +17,7 @@ const sdk = {
16
17
  users,
17
18
  datasources,
18
19
  queries,
20
+ plugins,
19
21
  }
20
22
 
21
23
  // default export for TS
@@ -0,0 +1,5 @@
1
+ import * as plugins from "./plugins"
2
+
3
+ export default {
4
+ ...plugins,
5
+ }
@@ -0,0 +1,41 @@
1
+ import { FileType, Plugin, PluginSource, PluginType } from "@budibase/types"
2
+ import {
3
+ db as dbCore,
4
+ objectStore,
5
+ plugins as pluginCore,
6
+ tenancy,
7
+ } from "@budibase/backend-core"
8
+ import { fileUpload } from "../../api/controllers/plugin/file"
9
+ import env from "../../environment"
10
+ import { clientAppSocket } from "../../websockets"
11
+ import { sdk as pro } from "@budibase/pro"
12
+
13
+ export async function fetch(type?: PluginType) {
14
+ const db = tenancy.getGlobalDB()
15
+ const response = await db.allDocs(
16
+ dbCore.getPluginParams(null, {
17
+ include_docs: true,
18
+ })
19
+ )
20
+ let plugins = response.rows.map((row: any) => row.doc) as Plugin[]
21
+ plugins = objectStore.enrichPluginURLs(plugins)
22
+ if (type) {
23
+ return plugins.filter((plugin: Plugin) => plugin.schema?.type === type)
24
+ } else {
25
+ return plugins
26
+ }
27
+ }
28
+
29
+ export async function processUploaded(plugin: FileType, source?: PluginSource) {
30
+ const { metadata, directory } = await fileUpload(plugin)
31
+ pluginCore.validate(metadata?.schema)
32
+
33
+ // Only allow components in cloud
34
+ if (!env.SELF_HOSTED && metadata?.schema?.type !== PluginType.COMPONENT) {
35
+ throw new Error("Only component plugins are supported outside of self-host")
36
+ }
37
+
38
+ const doc = await pro.plugins.storePlugin(metadata, directory, source)
39
+ clientAppSocket.emit("plugin-update", { name: doc.name, hash: doc.hash })
40
+ return doc
41
+ }
@@ -1,18 +1,22 @@
1
- import { permissions, roles } from "@budibase/backend-core"
1
+ import { permissions, roles, utils } from "@budibase/backend-core"
2
2
  import { createHomeScreen } from "../../constants/screens"
3
3
  import { EMPTY_LAYOUT } from "../../constants/layouts"
4
4
  import { cloneDeep } from "lodash/fp"
5
- import { ACTION_DEFINITIONS, TRIGGER_DEFINITIONS } from "../../automations"
5
+ import {
6
+ BUILTIN_ACTION_DEFINITIONS,
7
+ TRIGGER_DEFINITIONS,
8
+ } from "../../automations"
6
9
  import {
7
10
  Automation,
8
11
  AutomationActionStepId,
12
+ AutomationStep,
13
+ AutomationStepType,
14
+ AutomationTrigger,
9
15
  AutomationTriggerStepId,
10
16
  Datasource,
11
17
  SourceName,
12
18
  } from "@budibase/types"
13
19
 
14
- const { v4: uuidv4 } = require("uuid")
15
-
16
20
  export function basicTable() {
17
21
  return {
18
22
  name: "TestTable",
@@ -71,19 +75,19 @@ export function view(tableId: string) {
71
75
  }
72
76
 
73
77
  export function automationStep(
74
- actionDefinition = ACTION_DEFINITIONS.CREATE_ROW
75
- ) {
78
+ actionDefinition = BUILTIN_ACTION_DEFINITIONS.CREATE_ROW
79
+ ): AutomationStep {
76
80
  return {
77
- id: uuidv4(),
81
+ id: utils.newid(),
78
82
  ...actionDefinition,
79
83
  }
80
84
  }
81
85
 
82
86
  export function automationTrigger(
83
87
  triggerDefinition = TRIGGER_DEFINITIONS.ROW_SAVED
84
- ) {
88
+ ): AutomationTrigger {
85
89
  return {
86
- id: uuidv4(),
90
+ id: utils.newid(),
87
91
  ...triggerDefinition,
88
92
  }
89
93
  }
@@ -106,7 +110,7 @@ export function newAutomation({ steps, trigger }: any = {}) {
106
110
  return automation
107
111
  }
108
112
 
109
- export function basicAutomation(appId?: string) {
113
+ export function basicAutomation(appId?: string): Automation {
110
114
  return {
111
115
  name: "My Automation",
112
116
  screenId: "kasdkfldsafkl",
@@ -119,18 +123,22 @@ export function basicAutomation(appId?: string) {
119
123
  tagline: "test",
120
124
  icon: "test",
121
125
  description: "test",
122
- type: "trigger",
126
+ type: AutomationStepType.TRIGGER,
123
127
  id: "test",
124
128
  inputs: {},
125
129
  schema: {
126
- inputs: {},
127
- outputs: {},
130
+ inputs: {
131
+ properties: {},
132
+ },
133
+ outputs: {
134
+ properties: {},
135
+ },
128
136
  },
129
137
  },
130
138
  steps: [],
131
139
  },
132
140
  type: "automation",
133
- appId,
141
+ appId: appId!,
134
142
  }
135
143
  }
136
144
 
@@ -154,7 +162,7 @@ export function loopAutomation(tableId: string, loopOpts?: any): Automation {
154
162
  inputs: {
155
163
  tableId,
156
164
  },
157
- schema: ACTION_DEFINITIONS.QUERY_ROWS.schema,
165
+ schema: BUILTIN_ACTION_DEFINITIONS.QUERY_ROWS.schema,
158
166
  },
159
167
  {
160
168
  id: "c",
@@ -163,7 +171,7 @@ export function loopAutomation(tableId: string, loopOpts?: any): Automation {
163
171
  internal: true,
164
172
  inputs: loopOpts,
165
173
  blockToLoop: "d",
166
- schema: ACTION_DEFINITIONS.LOOP.schema,
174
+ schema: BUILTIN_ACTION_DEFINITIONS.LOOP.schema,
167
175
  },
168
176
  {
169
177
  id: "d",
@@ -173,7 +181,7 @@ export function loopAutomation(tableId: string, loopOpts?: any): Automation {
173
181
  inputs: {
174
182
  text: "log statement",
175
183
  },
176
- schema: ACTION_DEFINITIONS.SERVER_LOG.schema,
184
+ schema: BUILTIN_ACTION_DEFINITIONS.SERVER_LOG.schema,
177
185
  },
178
186
  ],
179
187
  trigger: {
@@ -27,8 +27,8 @@ import { processObject } from "@budibase/string-templates"
27
27
  import { cloneDeep } from "lodash/fp"
28
28
  import * as sdkUtils from "../sdk/utils"
29
29
  import env from "../environment"
30
- const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId
31
- const LOOP_STEP_ID = actions.ACTION_DEFINITIONS.LOOP.stepId
30
+ const FILTER_STEP_ID = actions.BUILTIN_ACTION_DEFINITIONS.FILTER.stepId
31
+ const LOOP_STEP_ID = actions.BUILTIN_ACTION_DEFINITIONS.LOOP.stepId
32
32
  const CRON_STEP_ID = triggerDefs.CRON.stepId
33
33
  const STOPPED_STATUS = { success: true, status: AutomationStatus.STOPPED }
34
34
 
@@ -5,6 +5,7 @@ import { join } from "path"
5
5
  import { objectStore } from "@budibase/backend-core"
6
6
 
7
7
  const DATASOURCE_PATH = join(budibaseTempDir(), "datasource")
8
+ const AUTOMATION_PATH = join(budibaseTempDir(), "automation")
8
9
 
9
10
  export const getPluginMetadata = async (path: string) => {
10
11
  let metadata: any = {}
@@ -33,12 +34,12 @@ export const getPluginMetadata = async (path: string) => {
33
34
  return { metadata, directory: path }
34
35
  }
35
36
 
36
- export const getDatasourcePlugin = async (plugin: Plugin) => {
37
+ async function getPluginImpl(path: string, plugin: Plugin) {
37
38
  const hash = plugin.schema?.hash
38
- if (!fs.existsSync(DATASOURCE_PATH)) {
39
- fs.mkdirSync(DATASOURCE_PATH)
39
+ if (!fs.existsSync(path)) {
40
+ fs.mkdirSync(path)
40
41
  }
41
- const filename = join(DATASOURCE_PATH, plugin.name)
42
+ const filename = join(path, plugin.name)
42
43
  const metadataName = `${filename}.bbmetadata`
43
44
  if (fs.existsSync(filename)) {
44
45
  const currentHash = fs.readFileSync(metadataName, "utf8")
@@ -62,3 +63,11 @@ export const getDatasourcePlugin = async (plugin: Plugin) => {
62
63
 
63
64
  return require(filename)
64
65
  }
66
+
67
+ export const getDatasourcePlugin = async (plugin: Plugin) => {
68
+ return getPluginImpl(DATASOURCE_PATH, plugin)
69
+ }
70
+
71
+ export const getAutomationPlugin = async (plugin: Plugin) => {
72
+ return getPluginImpl(AUTOMATION_PATH, plugin)
73
+ }
@@ -1,11 +1,11 @@
1
1
  import {
2
- FieldTypes,
3
- FormulaTypes,
4
2
  AutoFieldDefaultNames,
5
3
  AutoFieldSubTypes,
4
+ FieldTypes,
5
+ FormulaTypes,
6
6
  } from "../../constants"
7
7
  import { processStringSync } from "@budibase/string-templates"
8
- import { FieldSchema, Table, Row } from "@budibase/types"
8
+ import { FieldSchema, FieldType, Row, Table } from "@budibase/types"
9
9
 
10
10
  /**
11
11
  * If the subtype has been lost for any reason this works out what
@@ -50,6 +50,7 @@ export function processFormulas(
50
50
  const isStatic = schema.formulaType === FormulaTypes.STATIC
51
51
  if (
52
52
  schema.type !== FieldTypes.FORMULA ||
53
+ schema.formula == null ||
53
54
  (dynamic && isStatic) ||
54
55
  (!dynamic && !isStatic)
55
56
  ) {
@@ -57,13 +58,11 @@ export function processFormulas(
57
58
  }
58
59
  // iterate through rows and process formula
59
60
  for (let i = 0; i < rowArray.length; i++) {
60
- if (schema.formula) {
61
- let row = rowArray[i]
62
- let context = contextRows ? contextRows[i] : row
63
- rowArray[i] = {
64
- ...row,
65
- [column]: processStringSync(schema.formula, context),
66
- }
61
+ let row = rowArray[i]
62
+ let context = contextRows ? contextRows[i] : row
63
+ rowArray[i] = {
64
+ ...row,
65
+ [column]: processStringSync(schema.formula, context),
67
66
  }
68
67
  }
69
68
  }
package/src/watch.ts CHANGED
@@ -3,7 +3,7 @@ import env from "./environment"
3
3
  import chokidar from "chokidar"
4
4
  import fs from "fs"
5
5
  import { constants, tenancy } from "@budibase/backend-core"
6
- import { processUploadedPlugin } from "./api/controllers/plugin"
6
+ import pluginsSdk from "./sdk/plugins"
7
7
 
8
8
  export function watch() {
9
9
  const watchPath = path.join(env.PLUGINS_DIR, "./**/*.tar.gz")
@@ -27,7 +27,7 @@ export function watch() {
27
27
  const split = path.split("/")
28
28
  const name = split[split.length - 1]
29
29
  console.log("Importing plugin:", path)
30
- await processUploadedPlugin({ name, path })
30
+ await pluginsSdk.processUploaded({ name, path })
31
31
  } catch (err: any) {
32
32
  const message = err?.message ? err?.message : err
33
33
  console.error("Failed to import plugin:", message)
@@ -0,0 +1,11 @@
1
+ import Socket from "./websocket"
2
+ import authorized from "../middleware/authorized"
3
+ import http from "http"
4
+ import Koa from "koa"
5
+ import { permissions } from "@budibase/backend-core"
6
+
7
+ export default class ClientAppWebsocket extends Socket {
8
+ constructor(app: Koa, server: http.Server) {
9
+ super(app, server, "/socket/client", [authorized(permissions.BUILDER)])
10
+ }
11
+ }