@budibase/server 1.0.212-alpha.9 → 1.0.214

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 (224) hide show
  1. package/builder/assets/index.24307ca0.css +6 -0
  2. package/builder/assets/index.5afb2e7e.js +1316 -0
  3. package/builder/index.html +2 -2
  4. package/coverage/clover.xml +287 -315
  5. package/coverage/coverage-final.json +8 -8
  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 +6 -9
  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 +7 -7
  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 +17 -47
  25. package/coverage/lcov-report/api/controllers/row/index.html +34 -34
  26. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +11 -95
  28. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/row/utils.js.html +8 -17
  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 +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 +12 -57
  76. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  77. package/coverage/lcov-report/automations/index.html +17 -17
  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 +4 -4
  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 +10 -10
  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 +6 -9
  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 +38 -38
  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 +1 -1
  143. package/coverage/lcov-report/utilities/index.js.html +1 -1
  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 +540 -590
  160. package/dist/api/controllers/backup.js +2 -3
  161. package/dist/api/controllers/row/external.js +7 -19
  162. package/dist/api/controllers/row/internalSearch.js +1 -22
  163. package/dist/api/controllers/row/utils.js +0 -3
  164. package/dist/automations/automationUtils.js +4 -16
  165. package/dist/automations/triggers.js +1 -1
  166. package/dist/db/utils.js +0 -1
  167. package/dist/definitions/datasource.js +0 -1
  168. package/dist/integrations/airtable.js +0 -1
  169. package/dist/integrations/arangodb.js +0 -1
  170. package/dist/integrations/base/sql.js +3 -20
  171. package/dist/integrations/couchdb.js +0 -1
  172. package/dist/integrations/dynamodb.js +0 -1
  173. package/dist/integrations/elasticsearch.js +0 -1
  174. package/dist/integrations/firebase.js +0 -1
  175. package/dist/integrations/googlesheets.js +0 -1
  176. package/dist/integrations/index.js +0 -4
  177. package/dist/integrations/microsoftSqlServer.js +1 -2
  178. package/dist/integrations/mongodb.js +0 -1
  179. package/dist/integrations/mysql.js +1 -2
  180. package/dist/integrations/oracle.js +0 -1
  181. package/dist/integrations/postgres.js +1 -2
  182. package/dist/integrations/redis.js +0 -1
  183. package/dist/integrations/rest.js +0 -1
  184. package/dist/integrations/s3.js +0 -1
  185. package/dist/package.json +6 -7
  186. package/dist/threads/automation.js +1 -1
  187. package/dist/tsconfig.build.tsbuildinfo +1 -1
  188. package/dist/utilities/fileSystem/index.js +6 -16
  189. package/package.json +7 -8
  190. package/src/api/controllers/backup.js +2 -3
  191. package/src/api/controllers/row/external.js +9 -19
  192. package/src/api/controllers/row/internalSearch.js +0 -28
  193. package/src/api/controllers/row/utils.js +0 -3
  194. package/src/automations/automationUtils.js +4 -19
  195. package/src/automations/triggers.js +1 -1
  196. package/src/db/utils.js +0 -1
  197. package/src/definitions/common.ts +0 -1
  198. package/src/definitions/datasource.ts +0 -2
  199. package/src/integrations/airtable.ts +0 -1
  200. package/src/integrations/arangodb.ts +0 -1
  201. package/src/integrations/base/sql.ts +11 -25
  202. package/src/integrations/couchdb.ts +0 -1
  203. package/src/integrations/dynamodb.ts +0 -1
  204. package/src/integrations/elasticsearch.ts +0 -1
  205. package/src/integrations/firebase.ts +0 -1
  206. package/src/integrations/googlesheets.ts +0 -1
  207. package/src/integrations/index.ts +0 -4
  208. package/src/integrations/microsoftSqlServer.ts +0 -2
  209. package/src/integrations/mongodb.ts +0 -1
  210. package/src/integrations/mysql.ts +0 -2
  211. package/src/integrations/oracle.ts +0 -1
  212. package/src/integrations/postgres.ts +0 -2
  213. package/src/integrations/redis.ts +0 -1
  214. package/src/integrations/rest.ts +0 -1
  215. package/src/integrations/s3.ts +0 -1
  216. package/src/threads/automation.js +1 -1
  217. package/src/utilities/fileSystem/index.js +8 -22
  218. package/builder/assets/index.a5ae8cfa.js +0 -1312
  219. package/builder/assets/index.c6912819.css +0 -6
  220. package/dist/integrations/snowflake.js +0 -102
  221. package/scripts/integrations/oracle/instantclient/linux/arm64/basiclite-19.10.zip +0 -0
  222. package/scripts/integrations/oracle/instantclient/linux/arm64/install.sh +0 -23
  223. package/scripts/integrations/oracle/instantclient/linux/install.sh +0 -10
  224. package/src/integrations/snowflake.ts +0 -99
