@budibase/server 1.0.212-alpha.0 → 1.0.212-alpha.11

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 (184) hide show
  1. package/builder/assets/{index.c6912819.css → index.969c2236.css} +1 -1
  2. package/builder/assets/{index.7060ea99.js → index.a7550206.js} +160 -493
  3. package/builder/index.html +2 -2
  4. package/coverage/clover.xml +312 -267
  5. package/coverage/coverage-final.json +6 -6
  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 +166 -13
  14. package/coverage/lcov-report/api/controllers/index.html +20 -20
  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 +19 -19
  26. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +95 -11
  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 +1 -1
  39. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  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 +5 -2
  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 +57 -12
  76. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  77. package/coverage/lcov-report/automations/index.html +15 -15
  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 +1 -1
  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 +1 -1
  106. package/coverage/lcov-report/constants/index.js.html +1 -1
  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 +45 -45
  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 +2 -2
  135. package/coverage/lcov-report/threads/index.html +1 -1
  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/budibaseDir.js.html +1 -1
  139. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  140. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  141. package/coverage/lcov-report/utilities/global.js.html +1 -1
  142. package/coverage/lcov-report/utilities/index.html +15 -15
  143. package/coverage/lcov-report/utilities/index.js.html +27 -9
  144. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  145. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  146. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  147. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  148. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  149. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  150. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  151. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  152. package/coverage/lcov-report/utilities/security.js.html +1 -1
  153. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  154. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  155. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  156. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  157. package/coverage/lcov-report/utilities/users.js.html +1 -1
  158. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  159. package/coverage/lcov.info +549 -474
  160. package/dist/api/controllers/application.js +1 -1
  161. package/dist/api/controllers/dev.js +40 -2
  162. package/dist/api/controllers/row/internalSearch.js +22 -1
  163. package/dist/api/controllers/static/index.js +31 -2
  164. package/dist/api/routes/dev.js +2 -1
  165. package/dist/api/routes/static.js +1 -0
  166. package/dist/automations/automationUtils.js +16 -4
  167. package/dist/environment.js +2 -1
  168. package/dist/package.json +6 -6
  169. package/dist/threads/automation.js +1 -1
  170. package/dist/tsconfig.build.tsbuildinfo +1 -1
  171. package/dist/utilities/fileSystem/utilities.js +2 -1
  172. package/dist/utilities/index.js +5 -1
  173. package/package.json +7 -7
  174. package/src/api/controllers/application.ts +5 -1
  175. package/src/api/controllers/dev.js +53 -2
  176. package/src/api/controllers/row/internalSearch.js +28 -0
  177. package/src/api/controllers/static/index.js +41 -2
  178. package/src/api/routes/dev.js +1 -0
  179. package/src/api/routes/static.ts +1 -0
  180. package/src/automations/automationUtils.js +19 -4
  181. package/src/environment.js +3 -1
  182. package/src/threads/automation.js +1 -1
  183. package/src/utilities/fileSystem/utilities.js +2 -0
  184. package/src/utilities/index.js +7 -1
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
- const { ObjectStore, makeSureBucketExists, upload, deleteFiles, streamUpload, retrieve, retrieveToTmp, deleteFolder, uploadDirectory, downloadTarball, } = require("@budibase/backend-core/objectStore");
2
+ const { ObjectStore, makeSureBucketExists, upload, deleteFiles, streamUpload, retrieve, retrieveToTmp, deleteFolder, uploadDirectory, downloadTarball, downloadTarballDirect, } = require("@budibase/backend-core/objectStore");
3
3
  /***********************************
4
4
  * NOTE *
5
5
  * This file purely exists so that *
@@ -17,4 +17,5 @@ exports.retrieveToTmp = retrieveToTmp;
17
17
  exports.deleteFolder = deleteFolder;
18
18
  exports.uploadDirectory = uploadDirectory;
19
19
  exports.downloadTarball = downloadTarball;
20
+ exports.downloadTarballDirect = downloadTarballDirect;
20
21
  exports.deleteFiles = deleteFiles;
@@ -57,8 +57,12 @@ exports.objectStoreUrl = () => {
57
57
  * @return {string} The URL to be inserted into appPackage response or server rendered
58
58
  * app index file.
59
59
  */
