@budibase/server 2.5.6-alpha.4 → 2.5.6-alpha.40

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 (130) hide show
  1. package/builder/assets/{index.58b41739.js → index.05e726d8.js} +384 -366
  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/plugin/index.js +6 -37
  9. package/dist/api/controllers/query/index.js +2 -2
  10. package/dist/api/controllers/row/ExternalRequest.js +21 -14
  11. package/dist/api/controllers/table/utils.js +9 -3
  12. package/dist/api/index.js +1 -2
  13. package/dist/api/routes/index.js +0 -2
  14. package/dist/app.js +2 -2
  15. package/dist/automations/actions.js +32 -6
  16. package/dist/automations/index.js +3 -2
  17. package/dist/automations/steps/bash.js +6 -6
  18. package/dist/automations/steps/createRow.js +11 -11
  19. package/dist/automations/steps/delay.js +3 -3
  20. package/dist/automations/steps/deleteRow.js +8 -8
  21. package/dist/automations/steps/discord.js +8 -8
  22. package/dist/automations/steps/executeQuery.js +9 -9
  23. package/dist/automations/steps/executeScript.js +6 -6
  24. package/dist/automations/steps/filter.js +6 -6
  25. package/dist/automations/steps/integromat.js +10 -10
  26. package/dist/automations/steps/loop.js +9 -9
  27. package/dist/automations/steps/outgoingWebhook.js +10 -10
  28. package/dist/automations/steps/queryRows.js +14 -14
  29. package/dist/automations/steps/sendSmtpEmail.js +9 -9
  30. package/dist/automations/steps/serverLog.js +4 -4
  31. package/dist/automations/steps/slack.js +6 -6
  32. package/dist/automations/steps/updateRow.js +11 -11
  33. package/dist/automations/steps/zapier.js +9 -9
  34. package/dist/automations/triggerInfo/app.js +5 -5
  35. package/dist/automations/triggerInfo/cron.js +4 -4
  36. package/dist/automations/triggerInfo/rowDeleted.js +5 -5
  37. package/dist/automations/triggerInfo/rowSaved.js +7 -7
  38. package/dist/automations/triggerInfo/rowUpdated.js +7 -7
  39. package/dist/automations/triggerInfo/webhook.js +6 -6
  40. package/dist/db/utils.js +3 -2
  41. package/dist/integrations/base/sqlTable.js +9 -2
  42. package/dist/integrations/index.js +3 -3
  43. package/dist/migrations/functions/syncQuotas.js +2 -0
  44. package/dist/migrations/functions/usageQuotas/syncApps.js +0 -1
  45. package/dist/migrations/functions/usageQuotas/syncUsers.js +21 -0
  46. package/dist/sdk/app/backups/exports.js +14 -38
  47. package/dist/sdk/index.js +2 -0
  48. package/dist/{api/routes/cloud.js → sdk/plugins/index.js} +2 -14
  49. package/dist/sdk/plugins/plugins.js +53 -0
  50. package/dist/threads/automation.js +2 -2
  51. package/dist/tsconfig.build.tsbuildinfo +1 -1
  52. package/dist/utilities/fileSystem/plugin.js +33 -23
  53. package/dist/utilities/rowProcessor/utils.js +4 -5
  54. package/dist/watch.js +2 -2
  55. package/dist/websockets/client.js +14 -0
  56. package/dist/websockets/grid.js +60 -0
  57. package/dist/websockets/index.js +17 -0
  58. package/dist/websockets/websocket.js +78 -0
  59. package/package.json +11 -10
  60. package/src/api/controllers/application.ts +4 -4
  61. package/src/api/controllers/automation.ts +12 -6
  62. package/src/api/controllers/datasource.ts +15 -5
  63. package/src/api/controllers/dev.ts +2 -2
  64. package/src/api/controllers/plugin/index.ts +8 -45
  65. package/src/api/controllers/query/index.ts +2 -2
  66. package/src/api/controllers/row/ExternalRequest.ts +21 -12
  67. package/src/api/controllers/table/utils.ts +10 -3
  68. package/src/api/index.ts +2 -4
  69. package/src/api/routes/index.ts +0 -2
  70. package/src/api/routes/tests/automation.spec.js +2 -2
  71. package/src/app.ts +2 -2
  72. package/src/automations/actions.ts +56 -24
  73. package/src/automations/index.ts +1 -1
  74. package/src/automations/steps/bash.ts +10 -7
  75. package/src/automations/steps/createRow.ts +15 -12
  76. package/src/automations/steps/delay.ts +6 -4
  77. package/src/automations/steps/deleteRow.ts +12 -9
  78. package/src/automations/steps/discord.ts +10 -8
  79. package/src/automations/steps/executeQuery.ts +13 -10
  80. package/src/automations/steps/executeScript.ts +10 -7
  81. package/src/automations/steps/filter.ts +8 -6
  82. package/src/automations/steps/integromat.ts +12 -10
  83. package/src/automations/steps/loop.ts +16 -10
  84. package/src/automations/steps/outgoingWebhook.ts +14 -11
  85. package/src/automations/steps/queryRows.ts +18 -15
  86. package/src/automations/steps/sendSmtpEmail.ts +11 -9
  87. package/src/automations/steps/serverLog.ts +6 -4
  88. package/src/automations/steps/slack.ts +8 -6
  89. package/src/automations/steps/updateRow.ts +15 -12
  90. package/src/automations/steps/zapier.ts +11 -9
  91. package/src/automations/tests/utilities/index.ts +2 -2
  92. package/src/automations/triggerInfo/app.ts +8 -5
  93. package/src/automations/triggerInfo/cron.ts +7 -4
  94. package/src/automations/triggerInfo/rowDeleted.ts +8 -5
  95. package/src/automations/triggerInfo/rowSaved.ts +10 -7
  96. package/src/automations/triggerInfo/rowUpdated.ts +10 -7
  97. package/src/automations/triggerInfo/webhook.ts +9 -6
  98. package/src/db/utils.ts +1 -0
  99. package/src/integration-test/postgres.spec.ts +3 -1
  100. package/src/integrations/base/sqlTable.ts +9 -2
  101. package/src/integrations/index.ts +3 -3
  102. package/src/migrations/functions/syncQuotas.ts +2 -0
  103. package/src/migrations/functions/usageQuotas/syncApps.ts +1 -2
  104. package/src/migrations/functions/usageQuotas/syncUsers.ts +9 -0
  105. package/src/migrations/functions/usageQuotas/tests/syncUsers.spec.ts +26 -0
  106. package/src/migrations/index.ts +1 -0
  107. package/src/sdk/app/backups/exports.ts +17 -41
  108. package/src/sdk/index.ts +2 -0
  109. package/src/sdk/plugins/index.ts +5 -0
  110. package/src/sdk/plugins/plugins.ts +41 -0
  111. package/src/tests/utilities/structures.ts +25 -17
  112. package/src/threads/automation.ts +2 -2
  113. package/src/utilities/fileSystem/plugin.ts +13 -4
  114. package/src/utilities/rowProcessor/utils.ts +9 -10
  115. package/src/watch.ts +2 -2
  116. package/src/websockets/client.ts +11 -0
  117. package/src/websockets/grid.ts +55 -0
  118. package/src/websockets/index.ts +14 -0
  119. package/src/websockets/websocket.ts +83 -0
  120. package/tsconfig.build.json +3 -5
  121. package/tsconfig.json +2 -1
  122. package/builder/assets/index.841e62d8.css +0 -6
  123. package/dist/api/controllers/cloud.js +0 -130
  124. package/dist/package.json +0 -179
  125. package/dist/websocket.js +0 -22
  126. package/src/api/controllers/cloud.ts +0 -119
  127. package/src/api/routes/cloud.ts +0 -18
  128. package/src/api/routes/tests/cloud.spec.ts +0 -54
  129. package/src/migrations/functions/tests/syncQuotas.spec.js +0 -26
  130. package/src/websocket.ts +0 -26