@@ -17,7 +17,7 @@ const { ObjectStoreBuckets } = require("../../constants");
17
17
  const { upload, retrieve, retrieveToTmp, streamUpload, deleteFolder, downloadTarball, } = require("./utilities");
18
18
  const { updateClientLibrary } = require("./clientLibrary");
19
19
  const env = require("../../environment");
20
- const { USER_METDATA_PREFIX, LINK_USER_METADATA_PREFIX, TABLE_ROW_PREFIX, } = require("../../db/utils");
20
+ const { USER_METDATA_PREFIX, LINK_USER_METADATA_PREFIX, } = require("../../db/utils");
21
21
  const MemoryStream = require("memorystream");
22
22
  const { getAppId } = require("@budibase/backend-core/context");
23
23
  const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..");
@@ -98,17 +98,6 @@ exports.apiFileReturn = contents => {
98
98
  fs.writeFileSync(path, contents);
99
99
  return fs.createReadStream(path);
100
100
  };
101
- exports.defineFilter = excludeRows => {
102
- if (excludeRows) {
103
- return doc => !(doc._id.includes(USER_METDATA_PREFIX) ||
104
- doc._id.includes(LINK_USER_METADATA_PREFIX) ||
105
- doc._id.includes(TABLE_ROW_PREFIX));
106
- }
107
- else if (!excludeRows) {
108
- return doc => !(doc._id.includes(USER_METDATA_PREFIX) ||
109
- doc._id.includes(LINK_USER_METADATA_PREFIX));
110
- }
111
- };
112
101
  /**
113
102
  * Local utility to back up the database state for an app, excluding global user
114
103
  * data or user relationships.
@@ -116,8 +105,9 @@ exports.defineFilter = excludeRows => {
116
105
  * @param {object} config Config to send to export DB
117
106
  * @returns {*} either a string or a stream of the backup
118
107
  */