60
- exports.clientLibraryPath = (appId, version) => {
60
+ exports.clientLibraryPath = (appId, version, ctx) => {
61
61
  if (env.isProd()) {
62
+ // TODO: remove - for beta testing UI
63
+ if (ctx && ctx.cookies.get("beta:design_ui")) {
64
+ return "https://cdn.budi.live/beta:design_ui/budibase-client.js";
65
+ }
62
66
  let url = `${exports.objectStoreUrl()}/${sanitizeKey(appId)}/budibase-client.js`;
63
67
  // append app version to bust the cache
64
68
  if (version) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.0.212-alpha.0",
4
+ "version": "1.0.212-alpha.11",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -77,11 +77,11 @@
77
77
  "license": "GPL-3.0",
78
78
  "dependencies": {
79
79
  "@apidevtools/swagger-parser": "10.0.3",
80
- "@budibase/backend-core": "^1.0.212-alpha.0",
81
- "@budibase/client": "^1.0.212-alpha.0",
82
- "@budibase/pro": "1.0.211",
83
- "@budibase/string-templates": "^1.0.212-alpha.0",
84
- "@budibase/types": "^1.0.212-alpha.0",
80
+ "@budibase/backend-core": "^1.0.212-alpha.11",
81
+ "@budibase/client": "^1.0.212-alpha.11",
82
+ "@budibase/pro": "1.0.212-alpha.10",
83
+ "@budibase/string-templates": "^1.0.212-alpha.11",
84
+ "@budibase/types": "^1.0.212-alpha.11",
85
85
  "@bull-board/api": "3.7.0",
86
86
  "@bull-board/koa": "3.9.4",
87
87
  "@elastic/elasticsearch": "7.10.0",
@@ -195,5 +195,5 @@
195
195
  "optionalDependencies": {
196
196
  "oracledb": "5.3.0"
197
197
  },
198
- "gitHead": "07672b99c891147120ebcb7343894ac941c9332f"
198
+ "gitHead": "d123d0b4fd3a7b449f759f8841645987c4acc013"
199
199
  }
@@ -227,7 +227,11 @@ export const fetchAppPackage = async (ctx: any) => {
227
227
  application,
228
228
  screens,
229
229
  layouts,
230
- clientLibPath: clientLibraryPath(ctx.params.appId, application.version),
230
+ clientLibPath: clientLibraryPath(
231
+ ctx.params.appId,
232
+ application.version,
233
+ ctx
234
+ ),
231
235
  }
232
236
  }
233
237
 
@@ -3,8 +3,12 @@ const env = require("../../environment")
3
3
  const { checkSlashesInUrl } = require("../../utilities")
4
4
  const { request } = require("../../utilities/workerRequests")
5
5
  const { clearLock } = require("../../utilities/redis")
6
- const { Replication, getProdAppID } = require("@budibase/backend-core/db")
7
- const { DocumentTypes } = require("../../db/utils")
6
+ const {
7
+ Replication,
8
+ getProdAppID,
9
+ dangerousGetDB,
10
+ } = require("@budibase/backend-core/db")
11
+ const { DocumentTypes, getRowParams } = require("../../db/utils")
8
12
  const { app: appCache } = require("@budibase/backend-core/cache")
9
13
  const { getProdAppDB, getAppDB } = require("@budibase/backend-core/context")
10
14
  const { events } = require("@budibase/backend-core")
@@ -133,3 +137,50 @@ exports.getBudibaseVersion = async ctx => {
133
137
  }
134
138
  await events.installation.versionChecked(version)
135
139
  }
140
+
141
+ // TODO: remove as part of beta program
142
+ exports.checkBetaAccess = async ctx => {
143
+ // go to the cloud platform if running self hosted
144
+ if (env.SELF_HOSTED || !env.MULTI_TENANCY) {
145
+ let baseUrl = ""
146
+ if (env.ACCOUNT_PORTAL_URL) {
147
+ baseUrl = env.ACCOUNT_PORTAL_URL.replace("account.", "")
148
+ } else {
149
+ baseUrl = "https://budibase.app"
150
+ }
151
+
152
+ const response = await fetch(
153
+ `${baseUrl}/api/beta/access?email=${ctx.query.email}`
154
+ )
155
+ const json = await response.json()
156
+ ctx.body = json
157
+ return
158
+ }
159
+
160
+ const userToCheck = ctx.query.email
161
+ const BETA_USERS_DB = "app_bb_f9b77d06b9db4e3ca185476ab87a2364"
162
+ const BETA_USERS_TABLE = "ta_8c2c6df1c03f49cfb6340e85e066dd15"
163
+
164
+ try {
165
+ const db = dangerousGetDB(BETA_USERS_DB)
166
+ const betaUsers = (
167
+ await db.allDocs(
168
+ getRowParams(BETA_USERS_TABLE, null, {
169
+ include_docs: true,
170
+ })
171
+ )
172
+ ).rows.map(row => row.doc)
173
+
174
+ let access = false
175
+ for (let betaUser of betaUsers) {
176
+ if (betaUser["Email address"].trim() === userToCheck) {
177
+ access = true
178
+ break
179
+ }
180
+ }
181
+ ctx.body = { access }
182
+ } catch (err) {
183
+ console.error(err)
184
+ ctx.body = { access: false }
185
+ }
186
+ }
@@ -17,6 +17,7 @@ class QueryBuilder {
17
17
  notEqual: {},
18
18
  empty: {},
19
19
  notEmpty: {},
20
+ oneOf: {},
20
21
  ...base,
21
22
  }
22
23
  this.limit = 50
@@ -112,6 +113,11 @@ class QueryBuilder {
112
113
  return this
113
114
  }
114
115
 
116
+ addOneOf(key, value) {
117
+ this.query.oneOf[key] = value
118
+ return this
119
+ }
120
+
115
121
  /**
116
122
  * Preprocesses a value before going into a lucene search.
117
123
  * Transforms strings to lowercase and wraps strings and bools in quotes.
@@ -220,6 +226,28 @@ class QueryBuilder {
220
226
  if (this.query.notEmpty) {
221
227
  build(this.query.notEmpty, key => `${key}:["" TO *]`)
222
228
  }
229
+ if (this.query.oneOf) {
230
+ build(this.query.oneOf, (key, value) => {
231
+ if (!Array.isArray(value)) {
232
+ if (typeof value === "string") {
233
+ value = value.split(",")
234
+ } else {
235
+ return ""
236
+ }
237
+ }
238
+ let orStatement = `${builder.preprocess(
239
+ value[0],
240
+ allPreProcessingOpts
241
+ )}`
242
+ for (let i = 1; i < value.length; i++) {
243
+ orStatement += ` OR ${builder.preprocess(
244
+ value[i],
245
+ allPreProcessingOpts
246
+ )}`
247
+ }
248
+ return `${key}:(${orStatement})`
249
+ })
250
+ }
223
251
  return query
224
252
  }
225
253
 
@@ -16,9 +16,15 @@ const { upload } = require("../../../utilities/fileSystem")
16
16
  const { attachmentsRelativeURL } = require("../../../utilities")
17
17
  const { DocumentTypes, isDevAppID } = require("../../../db/utils")
18
18
  const { getAppDB, getAppId } = require("@budibase/backend-core/context")
19
+ const { setCookie, clearCookie } = require("@budibase/backend-core/utils")
19
20
  const AWS = require("aws-sdk")
20
21
  const { events } = require("@budibase/backend-core")
21
22
 
23
+ const fs = require("fs")
24
+ const {
25
+ downloadTarballDirect,
26
+ } = require("../../../utilities/fileSystem/utilities")
27
+
22
28
  async function prepareUpload({ s3Key, bucket, metadata, file }) {
23
29
  const response = await upload({
24
30
  bucket,
@@ -38,8 +44,41 @@ async function prepareUpload({ s3Key, bucket, metadata, file }) {
38
44
  }
39
45
  }
40
46
 
47
+ exports.toggleBetaUiFeature = async function (ctx) {
48
+ const cookieName = `beta:${ctx.params.feature}`
49
+
50
+ if (ctx.cookies.get(cookieName)) {
51
+ clearCookie(ctx, cookieName)
52
+ ctx.body = {
53
+ message: `${ctx.params.feature} disabled`,
54
+ }
55
+ return
56
+ }
57
+
58
+ let builderPath = resolve(TOP_LEVEL_PATH, "new_design_ui")
59
+
60
+ // // download it from S3
61
+ if (!fs.existsSync(builderPath)) {
62
+ fs.mkdirSync(builderPath)
63
+ }
64
+ await downloadTarballDirect(
65
+ "https://cdn.budi.live/beta:design_ui/new_ui.tar.gz",
66
+ builderPath
67
+ )
68
+ setCookie(ctx, {}, cookieName)
69
+
70
+ ctx.body = {
71
+ message: `${ctx.params.feature} enabled`,
72
+ }
73
+ }
74
+
41
75
  exports.serveBuilder = async function (ctx) {
42
- let builderPath = resolve(TOP_LEVEL_PATH, "builder")
76
+ // Temporary: New Design UI
77
+ const designUiCookie = ctx.cookies.get("beta:design_ui")
78
+ // TODO: get this from the tmp Dir that we downloaded from MinIO
79
+ const uiPath = designUiCookie ? "new_design_ui" : "builder"
80
+
81
+ let builderPath = resolve(TOP_LEVEL_PATH, uiPath)
43
82
  await send(ctx, ctx.file, { root: builderPath })
44
83
  if (!ctx.file.includes("assets/")) {
45
84
  await events.serve.servedBuilder()
@@ -78,7 +117,7 @@ exports.serveApp = async function (ctx) {
78
117
  title: appInfo.name,
79
118
  production: env.isProd(),
80
119
  appId,
81
- clientLibPath: clientLibraryPath(appId, appInfo.version),
120
+ clientLibPath: clientLibraryPath(appId, appInfo.version, ctx),
82
121
  })
83
122
 
84
123
  const appHbs = loadHandlebarsFile(`${__dirname}/templates/app.hbs`)
@@ -22,5 +22,6 @@ router
22
22
  .get("/api/dev/version", authorized(BUILDER), controller.getBudibaseVersion)
23
23
  .delete("/api/dev/:appId/lock", authorized(BUILDER), controller.clearLock)
24
24
  .post("/api/dev/:appId/revert", authorized(BUILDER), controller.revert)
25
+ .get("/api/beta/access", controller.checkBetaAccess)
25
26
 
26
27
  module.exports = router
@@ -38,6 +38,7 @@ router
38
38
  // TODO: for now this builder endpoint is not authorized/secured, will need to be
39
39
  .get("/builder/:file*", controller.serveBuilder)
40
40
  .post("/api/attachments/process", authorized(BUILDER), controller.uploadFile)
41
+ .post("/api/beta/:feature", controller.toggleBetaUiFeature)
41
42
  .post(
42
43
  "/api/attachments/:tableId/upload",
43
44
  paramResource("tableId"),
@@ -1,5 +1,10 @@
1
1
  const { getTable } = require("../api/controllers/table/utils")
2
- const { findHBSBlocks } = require("@budibase/string-templates")
2
+ const {
3
+ findHBSBlocks,
4
+ decodeJSBinding,
5
+ isJSBinding,
6
+ encodeJSBinding,
7
+ } = require("@budibase/string-templates")
3
8
 
4
9
  /**
5
10
  * When values are input to the system generally they will be of type string as this is required for template strings.
@@ -77,11 +82,21 @@ exports.getError = err => {
77
82
  }
78
83
 
79
84
  exports.substituteLoopStep = (hbsString, substitute) => {
80
- let blocks = findHBSBlocks(hbsString)
85
+ let blocks = []
86
+ let checkForJS = isJSBinding(hbsString)
87
+ if (checkForJS) {
88
+ hbsString = decodeJSBinding(hbsString)
89
+ blocks.push(hbsString)
90
+ } else {
91
+ blocks = findHBSBlocks(hbsString)
92
+ }
81
93
  for (let block of blocks) {
82
- let oldBlock = block
83
94
  block = block.replace(/loop/, substitute)
84
- hbsString = hbsString.replace(new RegExp(oldBlock, "g"), block)
95
+ if (checkForJS) {
96
+ hbsString = encodeJSBinding(block)
97
+ } else {
98
+ hbsString = block
99
+ }
85
100
  }
86
101
 
87
102
  return hbsString
@@ -67,7 +67,9 @@ module.exports = {
67
67
  SALT_ROUNDS: process.env.SALT_ROUNDS,
68
68
  LOGGER: process.env.LOGGER,
69
69
  LOG_LEVEL: process.env.LOG_LEVEL,
70
- AUTOMATION_MAX_ITERATIONS: process.env.AUTOMATION_MAX_ITERATIONS,
70
+ ACCOUNT_PORTAL_URL: process.env.ACCOUNT_PORTAL_URL,
71
+ AUTOMATION_MAX_ITERATIONS:
72
+ parseIntSafe(process.env.AUTOMATION_MAX_ITERATIONS) || 200,
71
73
  SENDGRID_API_KEY: process.env.SENDGRID_API_KEY,
72
74
  DYNAMO_ENDPOINT: process.env.DYNAMO_ENDPOINT,
73
75
  QUERY_THREAD_TIMEOUT: parseIntSafe(process.env.QUERY_THREAD_TIMEOUT),
@@ -218,7 +218,7 @@ class Orchestrator {
218
218
  }
219
219
  }
220
220
  if (
221
- index === parseInt(env.AUTOMATION_MAX_ITERATIONS) ||
221
+ index === env.AUTOMATION_MAX_ITERATION ||
222
222
  index === parseInt(loopStep.inputs.iterations)
223
223
  ) {
224
224
  this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
@@ -9,6 +9,7 @@ const {
9
9
  deleteFolder,
10
10
  uploadDirectory,
11
11
  downloadTarball,
12
+ downloadTarballDirect,
12
13
  } = require("@budibase/backend-core/objectStore")
13
14
 
14
15
  /***********************************
@@ -29,4 +30,5 @@ exports.retrieveToTmp = retrieveToTmp
29
30
  exports.deleteFolder = deleteFolder
30
31
  exports.uploadDirectory = uploadDirectory
31
32
  exports.downloadTarball = downloadTarball
33
+ exports.downloadTarballDirect = downloadTarballDirect
32
34
  exports.deleteFiles = deleteFiles
@@ -54,11 +54,17 @@ exports.objectStoreUrl = () => {
54
54
  * @return {string} The URL to be inserted into appPackage response or server rendered
55
55
  * app index file.
56
56
  */
57
- exports.clientLibraryPath = (appId, version) => {
57
+ exports.clientLibraryPath = (appId, version, ctx) => {
58
58
  if (env.isProd()) {
59
+ // TODO: remove - for beta testing UI
60
+ if (ctx && ctx.cookies.get("beta:design_ui")) {
61
+ return "https://cdn.budi.live/beta:design_ui/budibase-client.js"
62
+ }
63
+
59
64
  let url = `${exports.objectStoreUrl()}/${sanitizeKey(
60
65
  appId
61
66
  )}/budibase-client.js`
67
+
62
68
  // append app version to bust the cache
63
69
  if (version) {
64
70
  url += `?v=${version}`