@budibase/server 1.0.151-alpha.2 → 1.0.153

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 (176) hide show
  1. package/builder/assets/{index.8716cb1f.js → index.01cadea9.js} +163 -163
  2. package/builder/index.html +1 -1
  3. package/coverage/clover.xml +157 -136
  4. package/coverage/coverage-final.json +5 -5
  5. package/coverage/lcov-report/api/controllers/analytics.js.html +1 -1
  6. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  11. package/coverage/lcov-report/api/controllers/component.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  14. package/coverage/lcov-report/api/controllers/index.html +1 -1
  15. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  20. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  21. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  35. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/view/exporters.js.html +3 -3
  39. package/coverage/lcov-report/api/controllers/view/index.html +4 -4
  40. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  43. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  44. package/coverage/lcov-report/api/index.html +1 -1
  45. package/coverage/lcov-report/api/index.js.html +1 -1
  46. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  56. package/coverage/lcov-report/api/routes/index.html +1 -1
  57. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  70. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  71. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  73. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  74. package/coverage/lcov-report/automations/actions.js.html +1 -1
  75. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  76. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  77. package/coverage/lcov-report/automations/index.html +1 -1
  78. package/coverage/lcov-report/automations/index.js.html +1 -1
  79. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  85. package/coverage/lcov-report/automations/steps/index.html +1 -1
  86. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/queryRows.js.html +2 -5
  90. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  93. package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  95. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  96. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  104. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  105. package/coverage/lcov-report/constants/index.html +5 -5
  106. package/coverage/lcov-report/constants/index.js.html +19 -4
  107. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  108. package/coverage/lcov-report/constants/screens.js.html +1 -1
  109. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  110. package/coverage/lcov-report/db/index.html +1 -1
  111. package/coverage/lcov-report/db/index.js.html +1 -1
  112. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  115. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  116. package/coverage/lcov-report/db/newid.js.html +1 -1
  117. package/coverage/lcov-report/db/utils.js.html +1 -1
  118. package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
  119. package/coverage/lcov-report/events/index.html +1 -1
  120. package/coverage/lcov-report/events/index.js.html +1 -1
  121. package/coverage/lcov-report/events/utils.js.html +1 -1
  122. package/coverage/lcov-report/index.html +23 -23
  123. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  124. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  125. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  126. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  127. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  128. package/coverage/lcov-report/middleware/index.html +1 -1
  129. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  130. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  131. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  132. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  133. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  134. package/coverage/lcov-report/threads/automation.js.html +117 -63
  135. package/coverage/lcov-report/threads/index.html +19 -19
  136. package/coverage/lcov-report/threads/query.js.html +1 -1
  137. package/coverage/lcov-report/threads/utils.js.html +1 -1
  138. package/coverage/lcov-report/utilities/bcrypt.js.html +1 -1
  139. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  140. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  141. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  142. package/coverage/lcov-report/utilities/global.js.html +1 -1
  143. package/coverage/lcov-report/utilities/index.html +1 -1
  144. package/coverage/lcov-report/utilities/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  146. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  147. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  148. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  149. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  150. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  151. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  152. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  153. package/coverage/lcov-report/utilities/security.js.html +1 -1
  154. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  155. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  156. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +8 -8
  157. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  158. package/coverage/lcov-report/utilities/users.js.html +1 -1
  159. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  160. package/coverage/lcov.info +261 -228
  161. package/dist/api/controllers/row/index.js +12 -17
  162. package/dist/api/controllers/view/exporters.js +1 -1
  163. package/dist/automations/steps/queryRows.js +0 -1
  164. package/dist/constants/index.js +4 -0
  165. package/dist/integrations/base/sql.js +27 -1
  166. package/dist/package.json +6 -5
  167. package/dist/threads/automation.js +46 -21
  168. package/dist/tsconfig.build.tsbuildinfo +1 -1
  169. package/package.json +7 -6
  170. package/src/api/controllers/row/index.ts +19 -15
  171. package/src/api/controllers/view/exporters.js +1 -1
  172. package/src/api/routes/tests/row.spec.js +87 -5
  173. package/src/automations/steps/queryRows.js +0 -1
  174. package/src/constants/index.js +5 -0
  175. package/src/integrations/base/sql.ts +28 -1
  176. package/src/threads/automation.js +49 -31