119
- const backupAppData = (appId, config, includeRows) => __awaiter(void 0, void 0, void 0, function* () {
120
- return yield exports.exportDB(appId, Object.assign(Object.assign({}, config), { filter: exports.defineFilter(includeRows) }));
108
+ const backupAppData = (appId, config) => __awaiter(void 0, void 0, void 0, function* () {
109
+ return yield exports.exportDB(appId, Object.assign(Object.assign({}, config), { filter: doc => !(doc._id.includes(USER_METDATA_PREFIX) ||
110
+ doc._id.includes(LINK_USER_METADATA_PREFIX)) }));
121
111
  });
122
112
  /**
123
113
  * Takes a copy of the database state for an app to the object store.
@@ -133,8 +123,8 @@ exports.performBackup = (appId, backupName) => __awaiter(void 0, void 0, void 0,
133
123
  * @param {string} appId The ID of the app which is to be backed up.
134
124
  * @returns {*} a readable stream of the backup which is written in real time
135
125
  */
136
- exports.streamBackup = (appId, includeRows) => __awaiter(void 0, void 0, void 0, function* () {
137
- return yield backupAppData(appId, { stream: true }, includeRows);
126
+ exports.streamBackup = (appId) => __awaiter(void 0, void 0, void 0, function* () {
127
+ return yield backupAppData(appId, { stream: true });
138
128
  });
139
129
  /**
140
130
  * Exports a DB to either file or a variable (memory).
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.9",
4
+ "version": "1.0.214",
5
5
  "description": "Budibase Web Server",
6
6
  "main": "src/index.ts",
7
7
  "repository": {
@@ -77,11 +77,10 @@
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.9",
81
- "@budibase/client": "^1.0.212-alpha.9",
82
- "@budibase/pro": "1.0.212-alpha.8",
83
- "@budibase/string-templates": "^1.0.212-alpha.9",
84
- "@budibase/types": "^1.0.212-alpha.9",
80
+ "@budibase/backend-core": "^1.0.214",
81
+ "@budibase/client": "^1.0.214",
82
+ "@budibase/pro": "1.0.213",
83
+ "@budibase/string-templates": "^1.0.214",
85
84
  "@bull-board/api": "3.7.0",
86
85
  "@bull-board/koa": "3.9.4",
87
86
  "@elastic/elasticsearch": "7.10.0",
@@ -136,7 +135,6 @@
136
135
  "pouchdb-replication-stream": "1.2.9",
137
136
  "redis": "4",
138
137
  "server-destroy": "1.0.1",
139
- "snowflake-promise": "^4.5.0",
140
138
  "svelte": "3.44.1",
141
139
  "swagger-parser": "10.0.3",
142
140
  "to-json-schema": "0.2.5",
@@ -152,6 +150,7 @@
152
150
  "@babel/core": "7.17.4",
153
151
  "@babel/preset-env": "7.16.11",
154
152
  "@budibase/standard-components": "^0.9.139",
153
+ "@budibase/types": "^1.0.214",
155
154
  "@jest/test-sequencer": "24.9.0",
156
155
  "@types/apidoc": "0.50.0",
157
156
  "@types/bson": "4.2.0",
@@ -195,5 +194,5 @@
195
194
  "optionalDependencies": {
196
195
  "oracledb": "5.3.0"
197
196
  },
198
- "gitHead": "84013b1a5966f50f0915b96ec75568d73ad0af77"
197
+ "gitHead": "9c7248b4982f8f898d6ac1ced4b8b9bd2f690627"
199
198
  }
@@ -3,12 +3,11 @@ const { events, context } = require("@budibase/backend-core")
3
3
  const { DocumentTypes } = require("../../db/utils")
4
4
 
5
5
  exports.exportAppDump = async function (ctx) {
6
- let { appId, excludeRows } = ctx.query
6
+ const { appId } = ctx.query
7
7
  const appName = decodeURI(ctx.query.appname)
8
- excludeRows = excludeRows === "true"
9
8
  const backupIdentifier = `${appName}-export-${new Date().getTime()}.txt`
10
9
  ctx.attachment(backupIdentifier)
11
- ctx.body = await streamBackup(appId, excludeRows)
10
+ ctx.body = await streamBackup(appId)
12
11
 
13
12
  await context.doInAppContext(appId, async () => {
14
13
  const appDb = context.getAppDB()
@@ -155,44 +155,34 @@ exports.validate = async () => {
155
155
  }
156
156
 
157
157
  exports.exportRows = async ctx => {
158
- const { datasourceId } = breakExternalTableId(ctx.params.tableId)
158
+ const { datasourceId, tableName } = breakExternalTableId(ctx.params.tableId)
159
159
  const db = getAppDB()
160
- const format = ctx.query.format
161
- const { columns } = ctx.request.body
160
+ let format = ctx.query.format
162
161
  const datasource = await db.get(datasourceId)
163
162
  if (!datasource || !datasource.entities) {
164
163
  ctx.throw(400, "Datasource has not been configured for plus API.")
165
164
  }
165
+ const tables = datasource.entities
166
+ const table = tables[tableName]
166
167
  ctx.request.body = {
167
168
  query: {
168
169
  oneOf: {
169
- _id: ctx.request.body.rows.map(row => JSON.parse(decodeURI(row))[0]),
170
+ [table.primaryDisplay]: ctx.request.body.rows.map(
171
+ id => breakRowIdField(id)[0]
172
+ ),
170
173
  },
171
174
  },
172
175
  }
173
176
 
174
177
  let result = await exports.search(ctx)
175
- let rows = []
176
-
177
- // Filter data to only specified columns if required
178
- if (columns && columns.length) {
179
- for (let i = 0; i < result.rows.length; i++) {
180
- rows[i] = {}
181
- for (let column of columns) {
182
- rows[i][column] = result.rows[i][column]
183
- }
184
- }
185
- } else {
186
- rows = result.rows
187
- }
188
178
 
189
- let headers = Object.keys(rows[0])
179
+ let headers = Object.keys(result.rows[0])
190
180
  const exporter = exporters[format]
191
181
  const filename = `export.${format}`
192
182
 
193
183
  // send down the file
194
184
  ctx.attachment(filename)
195
- return apiFileReturn(exporter(headers, rows))
185
+ return apiFileReturn(exporter(headers, result.rows))
196
186
  }
197
187
 
198
188
  exports.fetchEnrichedRow = async ctx => {
@@ -17,7 +17,6 @@ class QueryBuilder {
17
17
  notEqual: {},
18
18
  empty: {},
19
19
  notEmpty: {},
20
- oneOf: {},
21
20
  ...base,
22
21
  }
23
22
  this.limit = 50
@@ -113,11 +112,6 @@ class QueryBuilder {
113
112
  return this
114
113
  }
115
114
 
116
- addOneOf(key, value) {
117
- this.query.oneOf[key] = value
118
- return this
119
- }
120
-
121
115
  /**
122
116
  * Preprocesses a value before going into a lucene search.
123
117
  * Transforms strings to lowercase and wraps strings and bools in quotes.
@@ -226,28 +220,6 @@ class QueryBuilder {
226
220
  if (this.query.notEmpty) {
227
221
  build(this.query.notEmpty, key => `${key}:["" TO *]`)
228
222
  }
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
- }
251
223
  return query
252
224
  }
253
225
 
@@ -64,9 +64,6 @@ exports.validate = async ({ tableId, row, table }) => {
64
64
  // Validate.js doesn't seem to handle array
65
65
  if (type === FieldTypes.ARRAY && row[fieldName]) {
66
66
  if (row[fieldName].length) {
67
- if (!Array.isArray(row[fieldName])) {
68
- row[fieldName] = row[fieldName].split(",")
69
- }
70
67
  row[fieldName].map(val => {
71
68
  if (
72
69
  !constraints.inclusion.includes(val) &&
@@ -1,10 +1,5 @@
1
1
  const { getTable } = require("../api/controllers/table/utils")
2
- const {
3
- findHBSBlocks,
4
- decodeJSBinding,
5
- isJSBinding,
6
- encodeJSBinding,
7
- } = require("@budibase/string-templates")
2
+ const { findHBSBlocks } = require("@budibase/string-templates")
8
3
 
9
4
  /**
10
5
  * When values are input to the system generally they will be of type string as this is required for template strings.
@@ -82,21 +77,11 @@ exports.getError = err => {
82
77
  }
83
78
 
84
79
  exports.substituteLoopStep = (hbsString, substitute) => {
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
- }
80
+ let blocks = findHBSBlocks(hbsString)
93
81
  for (let block of blocks) {
82
+ let oldBlock = block
94
83
  block = block.replace(/loop/, substitute)
95
- if (checkForJS) {
96
- hbsString = encodeJSBinding(block)
97
- } else {
98
- hbsString = block
99
- }
84
+ hbsString = hbsString.replace(new RegExp(oldBlock, "g"), block)
100
85
  }
101
86
 
102
87
  return hbsString
@@ -97,7 +97,7 @@ exports.externalTrigger = async function (
97
97
  // values are likely to be submitted as strings, so we shall convert to correct type
98
98
  const coercedFields = {}
99
99
  const fields = automation.definition.trigger.inputs.fields
100
- for (let key of Object.keys(fields || {})) {
100
+ for (let key of Object.keys(fields)) {
101
101
  coercedFields[key] = coerce(params.fields[key], fields[key])
102
102
  }
103
103
  params.fields = coercedFields
package/src/db/utils.js CHANGED
@@ -74,7 +74,6 @@ exports.isDevAppID = isDevAppID
74
74
  exports.isProdAppID = isProdAppID
75
75
  exports.USER_METDATA_PREFIX = `${DocumentTypes.ROW}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
76
76
  exports.LINK_USER_METADATA_PREFIX = `${DocumentTypes.LINK}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
77
- exports.TABLE_ROW_PREFIX = `${DocumentTypes.ROW}${SEPARATOR}${DocumentTypes.TABLE}`
78
77
  exports.ViewNames = ViewNames
79
78
  exports.InternalTables = InternalTables
80
79
  exports.DocumentTypes = DocumentTypes
@@ -12,7 +12,6 @@ export interface Application extends Base {
12
12
  export interface FieldSchema {
13
13
  // TODO: replace with field types enum when done
14
14
  type: string
15
- externalType?: string
16
15
  fieldName?: string
17
16
  name: string
18
17
  tableId?: string
@@ -50,7 +50,6 @@ export enum SourceNames {
50
50
  GOOGLE_SHEETS = "GOOGLE_SHEETS",
51
51
  FIRESTORE = "FIRESTORE",
52
52
  REDIS = "REDIS",
53
- SNOWFLAKE = "SNOWFLAKE",
54
53
  }
55
54
 
56
55
  export enum IncludeRelationships {
@@ -94,7 +93,6 @@ export interface Integration {
94
93
  relationships?: boolean
95
94
  description: string
96
95
  friendlyName: string
97
- type?: string
98
96
  datasource: {}
99
97
  query: {
100
98
  [key: string]: QueryDefinition
@@ -18,7 +18,6 @@ module AirtableModule {
18
18
  description:
19
19
  "Airtable is a spreadsheet-database hybrid, with the features of a database but applied to a spreadsheet.",
20
20
  friendlyName: "Airtable",
21
- type: "Spreadsheet",
22
21
  datasource: {
23
22
  apiKey: {
24
23
  type: DatasourceFieldTypes.PASSWORD,
@@ -19,7 +19,6 @@ module ArangoModule {
19
19
  const SCHEMA: Integration = {
20
20
  docs: "https://github.com/arangodb/arangojs",
21
21
  friendlyName: "ArangoDB",
22
- type: "Non-relational",
23
22
  description:
24
23
  "ArangoDB is a scalable open-source multi-model database natively supporting graph, document and search. All supported data models & access patterns can be combined in queries allowing for maximal flexibility. ",
25
24
  datasource: {
@@ -89,28 +89,6 @@ function parseFilters(filters: SearchFilters | undefined): SearchFilters {
89
89
  return filters
90
90
  }
91
91
 
92
- function generateSelectStatement(
93
- json: QueryJson,
94
- knex: Knex
95
- ): (string | Knex.Raw)[] {
96
- const { resource, meta } = json
97
- const schema = meta?.table?.schema
98
- return resource.fields.map(field => {
99
- const fieldNames = field.split(/\./g)
100
- const tableName = fieldNames[0]
101
- const columnName = fieldNames[1]
102
- if (columnName && knex.client.config.client === SqlClients.POSTGRES) {
103
- const externalType = schema?.[columnName].externalType
104
- if (externalType?.includes("money")) {
105
- return knex.raw(
106
- `"${tableName}"."${columnName}"::money::numeric as "${field}"`
107
- )
108
- }
109
- }
110
- return `${field} as ${field}`
111
- })
112
- }
113
-
114
92
  class InternalBuilder {
115
93
  private readonly client: string
116
94
 
@@ -238,7 +216,9 @@ class InternalBuilder {
238
216
  }
239
217
 
240
218
  addRelationships(
219
+ knex: Knex,
241
220
  query: KnexQuery,
221
+ fields: string | string[],
242
222
  fromTable: string,
243
223
  relationships: RelationshipsJson[] | undefined
244
224
  ): KnexQuery {
@@ -343,12 +323,12 @@ class InternalBuilder {
343
323
  if (!resource) {
344
324
  resource = { fields: [] }
345
325
  }
346
- let selectStatement: string | (string | Knex.Raw)[] = "*"
326
+ let selectStatement: string | string[] = "*"
347
327
  // handle select
348
328
  if (resource.fields && resource.fields.length > 0) {
349
329
  // select the resources as the format "table.columnName" - this is what is provided
350
330
  // by the resource builder further up
351
- selectStatement = generateSelectStatement(json, knex)
331
+ selectStatement = resource.fields.map(field => `${field} as ${field}`)
352
332
  }
353
333
  let foundLimit = limit || BASE_LIMIT
354
334
  // handle pagination
@@ -383,7 +363,13 @@ class InternalBuilder {
383
363
  preQuery = this.addSorting(preQuery, json)
384
364
  }
385
365
  // handle joins
386
- query = this.addRelationships(preQuery, tableName, relationships)
366
+ query = this.addRelationships(
367
+ knex,
368
+ preQuery,
369
+ selectStatement,
370
+ tableName,
371
+ relationships
372
+ )
387
373
  return this.addFilters(query, filters, { relationship: true })
388
374
  }
389
375
 
@@ -16,7 +16,6 @@ module CouchDBModule {
16
16
  const SCHEMA: Integration = {
17
17
  docs: "https://docs.couchdb.org/en/stable/",
18
18
  friendlyName: "CouchDB",
19
- type: "Non-relational",
20
19
  description:
21
20
  "Apache CouchDB is an open-source document-oriented NoSQL database, implemented in Erlang.",
22
21
  datasource: {
@@ -21,7 +21,6 @@ module DynamoModule {
21
21
  description:
22
22
  "Amazon DynamoDB is a key-value and document database that delivers single-digit millisecond performance at any scale.",
23
23
  friendlyName: "DynamoDB",
24
- type: "Non-relational",
25
24
  datasource: {
26
25
  region: {
27
26
  type: DatasourceFieldTypes.STRING,
@@ -17,7 +17,6 @@ module ElasticsearchModule {
17
17
  description:
18
18
  "Elasticsearch is a search engine based on the Lucene library. It provides a distributed, multitenant-capable full-text search engine with an HTTP web interface and schema-free JSON documents.",
19
19
  friendlyName: "ElasticSearch",
20
- type: "Non-relational",
21
20
  datasource: {
22
21
  url: {
23
22
  type: DatasourceFieldTypes.STRING,
@@ -16,7 +16,6 @@ module Firebase {
16
16
  const SCHEMA: Integration = {
17
17
  docs: "https://firebase.google.com/docs/firestore/quickstart",
18
18
  friendlyName: "Firestore",
19
- type: "Non-relational",
20
19
  description:
21
20
  "Cloud Firestore is a flexible, scalable database for mobile, web, and server development from Firebase and Google Cloud.",
22
21
  datasource: {
@@ -49,7 +49,6 @@ module GoogleSheetsModule {
49
49
  description:
50
50
  "Create and collaborate on online spreadsheets in real-time and from any device. ",
51
51
  friendlyName: "Google Sheets",
52
- type: "Spreadsheet",
53
52
  datasource: {
54
53
  spreadsheetId: {
55
54
  display: "Google Sheet URL",
@@ -12,7 +12,6 @@ const rest = require("./rest")
12
12
  const googlesheets = require("./googlesheets")
13
13
  const firebase = require("./firebase")
14
14
  const redis = require("./redis")
15
- const snowflake = require("./snowflake")
16
15
  const { SourceNames } = require("../definitions/datasource")
17
16
  const environment = require("../environment")
18
17
 
@@ -30,7 +29,6 @@ const DEFINITIONS = {
30
29
  [SourceNames.REST]: rest.schema,
31
30
  [SourceNames.FIRESTORE]: firebase.schema,
32
31
  [SourceNames.REDIS]: redis.schema,
33
- [SourceNames.SNOWFLAKE]: snowflake.schema,
34
32
  }
35
33
 
36
34
  const INTEGRATIONS = {
@@ -48,8 +46,6 @@ const INTEGRATIONS = {
48
46
  [SourceNames.FIRESTORE]: firebase.integration,
49
47
  [SourceNames.GOOGLE_SHEETS]: googlesheets.integration,
50
48
  [SourceNames.REDIS]: redis.integration,
51
- [SourceNames.FIREBASE]: firebase.integration,
52
- [SourceNames.SNOWFLAKE]: snowflake.integration,
53
49
  }
54
50
 
55
51
  // optionally add oracle integration if the oracle binary can be installed
@@ -44,7 +44,6 @@ module MSSQLModule {
44
44
  description:
45
45
  "Microsoft SQL Server is a relational database management system developed by Microsoft. ",
46
46
  friendlyName: "MS SQL Server",
47
- type: "Relational",
48
47
  datasource: {
49
48
  user: {
50
49
  type: DatasourceFieldTypes.STRING,
@@ -247,7 +246,6 @@ module MSSQLModule {
247
246
  autocolumn: !!autoColumns.find((col: string) => col === name),
248
247
  name: name,
249
248
  ...convertSqlType(def.DATA_TYPE),
250
- externalType: def.DATA_TYPE,
251
249
  }
252
250
  }
253
251
  tables[tableName] = {
@@ -24,7 +24,6 @@ module MongoDBModule {
24
24
  const SCHEMA: Integration = {
25
25
  docs: "https://github.com/mongodb/node-mongodb-native",
26
26
  friendlyName: "MongoDB",
27
- type: "Non-relational",
28
27
  description:
29
28
  "MongoDB is a general purpose, document-based, distributed database built for modern application developers and for the cloud era.",
30
29
  datasource: {
@@ -36,7 +36,6 @@ module MySQLModule {
36
36
  docs: "https://github.com/sidorares/node-mysql2",
37
37
  plus: true,
38
38
  friendlyName: "MySQL",
39
- type: "Relational",
40
39
  description:
41
40
  "MySQL Database Service is a fully managed database service to deploy cloud-native applications. ",
42
41
  datasource: {
@@ -233,7 +232,6 @@ module MySQLModule {
233
232
  autocolumn: isAuto,
234
233
  constraints,
235
234
  ...convertSqlType(column.Type),
236
- externalType: column.Type,
237
235
  }
238
236
  }
239
237
  if (!tables[tableName]) {
@@ -40,7 +40,6 @@ module OracleModule {
40
40
  docs: "https://github.com/oracle/node-oracledb",
41
41
  plus: true,
42
42
  friendlyName: "Oracle",
43
- type: "Relational",
44
43
  description:
45
44
  "Oracle Database is an object-relational database management system developed by Oracle Corporation",
46
45
  datasource: {
@@ -47,7 +47,6 @@ module PostgresModule {
47
47
  docs: "https://node-postgres.com",
48
48
  plus: true,
49
49
  friendlyName: "PostgreSQL",
50
- type: "Relational",
51
50
  description:
52
51
  "PostgreSQL, also known as Postgres, is a free and open-source relational database management system emphasizing extensibility and SQL compliance.",
53
52
  datasource: {
@@ -272,7 +271,6 @@ module PostgresModule {
272
271
  autocolumn: isAuto,
273
272
  name: columnName,
274
273
  ...convertSqlType(column.data_type),
275
- externalType: column.data_type,
276
274
  }
277
275
  }
278
276
 
@@ -17,7 +17,6 @@ module RedisModule {
17
17
  docs: "https://redis.io/docs/",
18
18
  description: "",
19
19
  friendlyName: "Redis",
20
- type: "Non-relational",
21
20
  datasource: {
22
21
  host: {
23
22
  type: "string",
@@ -64,7 +64,6 @@ module RestModule {
64
64
  description:
65
65
  "With the REST API datasource, you can connect, query and pull data from multiple REST APIs. You can then use the retrieved data to build apps.",
66
66
  friendlyName: "REST API",
67
- type: "API",
68
67
  datasource: {
69
68
  url: {
70
69
  type: DatasourceFieldTypes.STRING,
@@ -17,7 +17,6 @@ module S3Module {
17
17
  description:
18
18
  "Amazon Simple Storage Service (Amazon S3) is an object storage service that offers industry-leading scalability, data availability, security, and performance.",
19
19
  friendlyName: "Amazon S3",
20
- type: "Object store",
21
20
  datasource: {
22
21
  region: {
23
22
  type: "string",
@@ -218,7 +218,7 @@ class Orchestrator {
218
218
  }
219
219
  }
220
220
  if (
221
- index === env.AUTOMATION_MAX_ITERATION ||
221
+ index === parseInt(env.AUTOMATION_MAX_ITERATIONS) ||
222
222
  index === parseInt(loopStep.inputs.iterations)
223
223
  ) {
224
224
  this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
@@ -21,7 +21,6 @@ const env = require("../../environment")
21
21
  const {
22
22
  USER_METDATA_PREFIX,
23
23
  LINK_USER_METADATA_PREFIX,
24
- TABLE_ROW_PREFIX,
25
24
  } = require("../../db/utils")
26
25
  const MemoryStream = require("memorystream")
27
26
  const { getAppId } = require("@budibase/backend-core/context")
@@ -110,23 +109,6 @@ exports.apiFileReturn = contents => {
110
109
  return fs.createReadStream(path)
111
110
  }
112
111
 
113
- exports.defineFilter = excludeRows => {
114
- if (excludeRows) {
115
- return doc =>
116
- !(
117
- doc._id.includes(USER_METDATA_PREFIX) ||
118
- doc._id.includes(LINK_USER_METADATA_PREFIX) ||
119
- doc._id.includes(TABLE_ROW_PREFIX)
120
- )
121
- } else if (!excludeRows) {
122
- return doc =>
123
- !(
124
- doc._id.includes(USER_METDATA_PREFIX) ||
125
- doc._id.includes(LINK_USER_METADATA_PREFIX)
126
- )
127
- }
128
- }
129
-
130
112
  /**
131
113
  * Local utility to back up the database state for an app, excluding global user
132
114
  * data or user relationships.
@@ -134,10 +116,14 @@ exports.defineFilter = excludeRows => {
134
116
  * @param {object} config Config to send to export DB
135
117
  * @returns {*} either a string or a stream of the backup
136
118
  */
137
- const backupAppData = async (appId, config, includeRows) => {
119
+ const backupAppData = async (appId, config) => {
138
120
  return await exports.exportDB(appId, {
139
121
  ...config,
140
- filter: exports.defineFilter(includeRows),
122
+ filter: doc =>
123
+ !(
124
+ doc._id.includes(USER_METDATA_PREFIX) ||
125
+ doc._id.includes(LINK_USER_METADATA_PREFIX)
126
+ ),
141
127
  })
142
128
  }
143
129
 
@@ -156,8 +142,8 @@ exports.performBackup = async (appId, backupName) => {
156
142
  * @param {string} appId The ID of the app which is to be backed up.
157
143
  * @returns {*} a readable stream of the backup which is written in real time
158
144
  */
159
- exports.streamBackup = async (appId, includeRows) => {
160
- return await backupAppData(appId, { stream: true }, includeRows)
145
+ exports.streamBackup = async appId => {
146
+ return await backupAppData(appId, { stream: true })
161
147
  }
162
148
 
163
149
  /**