@@ -8,8 +8,8 @@
8
8
  <link rel="preconnect" href="https://fonts.gstatic.com" />
9
9
  <link href="https://fonts.googleapis.com/css2?family=Source+Sans+Pro:wght@400;600;700&display=swap"
10
10
  rel="stylesheet" />
11
- <script type="module" crossorigin src="/builder/assets/index.58b41739.js"></script>
12
- <link rel="stylesheet" href="/builder/assets/index.841e62d8.css">
11
+ <script type="module" crossorigin src="/builder/assets/index.05e726d8.js"></script>
12
+ <link rel="stylesheet" href="/builder/assets/index.4eae16b2.css">
13
13
  </head>
14
14
 
15
15
  <body id="app">
@@ -14,7 +14,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.updateAppPackage = exports.sync = exports.unpublish = exports.destroy = exports.revertClient = exports.updateClient = exports.update = exports.create = exports.fetchAppPackage = exports.fetchAppDefinition = exports.fetch = void 0;
16
16
  const environment_1 = __importDefault(require("../../environment"));
17
- const package_json_1 = __importDefault(require("../../../package.json"));
18
17
  const staticViews_1 = require("../../db/views/staticViews");
19
18
  const fileSystem_1 = require("../../utilities/fileSystem");
20
19
  const utils_1 = require("../../db/utils");
@@ -174,7 +173,7 @@ function fetchAppPackage(ctx) {
174
173
  }
175
174
  const clientLibPath = backend_core_1.objectStore.clientLibraryUrl(ctx.params.appId, application.version);