@@ -41,10 +41,10 @@ function patch(ctx) {
41
41
  const body = ctx.request.body;
42
42
  // if it doesn't have an _id then its save
43
43
  if (body && !body._id) {
44
- return save(ctx);
44
+ return (0, exports.save)(ctx);
45
45
  }
46
46
  try {
47
- const { row, table } = yield pickApi(tableId).patch(ctx);
47
+ const { row, table } = yield pro_1.quotas.addQuery(() => pickApi(tableId).patch(ctx));
48
48
  ctx.status = 200;
49
49
  ctx.eventEmitter &&
50
50
  ctx.eventEmitter.emitRow(`row:update`, appId, row, table);
@@ -57,7 +57,7 @@ function patch(ctx) {
57
57
  });
58
58
  }
59
59
  exports.patch = patch;
60
- const saveRow = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
60
+ const save = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
61
61
  const appId = ctx.appId;
62
62
  const tableId = getTableId(ctx);
63
63
  const body = ctx.request.body;
@@ -66,7 +66,7 @@ const saveRow = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
66
66
  return patch(ctx);
67
67
  }
68
68
  try {
69
- const { row, table } = yield pickApi(tableId).save(ctx);
69
+ const { row, table } = yield pro_1.quotas.addRow(() => pro_1.quotas.addQuery(() => pickApi(tableId).save(ctx)));
70
70
  ctx.status = 200;
71
71
  ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:save`, appId, row, table);
72
72
  ctx.message = `${table.name} saved successfully`;
@@ -76,17 +76,12 @@ const saveRow = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
76
76
  ctx.throw(400, err);
77
77
  }
78
78
  });
79
- function save(ctx) {
80
- return __awaiter(this, void 0, void 0, function* () {
81
- yield pro_1.quotas.addRow(() => saveRow(ctx));
82
- });
83
- }
84
79
  exports.save = save;
85
80
  function fetchView(ctx) {
86
81
  return __awaiter(this, void 0, void 0, function* () {
87
82
  const tableId = getTableId(ctx);
88
83
  try {
89
- ctx.body = yield pickApi(tableId).fetchView(ctx);
84
+ ctx.body = yield pro_1.quotas.addQuery(() => pickApi(tableId).fetchView(ctx));
90
85
  }
91
86
  catch (err) {
92
87
  ctx.throw(400, err);
@@ -98,7 +93,7 @@ function fetch(ctx) {
98
93
  return __awaiter(this, void 0, void 0, function* () {
99
94
  const tableId = getTableId(ctx);
100
95
  try {
101
- ctx.body = yield pickApi(tableId).fetch(ctx);
96
+ ctx.body = yield pro_1.quotas.addQuery(() => pickApi(tableId).fetch(ctx));
102
97
  }
103
98
  catch (err) {
104
99
  ctx.throw(400, err);
@@ -110,7 +105,7 @@ function find(ctx) {
110
105
  return __awaiter(this, void 0, void 0, function* () {
111
106
  const tableId = getTableId(ctx);
112
107
  try {
113
- ctx.body = yield pickApi(tableId).find(ctx);
108
+ ctx.body = yield pro_1.quotas.addQuery(() => pickApi(tableId).find(ctx));
114
109
  }
115
110
  catch (err) {
116
111
  ctx.throw(400, err);
@@ -125,7 +120,7 @@ function destroy(ctx) {
125
120
  const tableId = getTableId(ctx);
126
121
  let response, row;
127
122
  if (inputs.rows) {
128
- let { rows } = yield pickApi(tableId).bulkDestroy(ctx);
123
+ let { rows } = yield pro_1.quotas.addQuery(() => pickApi(tableId).bulkDestroy(ctx));
129
124
  yield pro_1.quotas.removeRows(rows.length);
130
125
  response = rows;
131
126
  for (let row of rows) {
@@ -133,7 +128,7 @@ function destroy(ctx) {
133
128
  }
134
129
  }
135
130
  else {
136
- let resp = yield pickApi(tableId).destroy(ctx);
131
+ let resp = yield pro_1.quotas.addQuery(() => pickApi(tableId).destroy(ctx));
137
132
  yield pro_1.quotas.removeRow();
138
133
  response = resp.response;
139
134
  row = resp.row;
@@ -151,7 +146,7 @@ function search(ctx) {
151
146
  const tableId = getTableId(ctx);
152
147
  try {
153
148
  ctx.status = 200;
154
- ctx.body = yield pickApi(tableId).search(ctx);
149
+ ctx.body = yield pro_1.quotas.addQuery(() => pickApi(tableId).search(ctx));
155
150
  }
156
151
  catch (err) {
157
152
  ctx.throw(400, err);
@@ -175,7 +170,7 @@ function fetchEnrichedRow(ctx) {
175
170
  return __awaiter(this, void 0, void 0, function* () {
176
171
  const tableId = getTableId(ctx);
177
172
  try {
178
- ctx.body = yield pickApi(tableId).fetchEnrichedRow(ctx);
173
+ ctx.body = yield pro_1.quotas.addQuery(() => pickApi(tableId).fetchEnrichedRow(ctx));
179
174
  }
180
175
  catch (err) {
181
176
  ctx.throw(400, err);
@@ -186,7 +181,7 @@ exports.fetchEnrichedRow = fetchEnrichedRow;
186
181
  const exportRows = (ctx) => __awaiter(void 0, void 0, void 0, function* () {
187
182
  const tableId = getTableId(ctx);
188
183
  try {
189
- ctx.body = yield pickApi(tableId).exportRows(ctx);
184
+ ctx.body = yield pro_1.quotas.addQuery(() => pickApi(tableId).exportRows(ctx));
190
185
  }
191
186
  catch (err) {
192
187
  ctx.throw(400, err);
@@ -6,7 +6,7 @@ exports.csv = function (headers, rows) {
6
6
  .map(header => {
7
7
  let val = row[header];
8
8
  val =
9
- typeof val === "object" && !(val instanceof Date)
9
+ typeof val === "object"
10
10
  ? `"${JSON.stringify(val).replace(/"/g, "'")}"`