176
175
  ctx.body = {
177
- application,
176
+ application: Object.assign(Object.assign({}, application), { upgradableVersion: backend_core_1.env.VERSION }),
178
177
  screens,
179
178
  layouts,
180
179
  clientLibPath,
@@ -209,7 +208,7 @@ function performAppCreate(ctx) {
209
208
  _rev: undefined,
210
209
  appId,
211
210
  type: "app",
212
- version: package_json_1.default.version,
211
+ version: backend_core_1.env.VERSION,
213
212
  componentLibraries: ["@budibase/standard-components"],
214
213
  name: name,
215
214
  url: url,
@@ -377,7 +376,7 @@ function updateClient(ctx) {
377
376
  yield (0, fileSystem_2.updateClientLibrary)(ctx.params.appId);
378
377
  }
379
378
  // Update versions in app package
380
- const updatedToVersion = package_json_1.default.version;
379
+ const updatedToVersion = backend_core_1.env.VERSION;
381
380
  const appPackageUpdates = {
382
381
  version: updatedToVersion,
383
382
  revertableVersion: currentVersion,
@@ -33,7 +33,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
33
33
  };
34
34
  Object.defineProperty(exports, "__esModule", { value: true });
35
35
  exports.test = exports.trigger = exports.getDefinitionList = exports.getTriggerList = exports.getActionList = exports.clearLogError = exports.logSearch = exports.destroy = exports.find = exports.fetch = exports.update = exports.handleStepEvents = exports.getDeletedSteps = exports.getNewSteps = exports.create = void 0;
36
- const actions = __importStar(require("../../automations/actions"));
37
36
  const triggers = __importStar(require("../../automations/triggers"));
38
37
  const utils_1 = require("../../db/utils");
39
38
  const utils_2 = require("../../automations/utils");
@@ -42,8 +41,15 @@ const constants_1 = require("../../constants");
42
41
  const redis_1 = require("../../utilities/redis");
43
42
  const backend_core_1 = require("@budibase/backend-core");
44
43
  const pro_1 = require("@budibase/pro");
45
- const ACTION_DEFS = (0, utils_2.removeDeprecated)(actions.ACTION_DEFINITIONS);
46
- const TRIGGER_DEFS = (0, utils_2.removeDeprecated)(triggers.TRIGGER_DEFINITIONS);
44
+ const actions_1 = require("../../automations/actions");
45
+ function getActionDefinitions() {
46
+ return __awaiter(this, void 0, void 0, function* () {
47
+ return (0, utils_2.removeDeprecated)(yield (0, actions_1.getActionDefinitions)());
48
+ });
49
+ }
50
+ function getTriggerDefinitions() {
51
+ return (0, utils_2.removeDeprecated)(triggers.TRIGGER_DEFINITIONS);
52
+ }
47
53
  /*************************
48
54
  * *
49
55
  * BUILDER FUNCTIONS *
@@ -234,21 +240,21 @@ function clearLogError(ctx) {
234
240
  exports.clearLogError = clearLogError;
235
241
  function getActionList(ctx) {
236
242
  return __awaiter(this, void 0, void 0, function* () {
237
- ctx.body = ACTION_DEFS;
243
+ ctx.body = yield getActionDefinitions();
238
244
  });
239
245
  }
240
246
  exports.getActionList = getActionList;
241
247
  function getTriggerList(ctx) {
242
248
  return __awaiter(this, void 0, void 0, function* () {
243
- ctx.body = TRIGGER_DEFS;
249
+ ctx.body = getTriggerDefinitions();
244
250
  });
245
251
  }
246
252
  exports.getTriggerList = getTriggerList;
247
253
  function getDefinitionList(ctx) {
248
254
  return __awaiter(this, void 0, void 0, function* () {
249
255
  ctx.body = {
250
- trigger: TRIGGER_DEFS,
251
- action: ACTION_DEFS,
256
+ trigger: getTriggerDefinitions(),
257
+ action: yield getActionDefinitions(),
252
258
  };
253
259
  });
254
260
  }
@@ -168,7 +168,7 @@ function save(ctx) {
168
168
  const db = backend_core_1.context.getAppDB();
169
169
  const plus = ctx.request.body.datasource.plus;
170
170
  const fetchSchema = ctx.request.body.fetchSchema;
171
- const datasource = Object.assign({ _id: (0, utils_1.generateDatasourceID)({ plus }), type: plus ? utils_1.DocumentType.DATASOURCE_PLUS : utils_1.DocumentType.DATASOURCE }, ctx.request.body.datasource);
171
+ const datasource = Object.assign(Object.assign({ _id: (0, utils_1.generateDatasourceID)({ plus }) }, ctx.request.body.datasource), { type: plus ? utils_1.DocumentType.DATASOURCE_PLUS : utils_1.DocumentType.DATASOURCE });
172
172
  let schemaError = null;
173
173
  if (fetchSchema) {
174
174
  const { tables, error } = yield buildSchemaHelper(datasource);
@@ -136,7 +136,7 @@ function revert(ctx) {
136
136
  exports.revert = revert;
137
137
  function getBudibaseVersion(ctx) {
138
138
  return __awaiter(this, void 0, void 0, function* () {
139
- const version = require("../../../package.json").version;
139
+ const version = backend_core_1.env.VERSION;
140
140
  ctx.body = {
141
141
  version,
142
142
  };
@@ -12,30 +12,14 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.processUploadedPlugin = exports.destroy = exports.fetch = exports.create = exports.upload = exports.getPlugins = void 0;
15
+ exports.destroy = exports.fetch = exports.create = exports.upload = void 0;
16
16
  const uploaders_1 = require("./uploaders");
17
17
  const backend_core_1 = require("@budibase/backend-core");
18
18
  const types_1 = require("@budibase/types");
19
19
  const environment_1 = __importDefault(require("../../../environment"));
20
- const websocket_1 = require("../../../websocket");
20
+ const websockets_1 = require("../../../websockets");
21
+ const sdk_1 = __importDefault(require("../../../sdk"));
21
22
  const pro_1 = require("@budibase/pro");
22
- function getPlugins(type) {
23
- return __awaiter(this, void 0, void 0, function* () {
24
- const db = backend_core_1.tenancy.getGlobalDB();
25
- const response = yield db.allDocs(backend_core_1.db.getPluginParams(null, {
26
- include_docs: true,
27
- }));
28
- let plugins = response.rows.map((row) => row.doc);
29
- plugins = backend_core_1.objectStore.enrichPluginURLs(plugins);
30
- if (type) {
31
- return plugins.filter((plugin) => { var _a; return ((_a = plugin.schema) === null || _a === void 0 ? void 0 : _a.type) === type; });
32
- }
33
- else {
34
- return plugins;
35
- }
36
- });
37
- }
38
- exports.getPlugins = getPlugins;
39
23
  function upload(ctx) {
40
24
  return __awaiter(this, void 0, void 0, function* () {
41
25
  const plugins = ctx.request.files.file.length > 1
@@ -45,7 +29,7 @@ function upload(ctx) {
45
29
  let docs = [];
46
30
  // can do single or multiple plugins
47
31
  for (let plugin of plugins) {
48
- const doc = yield processUploadedPlugin(plugin, types_1.PluginSource.FILE);
32
+ const doc = yield sdk_1.default.plugins.processUploaded(plugin, types_1.PluginSource.FILE);
49
33
  docs.push(doc);
50
34
  }
51
35
  ctx.body = {
@@ -93,7 +77,7 @@ function create(ctx) {
93
77
  throw new Error("Only component plugins are supported outside of self-host");
94
78
  }
95
79
  const doc = yield pro_1.sdk.plugins.storePlugin(metadata, directory, source);
96
- websocket_1.ClientAppSocket.emit("plugins-update", { name, hash: doc.hash });
80
+ websockets_1.clientAppSocket.emit("plugins-update", { name, hash: doc.hash });
97
81
  ctx.body = {
98
82
  message: "Plugin uploaded successfully",
99
83
  plugins: [doc],
@@ -109,7 +93,7 @@ function create(ctx) {
109
93
  exports.create = create;
110
94
  function fetch(ctx) {
111
95
  return __awaiter(this, void 0, void 0, function* () {
112
- ctx.body = yield getPlugins();
96
+ ctx.body = yield sdk_1.default.plugins.fetch();
113
97
  });
114
98
  }
115
99
  exports.fetch = fetch;
@@ -126,18 +110,3 @@ function destroy(ctx) {
126
110
  });
127
111
  }
128
112
  exports.destroy = destroy;
129
- function processUploadedPlugin(plugin, source) {
130
- var _a;
131
- return __awaiter(this, void 0, void 0, function* () {
132
- const { metadata, directory } = yield (0, uploaders_1.fileUpload)(plugin);
133
- backend_core_1.plugins.validate(metadata === null || metadata === void 0 ? void 0 : metadata.schema);
134
- // Only allow components in cloud
135
- if (!environment_1.default.SELF_HOSTED && ((_a = metadata === null || metadata === void 0 ? void 0 : metadata.schema) === null || _a === void 0 ? void 0 : _a.type) !== types_1.PluginType.COMPONENT) {
136
- throw new Error("Only component plugins are supported outside of self-host");
137
- }
138
- const doc = yield pro_1.sdk.plugins.storePlugin(metadata, directory, source);
139
- websocket_1.ClientAppSocket.emit("plugin-update", { name: doc.name, hash: doc.hash });
140
- return doc;
141
- });
142
- }
143
- exports.processUploadedPlugin = processUploadedPlugin;
@@ -237,7 +237,7 @@ function execute(ctx, opts = { rowsOnly: false, isAutomation: false }) {
237
237
  },
238
238
  };
239
239
  const runFn = () => Runner.run(inputs);
240
- const { rows, pagination, extra } = yield pro_1.quotas.addQuery(runFn, {
240
+ const { rows, pagination, extra, info } = yield pro_1.quotas.addQuery(runFn, {
241
241
  datasourceId: datasource._id,
242
242
  });
243
243
  // remove the raw from execution incase transformer being used to hide data
@@ -248,7 +248,7 @@ function execute(ctx, opts = { rowsOnly: false, isAutomation: false }) {
248
248
  ctx.body = rows;
249
249
  }
250
250
  else {
251
- ctx.body = Object.assign({ data: rows, pagination }, extra);
251
+ ctx.body = Object.assign(Object.assign({ data: rows, pagination }, extra), info);
252
252
  }
253
253
  }
254
254
  catch (err) {
@@ -28,7 +28,6 @@ const types_1 = require("@budibase/types");
28
28
  const utils_1 = require("../../../integrations/utils");
29
29
  const utils_2 = require("./utils");
30
30
  const constants_1 = require("../../../constants");
31
- const utils_3 = require("../../../integrations/utils");
32
31
  const string_templates_1 = require("@budibase/string-templates");
33
32
  const fp_1 = require("lodash/fp");
34
33
  const rowProcessor_1 = require("../../../utilities/rowProcessor");
@@ -146,7 +145,7 @@ function getEndpoint(tableId, operation) {
146
145
  if (!tableId) {
147
146
  return {};
148
147
  }
149
- const { datasourceId, tableName } = (0, utils_3.breakExternalTableId)(tableId);
148
+ const { datasourceId, tableName } = (0, utils_1.breakExternalTableId)(tableId);
150
149
  return {
151
150
  datasourceId,
152
151
  entityId: tableName,
@@ -214,7 +213,7 @@ class ExternalRequest {
214
213
  if (!tableId) {
215
214
  throw "Table ID is unknown, cannot find table";
216
215
  }
217
- const { tableName } = (0, utils_3.breakExternalTableId)(tableId);
216
+ const { tableName } = (0, utils_1.breakExternalTableId)(tableId);
218
217
  if (tableName) {
219
218
  return this.tables[tableName];
220
219
  }
@@ -250,7 +249,7 @@ class ExternalRequest {
250
249
  newRow[key] = row[key];
251
250
  continue;
252
251
  }
253
- const { tableName: linkTableName } = (0, utils_3.breakExternalTableId)(field === null || field === void 0 ? void 0 : field.tableId);
252
+ const { tableName: linkTableName } = (0, utils_1.breakExternalTableId)(field === null || field === void 0 ? void 0 : field.tableId);
254
253
  // table has to exist for many to many
255
254
  if (!linkTableName || !this.tables[linkTableName]) {
256
255
  continue;
@@ -312,10 +311,18 @@ class ExternalRequest {
312
311
  }
313
312
  const display = linkedTable.primaryDisplay;
314
313
  for (let key of Object.keys(row[relationship.column])) {
315
- const related = row[relationship.column][key];
314
+ let relatedRow = row[relationship.column][key];
315
+ // add this row as context for the relationship
316
+ for (let col of Object.values(linkedTable.schema)) {
317
+ if (col.type === types_1.FieldType.LINK && col.tableId === table._id) {
318
+ relatedRow[col.name] = [row];
319
+ }
320
+ }
321
+ relatedRow = (0, rowProcessor_1.processFormulas)(linkedTable, relatedRow);
322
+ const relatedDisplay = display ? relatedRow[display] : undefined;
316
323
  row[relationship.column][key] = {
317
- primaryDisplay: display ? related[display] : undefined,
318
- _id: related._id,
324
+ primaryDisplay: relatedDisplay || "Invalid display column",
325
+ _id: relatedRow._id,
319
326
  };
320
327
  }
321
328
  }
@@ -404,7 +411,7 @@ class ExternalRequest {
404
411
  if (field.type !== constants_1.FieldTypes.LINK) {
405
412
  continue;
406
413
  }
407
- const { tableName: linkTableName } = (0, utils_3.breakExternalTableId)(field.tableId);
414
+ const { tableName: linkTableName } = (0, utils_1.breakExternalTableId)(field.tableId);
408
415
  // no table to link to, this is not a valid relationships
409
416
  if (!linkTableName || !this.tables[linkTableName]) {
410
417
  continue;
@@ -422,7 +429,7 @@ class ExternalRequest {
422
429
  column: fieldName,
423
430
  };
424
431
  if (field.through) {
425
- const { tableName: throughTableName } = (0, utils_3.breakExternalTableId)(field.through);
432
+ const { tableName: throughTableName } = (0, utils_1.breakExternalTableId)(field.through);
426
433
  definition.through = throughTableName;
427
434
  // don't support composite keys for relationships
428
435
  definition.from = field.throughTo || table.primary[0];
@@ -441,7 +448,7 @@ class ExternalRequest {
441
448
  lookupRelations(tableId, row) {
442
449
  return __awaiter(this, void 0, void 0, function* () {
443
450
  const related = {};
444
- const { tableName } = (0, utils_3.breakExternalTableId)(tableId);
451
+ const { tableName } = (0, utils_1.breakExternalTableId)(tableId);
445
452
  if (!tableName) {
446
453
  return related;
447
454
  }
@@ -458,7 +465,7 @@ class ExternalRequest {
458
465
  }
459
466
  const isMany = field.relationshipType === types_1.RelationshipTypes.MANY_TO_MANY;
460
467
  const tableId = isMany ? field.through : field.tableId;
461
- const { tableName: relatedTableName } = (0, utils_3.breakExternalTableId)(tableId);
468
+ const { tableName: relatedTableName } = (0, utils_1.breakExternalTableId)(tableId);
462
469
  // @ts-ignore
463
470
  const linkPrimaryKey = this.tables[relatedTableName].primary[0];
464
471
  const manyKey = field.throughTo || primaryKey;
@@ -579,7 +586,7 @@ class ExternalRequest {
579
586
  if (field.type !== constants_1.FieldTypes.LINK || !includeRelations) {
580
587
  continue;
581
588
  }
582
- const { tableName: linkTableName } = (0, utils_3.breakExternalTableId)(field.tableId);
589
+ const { tableName: linkTableName } = (0, utils_1.breakExternalTableId)(field.tableId);
583
590
  if (linkTableName) {
584
591
  const linkTable = this.tables[linkTableName];
585
592
  if (linkTable) {
@@ -594,7 +601,7 @@ class ExternalRequest {
594
601
  var _a;
595
602
  return __awaiter(this, void 0, void 0, function* () {
596
603
  const { operation, tableId } = this;
597
- let { datasourceId, tableName } = (0, utils_3.breakExternalTableId)(tableId);
604
+ let { datasourceId, tableName } = (0, utils_1.breakExternalTableId)(tableId);
598
605
  if (!tableName) {
599
606
  throw "Unable to run without a table name";
600
607
  }
@@ -606,7 +613,7 @@ class ExternalRequest {
606
613
  this.tables = this.datasource.entities;
607
614
  }
608
615
  const table = this.tables[tableName];
609
- let isSql = (0, utils_3.isSQL)(this.datasource);
616
+ let isSql = (0, utils_1.isSQL)(this.datasource);
610
617
  if (!table) {
611
618
  throw `Unable to process query, table "${tableName}" not defined.`;
612
619
  }
@@ -97,19 +97,25 @@ function makeSureTableUpToDate(table, tableToSave) {
97
97
  }
98
98
  exports.makeSureTableUpToDate = makeSureTableUpToDate;
99
99
  function importToRows(data, table, user = null) {
100
+ let originalTable = table;
100
101
  let finalData = [];
101
102
  for (let i = 0; i < data.length; i++) {
102
103
  let row = data[i];
103
104
  row._id = (0, utils_1.generateRowID)(table._id);
104
105
  row.tableId = table._id;
106
+ // We use a reference to table here and update it after input processing,
107
+ // so that we can auto increment auto IDs in imported data properly
105
108
  const processed = (0, rowProcessor_1.inputProcessing)(user, table, row, {
106
109
  noAutoRelationships: true,
107
110
  });
108
111
  row = processed.row;
109
112
  table = processed.table;
110
- for (const [fieldName, schema] of Object.entries(table.schema)) {
111
- // check whether the options need to be updated for inclusion as part of the data import
112
- if (schema.type === constants_1.FieldTypes.OPTIONS &&
113
+ // However here we must reference the original table, as we want to mutate
114
+ // the real schema of the table passed in, not the clone used for
115
+ // incrementing auto IDs
116
+ for (const [fieldName, schema] of Object.entries(originalTable.schema)) {
117
+ if ((schema.type === constants_1.FieldTypes.OPTIONS ||
118
+ schema.type === constants_1.FieldTypes.ARRAY) &&
113
119
  row[fieldName] &&
114
120
  (!schema.constraints.inclusion ||
115
121
  schema.constraints.inclusion.indexOf(row[fieldName]) === -1)) {
package/dist/api/index.js CHANGED
@@ -9,14 +9,13 @@ const backend_core_1 = require("@budibase/backend-core");
9
9
  const currentapp_1 = __importDefault(require("../middleware/currentapp"));
10
10
  const zlib_1 = __importDefault(require("zlib"));
11
11
  const routes_1 = require("./routes");
12
- const package_json_1 = __importDefault(require("../../package.json"));
13
12
  const pro_1 = require("@budibase/pro");
14
13
  var public_1 = require("./routes/public");
15
14
  Object.defineProperty(exports, "shutdown", { enumerable: true, get: function () { return public_1.shutdown; } });
16
15
  const compress = require("koa-compress");
17
16
  exports.router = new router_1.default();
18
17
  exports.router.get("/health", ctx => (ctx.status = 200));
19
- exports.router.get("/version", ctx => (ctx.body = package_json_1.default.version));
18
+ exports.router.get("/version", ctx => (ctx.body = backend_core_1.env.VERSION));
20
19
  exports.router.use(backend_core_1.middleware.errorHandling);
21
20
  exports.router
22
21
  .use(compress({
@@ -28,7 +28,6 @@ const query_1 = __importDefault(require("./query"));
28
28
  const backup_1 = __importDefault(require("./backup"));
29
29
  const metadata_1 = __importDefault(require("./metadata"));
30
30
  const dev_1 = __importDefault(require("./dev"));
31
- const cloud_1 = __importDefault(require("./cloud"));
32
31
  const migrations_1 = __importDefault(require("./migrations"));
33
32
  const plugin_1 = __importDefault(require("./plugin"));
34
33
  const ops_1 = __importDefault(require("./ops"));
@@ -64,7 +63,6 @@ exports.mainRoutes = [
64
63
  query_1.default,
65
64
  metadata_1.default,
66
65
  dev_1.default,
67
- cloud_1.default,
68
66
  row_1.default,
69
67
  migrations_1.default,
70
68
  plugin_1.default,
package/dist/app.js CHANGED
@@ -49,8 +49,8 @@ const api = __importStar(require("./api"));
49
49
  const automations = __importStar(require("./automations"));
50
50
  const threads_1 = require("./threads");
51
51
  const redis = __importStar(require("./utilities/redis"));
52
+ const websockets_1 = require("./websockets");
52
53
  const backend_core_1 = require("@budibase/backend-core");
53
- const websocket_1 = require("./websocket");
54
54
  const startup_1 = require("./startup");
55
55
  const Sentry = require("@sentry/node");
56
56
  const destroyable = require("server-destroy");
@@ -87,7 +87,7 @@ if (environment_1.default.isProd()) {
87
87
  }
88
88
  const server = http_1.default.createServer(app.callback());
89
89
  destroyable(server);
90
- (0, websocket_1.initialise)(server);
90
+ (0, websockets_1.initialise)(app, server);
91
91
  let shuttingDown = false, errCode = 0;
92
92
  server.on("close", () => __awaiter(void 0, void 0, void 0, function* () {
93
93
  // already in process
@@ -35,7 +35,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
35
35
  return (mod && mod.__esModule) ? mod : { "default": mod };
36
36
  };
37
37
  Object.defineProperty(exports, "__esModule", { value: true });
38
- exports.getAction = exports.ACTION_DEFINITIONS = void 0;
38
+ exports.getAction = exports.getActionDefinitions = exports.BUILTIN_ACTION_DEFINITIONS = void 0;
39
39
  const sendSmtpEmail = __importStar(require("./steps/sendSmtpEmail"));
40
40
  const createRow = __importStar(require("./steps/createRow"));
41
41
  const updateRow = __importStar(require("./steps/updateRow"));
@@ -53,6 +53,9 @@ const delay = __importStar(require("./steps/delay"));
53
53
  const queryRow = __importStar(require("./steps/queryRows"));
54
54
  const loop = __importStar(require("./steps/loop"));
55
55
  const environment_1 = __importDefault(require("../environment"));
56
+ const types_1 = require("@budibase/types");
57
+ const sdk_1 = __importDefault(require("../sdk"));
58
+ const fileSystem_1 = require("../utilities/fileSystem");
56
59
  const ACTION_IMPLS = {
57
60
  SEND_EMAIL_SMTP: sendSmtpEmail.run,
58
61
  CREATE_ROW: createRow.run,
@@ -71,7 +74,7 @@ const ACTION_IMPLS = {
71
74
  zapier: zapier.run,
72
75
  integromat: integromat.run,
73
76
  };
74
- exports.ACTION_DEFINITIONS = {
77
+ exports.BUILTIN_ACTION_DEFINITIONS = {
75
78
  SEND_EMAIL_SMTP: sendSmtpEmail.definition,
76
79
  CREATE_ROW: createRow.definition,
77
80
  UPDATE_ROW: updateRow.definition,
@@ -98,13 +101,36 @@ if (environment_1.default.SELF_HOSTED) {
98
101
  // @ts-ignore
99
102
  ACTION_IMPLS["EXECUTE_BASH"] = bash.run;
100
103
  // @ts-ignore
101
- exports.ACTION_DEFINITIONS["EXECUTE_BASH"] = bash.definition;
104
+ exports.BUILTIN_ACTION_DEFINITIONS["EXECUTE_BASH"] = bash.definition;
102
105
  }
106
+ function getActionDefinitions() {
107
+ return __awaiter(this, void 0, void 0, function* () {
108
+ const actionDefinitions = exports.BUILTIN_ACTION_DEFINITIONS;
109
+ if (environment_1.default.SELF_HOSTED) {
110
+ const plugins = yield sdk_1.default.plugins.fetch(types_1.PluginType.AUTOMATION);
111
+ for (let plugin of plugins) {
112
+ const schema = plugin.schema.schema;
113
+ actionDefinitions[schema.stepId] = Object.assign(Object.assign({}, schema), { custom: true });
114
+ }
115
+ }
116
+ return actionDefinitions;
117
+ });
118
+ }
119
+ exports.getActionDefinitions = getActionDefinitions;
103
120
  /* istanbul ignore next */
104
- function getAction(actionName) {
121
+ function getAction(stepId) {
105
122
  return __awaiter(this, void 0, void 0, function* () {
106
- if (ACTION_IMPLS[actionName] != null) {
107
- return ACTION_IMPLS[actionName];
123
+ if (ACTION_IMPLS[stepId] != null) {
124
+ return ACTION_IMPLS[stepId];
125
+ }
126
+ // must be a plugin
127
+ if (environment_1.default.SELF_HOSTED) {
128
+ const plugins = yield sdk_1.default.plugins.fetch(types_1.PluginType.AUTOMATION);
129
+ const found = plugins.find(plugin => plugin.schema.schema.stepId === stepId);
130
+ if (!found) {
131
+ throw new Error(`Unable to find action implementation for "${stepId}"`);
132
+ }
133
+ return (yield (0, fileSystem_1.getAutomationPlugin)(found)).action;
108
134
  }
109
135
  });
110
136
  }
@@ -9,7 +9,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.getQueues = exports.init = exports.ACTION_DEFINITIONS = exports.TRIGGER_DEFINITIONS = exports.shutdown = exports.automationQueue = void 0;
12
+ exports.getQueues = exports.init = exports.getActionDefinitions = exports.BUILTIN_ACTION_DEFINITIONS = exports.TRIGGER_DEFINITIONS = exports.shutdown = exports.automationQueue = void 0;
13
13
  const utils_1 = require("./utils");
14
14
  const bullboard_1 = require("./bullboard");
15
15
  const triggers_1 = require("./triggers");
@@ -20,7 +20,8 @@ Object.defineProperty(exports, "shutdown", { enumerable: true, get: function ()
20
20
  var triggers_2 = require("./triggers");
21
21
  Object.defineProperty(exports, "TRIGGER_DEFINITIONS", { enumerable: true, get: function () { return triggers_2.TRIGGER_DEFINITIONS; } });
22
22
  var actions_1 = require("./actions");
23
- Object.defineProperty(exports, "ACTION_DEFINITIONS", { enumerable: true, get: function () { return actions_1.ACTION_DEFINITIONS; } });
23
+ Object.defineProperty(exports, "BUILTIN_ACTION_DEFINITIONS", { enumerable: true, get: function () { return actions_1.BUILTIN_ACTION_DEFINITIONS; } });
24
+ Object.defineProperty(exports, "getActionDefinitions", { enumerable: true, get: function () { return actions_1.getActionDefinitions; } });
24
25
  /**
25
26
  * This module is built purely to kick off the worker farm and manage the inputs/outputs
26
27
  */
@@ -46,7 +46,7 @@ exports.definition = {
46
46
  tagline: "Execute a bash command",
47
47
  icon: "JourneyEvent",
48
48
  description: "Run a bash script",
49
- type: "ACTION",
49
+ type: types_1.AutomationStepType.ACTION,
50
50
  internal: true,
51
51
  stepId: types_1.AutomationActionStepId.EXECUTE_BASH,
52
52
  inputs: {},
@@ -54,8 +54,8 @@ exports.definition = {
54
54
  inputs: {
55
55
  properties: {
56
56
  code: {
57
- type: "string",
58
- customType: "code",
57
+ type: types_1.AutomationIOType.STRING,
58
+ customType: types_1.AutomationCustomIOType.CODE,
59
59
  title: "Code",
60
60
  },
61
61
  },
@@ -64,16 +64,16 @@ exports.definition = {
64
64
  outputs: {
65
65
  properties: {
66
66
  stdout: {
67
- type: "string",
67
+ type: types_1.AutomationIOType.STRING,
68
68
  description: "Standard output of your bash command or script",
69
69
  },
70
70
  success: {
71
- type: "boolean",
71
+ type: types_1.AutomationIOType.BOOLEAN,
72
72
  description: "Whether the command was successful",
73
73
  },
74
74
  },
75
+ required: ["stdout"],
75
76
  },
76
- required: ["stdout"],
77
77
  },
78
78
  };
79
79
  function run({ inputs, context }) {
@@ -19,7 +19,7 @@ exports.definition = {
19
19
  tagline: "Create a {{inputs.enriched.table.name}} row",
20
20
  icon: "TableRowAddBottom",
21
21
  description: "Add a row to your database",
22
- type: "ACTION",
22
+ type: types_1.AutomationStepType.ACTION,
23
23
  internal: true,
24
24
  stepId: types_1.AutomationActionStepId.CREATE_ROW,
25
25
  inputs: {},
@@ -27,14 +27,14 @@ exports.definition = {
27
27
  inputs: {
28
28
  properties: {
29
29
  row: {
30
- type: "object",
30
+ type: types_1.AutomationIOType.OBJECT,
31
31
  properties: {
32
32
  tableId: {
33
- type: "string",
34
- customType: "table",
33
+ type: types_1.AutomationIOType.STRING,
34
+ customType: types_1.AutomationCustomIOType.TABLE,
35
35
  },
36
36
  },
37
- customType: "row",
37
+ customType: types_1.AutomationCustomIOType.ROW,
38
38
  title: "Table",
39
39
  required: ["tableId"],
40
40
  },
@@ -44,24 +44,24 @@ exports.definition = {
44
44
  outputs: {
45
45
  properties: {
46
46
  row: {
47
- type: "object",
48
- customType: "row",
47
+ type: types_1.AutomationIOType.OBJECT,
48
+ customType: types_1.AutomationCustomIOType.ROW,
49
49
  description: "The new row",
50
50
  },
51
51
  response: {
52
- type: "object",
52
+ type: types_1.AutomationIOType.OBJECT,
53
53
  description: "The response from the table",
54
54
  },
55
55
  success: {
56
- type: "boolean",
56
+ type: types_1.AutomationIOType.BOOLEAN,
57
57
  description: "Whether the row creation was successful",
58
58
  },
59
59
  id: {
60
- type: "string",
60
+ type: types_1.AutomationIOType.STRING,
61
61
  description: "The identifier of the new row",
62
62
  },
63
63
  revision: {
64
- type: "string",
64
+ type: types_1.AutomationIOType.STRING,
65
65
  description: "The revision of the new row",
66
66
  },
67
67
  },
@@ -24,7 +24,7 @@ exports.definition = {
24
24
  inputs: {
25
25
  properties: {
26
26
  time: {
27
- type: "number",
27
+ type: types_1.AutomationIOType.NUMBER,
28
28
  title: "Delay in milliseconds",
29
29
  },
30
30
  },
@@ -33,14 +33,14 @@ exports.definition = {
33
33
  outputs: {
34
34
  properties: {
35
35
  success: {
36
- type: "boolean",
36
+ type: types_1.AutomationIOType.BOOLEAN,
37
37
  description: "Whether the delay was successful",
38
38
  },
39
39
  },
40
40
  required: ["success"],
41
41
  },
42
42
  },
43
- type: "LOGIC",
43
+ type: types_1.AutomationStepType.LOGIC,
44
44
  };
45
45
  function run({ inputs }) {
46
46
  return __awaiter(this, void 0, void 0, function* () {