11
11
  : `"${val}"`;
12
12
  return val.trim();
@@ -57,7 +57,6 @@ exports.definition = {
57
57
  limit: {
58
58
  type: "number",
59
59
  title: "Limit",
60
- customType: "queryLimit",
61
60
  },
62
61
  },
63
62
  required: ["tableId"],
@@ -185,5 +185,9 @@ exports.AutomationErrors = {
185
185
  MAX_ITERATIONS: "MAX_ITERATIONS_REACHED",
186
186
  FAILURE_CONDITION: "FAILURE_CONDITION_MET",
187
187
  };
188
+ exports.LoopStepTypes = {
189
+ ARRAY: "Array",
190
+ STRING: "String",
191
+ };
188
192
  // pass through the list from the auth/core lib
189
193
  exports.ObjectStoreBuckets = ObjectStoreBuckets;
@@ -24,6 +24,30 @@ const BASE_LIMIT = envLimit || 5000;
24
24
  // these are invalid dates sent by the client, need to convert them to a real max date
25
25
  const MIN_ISO_DATE = "0000-00-00T00:00:00.000Z";
26
26
  const MAX_ISO_DATE = "9999-00-00T00:00:00.000Z";
27
+ function likeKey(client, key) {
28
+ if (!key.includes(" ")) {
29
+ return key;
30
+ }
31
+ let start, end;
32
+ switch (client) {
33
+ case utils_1.SqlClients.MY_SQL:
34
+ start = end = "`";
35
+ break;
36
+ case utils_1.SqlClients.ORACLE:
37
+ case utils_1.SqlClients.POSTGRES:
38
+ start = end = '"';
39
+ break;
40
+ case utils_1.SqlClients.MS_SQL:
41
+ start = "[";
42
+ end = "]";
43
+ break;
44
+ default:
45
+ throw "Unknown client";
46
+ }
47
+ const parts = key.split(".");
48
+ key = parts.map(part => `${start}${part}${end}`).join(".");
49
+ return key;
50
+ }
27
51
  function parse(input) {
28
52
  if (Array.isArray(input)) {
29
53
  return JSON.stringify(input);
@@ -118,7 +142,9 @@ class InternalBuilder {
118
142
  else {
119
143
  const rawFnc = `${fnc}Raw`;
120
144
  // @ts-ignore
121
- query = query[rawFnc](`LOWER(${key}) LIKE ?`, [`%${value}%`]);
145
+ query = query[rawFnc](`LOWER(${likeKey(this.client, key)}) LIKE ?`, [
146
+ `%${value}%`,
147
+ ]);
122
148
  }
123
149
  });
124
150
  }
package/dist/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.0.151-alpha.1",
4
+ "version": "1.0.152",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -10,6 +10,7 @@
10
10
  },
11
11
  "scripts": {
12
12
  "build": "rimraf dist/ && tsc -p tsconfig.build.json && mv dist/src/* dist/ && rimraf dist/src/ && yarn postbuild",
13
+ "debug": "yarn build && node --expose-gc --inspect=9222 dist/index.js",
13
14
  "postbuild": "copyfiles -u 1 src/**/*.svelte dist/ && copyfiles -u 1 src/**/*.hbs dist/ && copyfiles -u 1 src/**/*.json dist/",
14
15
  "test": "jest --coverage --maxWorkers=2",
15
16
  "test:watch": "jest --watch",
@@ -68,10 +69,10 @@
68
69
  "license": "GPL-3.0",
69
70
  "dependencies": {
70
71
  "@apidevtools/swagger-parser": "^10.0.3",
71
- "@budibase/backend-core": "^1.0.151-alpha.1",
72
- "@budibase/client": "^1.0.151-alpha.1",
73
- "@budibase/pro": "1.0.151-alpha.1",
74
- "@budibase/string-templates": "^1.0.151-alpha.1",
72
+ "@budibase/backend-core": "^1.0.152",
73
+ "@budibase/client": "^1.0.152",
74
+ "@budibase/pro": "1.0.152",
75
+ "@budibase/string-templates": "^1.0.152",
75
76
  "@bull-board/api": "^3.7.0",
76
77
  "@bull-board/koa": "^3.7.0",
77
78
  "@elastic/elasticsearch": "7.10.0",
@@ -18,13 +18,46 @@ const { DocumentTypes } = require("../db/utils");
18
18
  const { doInTenant } = require("@budibase/backend-core/tenancy");
19
19
  const { definitions: triggerDefs } = require("../automations/triggerInfo");
20
20
  const { doInAppContext, getAppDB } = require("@budibase/backend-core/context");
21
- const { AutomationErrors } = require("../constants");
21
+ const { AutomationErrors, LoopStepTypes } = require("../constants");
22
22
  const FILTER_STEP_ID = actions.ACTION_DEFINITIONS.FILTER.stepId;
23
23
  const LOOP_STEP_ID = actions.ACTION_DEFINITIONS.LOOP.stepId;
24
24
  const CRON_STEP_ID = triggerDefs.CRON.stepId;
25
25
  const STOPPED_STATUS = { success: false, status: "STOPPED" };
26
26
  const { cloneDeep } = require("lodash/fp");
27
27
  const env = require("../environment");
28
+ function typecastForLooping(loopStep, input) {
29
+ if (!input || !input.binding) {
30
+ return null;
31
+ }
32
+ const isArray = Array.isArray(input.binding), isString = typeof input.binding === "string";
33
+ try {
34
+ switch (loopStep.inputs.option) {
35
+ case LoopStepTypes.ARRAY:
36
+ if (isString) {
37
+ return JSON.parse(input.binding);
38
+ }
39
+ break;
40
+ case LoopStepTypes.STRING:
41
+ if (isArray) {
42
+ return input.binding.join(",");
43
+ }
44
+ break;
45
+ }
46
+ }
47
+ catch (err) {
48
+ throw new Error("Unable to cast to correct type");
49
+ }
50
+ return input.binding;
51
+ }
52
+ function getLoopIterations(loopStep, input) {
53
+ const binding = typecastForLooping(loopStep, input);
54
+ if (!loopStep || !binding) {
55
+ return 1;
56
+ }
57
+ return Array.isArray(binding)
58
+ ? binding.length
59
+ : automationUtils.stringSplit(binding).length;
60
+ }
28
61
  /**
29
62
  * The automation orchestrator is a class responsible for executing automations.
30
63
  * It handles the context of the automation and makes sure each step gets the correct
@@ -95,7 +128,7 @@ class Orchestrator {
95
128
  this._context.steps.splice(loopStepNumber, 0, Object.assign(Object.assign({}, output), { success: result.success, status: result.status }));
96
129
  }
97
130
  execute() {
98
- var _a, _b;
131
+ var _a;
99
132
  return __awaiter(this, void 0, void 0, function* () {
100
133
  let automation = this._automation;
101
134
  const app = yield this.getApp();
@@ -106,7 +139,7 @@ class Orchestrator {
106
139
  let loopSteps = [];
107
140
  for (let step of automation.definition.steps) {
108
141
  stepCount++;
109
- let input;
142
+ let input, iterations = 1, iterationCount = 0;
110
143
  if (step.stepId === LOOP_STEP_ID) {
111
144
  loopStep = step;
112
145
  loopStepNumber = stepCount;
@@ -114,24 +147,18 @@ class Orchestrator {
114
147
  }
115
148
  if (loopStep) {
116
149
  input = yield processObject(loopStep.inputs, this._context);
150
+ iterations = getLoopIterations(loopStep, input);
117
151
  }
118
- let iterations = loopStep
119
- ? Array.isArray(input.binding)
120
- ? input.binding.length
121
- : automationUtils.stringSplit(input.binding).length
122
- : 1;
123
- let iterationCount = 0;
124
152
  for (let index = 0; index < iterations; index++) {
125
153
  let originalStepInput = cloneDeep(step.inputs);
126
154
  // Handle if the user has set a max iteration count or if it reaches the max limit set by us
127
155
  if (loopStep) {
128
156
  let newInput = yield processObject(loopStep.inputs, cloneDeep(this._context));
129
- newInput = automationUtils.cleanInputValues(newInput, loopStep.schema.inputs);
130
157
  let tempOutput = { items: loopSteps, iterations: iterationCount };
131
- if ((loopStep.inputs.option === "Array" &&
132
- !Array.isArray(newInput.binding)) ||
133
- (loopStep.inputs.option === "String" &&
134
- typeof newInput.binding !== "string")) {
158
+ try {
159
+ newInput.binding = typecastForLooping(loopStep, newInput);
160
+ }
161
+ catch (err) {
135
162
  this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
136
163
  status: AutomationErrors.INCORRECT_TYPE,
137
164
  success: false,
@@ -179,16 +206,14 @@ class Orchestrator {
179
206
  break;
180
207
  }
181
208
  let isFailure = false;
182
- if (typeof ((_a = this._context.steps[loopStepNumber]) === null || _a === void 0 ? void 0 : _a.currentItem) === "object") {
183
- isFailure = Object.keys(this._context.steps[loopStepNumber].currentItem).some(value => {
184
- return (this._context.steps[loopStepNumber].currentItem[value] ===
185
- loopStep.inputs.failure);
209
+ const currentItem = (_a = this._context.steps[loopStepNumber]) === null || _a === void 0 ? void 0 : _a.currentItem;
210
+ if (currentItem && typeof currentItem === "object") {
211
+ isFailure = Object.keys(currentItem).some(value => {
212
+ return currentItem[value] === loopStep.inputs.failure;
186
213
  });
187
214
  }
188
215
  else {
189
- isFailure =
190
- ((_b = this._context.steps[loopStepNumber]) === null || _b === void 0 ? void 0 : _b.currentItem) ===
191
- loopStep.inputs.failure;
216
+ isFailure = currentItem && currentItem === loopStep.inputs.failure;
192
217
  }
193
218
  if (isFailure) {
194
219
  this.updateContextAndOutput(loopStepNumber, step, tempOutput, {