@budibase/server 1.2.49 → 1.2.52

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 (172) hide show
  1. package/builder/assets/{index.cacc25b1.js → index.0ca6f47a.js} +1 -1
  2. package/builder/index.html +1 -1
  3. package/coverage/clover.xml +44 -42
  4. package/coverage/coverage-final.json +3 -3
  5. package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
  6. package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
  7. package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
  8. package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
  9. package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
  10. package/coverage/lcov-report/api/controllers/component.js.html +40 -28
  11. package/coverage/lcov-report/api/controllers/datasource.js.html +1 -1
  12. package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
  13. package/coverage/lcov-report/api/controllers/index.html +11 -11
  14. package/coverage/lcov-report/api/controllers/integration.js.html +1 -1
  15. package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
  16. package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
  17. package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
  18. package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
  19. package/coverage/lcov-report/api/controllers/query/index.html +1 -1
  20. package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
  21. package/coverage/lcov-report/api/controllers/role.js.html +1 -1
  22. package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
  23. package/coverage/lcov-report/api/controllers/row/external.js.html +1 -1
  24. package/coverage/lcov-report/api/controllers/row/index.html +1 -1
  25. package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
  26. package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
  27. package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
  28. package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
  29. package/coverage/lcov-report/api/controllers/screen.js.html +1 -1
  30. package/coverage/lcov-report/api/controllers/script.js.html +1 -1
  31. package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
  32. package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
  33. package/coverage/lcov-report/api/controllers/table/index.html +1 -1
  34. package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
  35. package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
  36. package/coverage/lcov-report/api/controllers/user.js.html +1 -1
  37. package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
  38. package/coverage/lcov-report/api/controllers/view/index.html +1 -1
  39. package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
  40. package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
  41. package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
  42. package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
  43. package/coverage/lcov-report/api/index.html +1 -1
  44. package/coverage/lcov-report/api/index.js.html +1 -1
  45. package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
  46. package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
  47. package/coverage/lcov-report/api/routes/auth.js.html +1 -1
  48. package/coverage/lcov-report/api/routes/automation.js.html +1 -1
  49. package/coverage/lcov-report/api/routes/backup.js.html +1 -1
  50. package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
  51. package/coverage/lcov-report/api/routes/component.js.html +1 -1
  52. package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
  53. package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
  54. package/coverage/lcov-report/api/routes/dev.js.html +1 -1
  55. package/coverage/lcov-report/api/routes/index.html +1 -1
  56. package/coverage/lcov-report/api/routes/integration.js.html +1 -1
  57. package/coverage/lcov-report/api/routes/layout.js.html +1 -1
  58. package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
  59. package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
  60. package/coverage/lcov-report/api/routes/permission.js.html +1 -1
  61. package/coverage/lcov-report/api/routes/query.js.html +1 -1
  62. package/coverage/lcov-report/api/routes/role.js.html +1 -1
  63. package/coverage/lcov-report/api/routes/routing.js.html +1 -1
  64. package/coverage/lcov-report/api/routes/screen.js.html +1 -1
  65. package/coverage/lcov-report/api/routes/script.js.html +1 -1
  66. package/coverage/lcov-report/api/routes/table.js.html +1 -1
  67. package/coverage/lcov-report/api/routes/templates.js.html +1 -1
  68. package/coverage/lcov-report/api/routes/user.js.html +1 -1
  69. package/coverage/lcov-report/api/routes/utils/index.html +1 -1
  70. package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
  71. package/coverage/lcov-report/api/routes/view.js.html +1 -1
  72. package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
  73. package/coverage/lcov-report/automations/actions.js.html +1 -1
  74. package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
  75. package/coverage/lcov-report/automations/bullboard.js.html +1 -1
  76. package/coverage/lcov-report/automations/index.html +1 -1
  77. package/coverage/lcov-report/automations/index.js.html +1 -1
  78. package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
  79. package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
  80. package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
  81. package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
  82. package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
  83. package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
  84. package/coverage/lcov-report/automations/steps/index.html +7 -7
  85. package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
  86. package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
  87. package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
  88. package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
  89. package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
  90. package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
  91. package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
  92. package/coverage/lcov-report/automations/steps/updateRow.js.html +4 -10
  93. package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
  94. package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
  95. package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
  96. package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
  97. package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
  98. package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
  99. package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
  100. package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
  101. package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
  102. package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
  103. package/coverage/lcov-report/automations/triggers.js.html +1 -1
  104. package/coverage/lcov-report/constants/index.html +1 -1
  105. package/coverage/lcov-report/constants/index.js.html +1 -1
  106. package/coverage/lcov-report/constants/layouts.js.html +1 -1
  107. package/coverage/lcov-report/constants/screens.js.html +1 -1
  108. package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
  109. package/coverage/lcov-report/db/index.html +1 -1
  110. package/coverage/lcov-report/db/index.js.html +1 -1
  111. package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
  112. package/coverage/lcov-report/db/linkedRows/index.html +1 -1
  113. package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
  114. package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
  115. package/coverage/lcov-report/db/newid.js.html +1 -1
  116. package/coverage/lcov-report/db/utils.js.html +1 -1
  117. package/coverage/lcov-report/events/AutomationEmitter.js.html +15 -9
  118. package/coverage/lcov-report/events/index.html +15 -15
  119. package/coverage/lcov-report/events/index.js.html +1 -1
  120. package/coverage/lcov-report/events/utils.js.html +1 -1
  121. package/coverage/lcov-report/index.html +23 -23
  122. package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
  123. package/coverage/lcov-report/integrations/tests/index.html +1 -1
  124. package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
  125. package/coverage/lcov-report/middleware/builder.js.html +1 -1
  126. package/coverage/lcov-report/middleware/currentapp.js.html +1 -1
  127. package/coverage/lcov-report/middleware/index.html +1 -1
  128. package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
  129. package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
  130. package/coverage/lcov-report/middleware/resourceId.js.html +1 -1
  131. package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
  132. package/coverage/lcov-report/middleware/utils.js.html +1 -1
  133. package/coverage/lcov-report/utilities/budibaseDir.js.html +1 -1
  134. package/coverage/lcov-report/utilities/centralPath.js.html +1 -1
  135. package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
  136. package/coverage/lcov-report/utilities/global.js.html +1 -1
  137. package/coverage/lcov-report/utilities/index.html +1 -1
  138. package/coverage/lcov-report/utilities/index.js.html +1 -1
  139. package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +1 -1
  140. package/coverage/lcov-report/utilities/queue/index.html +1 -1
  141. package/coverage/lcov-report/utilities/routing/index.html +1 -1
  142. package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
  143. package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
  144. package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
  145. package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
  146. package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
  147. package/coverage/lcov-report/utilities/security.js.html +1 -1
  148. package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
  149. package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
  150. package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
  151. package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
  152. package/coverage/lcov-report/utilities/users.js.html +1 -1
  153. package/coverage/lcov-report/utilities/workerRequests.js.html +1 -1
  154. package/coverage/lcov.info +67 -63
  155. package/dist/api/controllers/component.js +24 -19
  156. package/dist/api/controllers/row/index.js +1 -2
  157. package/dist/automations/steps/updateRow.js +0 -2
  158. package/dist/db/dynamoClient.js +1 -3
  159. package/dist/events/AutomationEmitter.js +3 -1
  160. package/dist/integrations/dynamodb.js +8 -22
  161. package/dist/package.json +6 -6
  162. package/dist/tsconfig.build.tsbuildinfo +1 -1
  163. package/dist/utilities/fileSystem/index.js +4 -2
  164. package/package.json +7 -7
  165. package/src/api/controllers/component.js +26 -22
  166. package/src/api/controllers/row/index.ts +1 -2
  167. package/src/automations/steps/updateRow.js +0 -2
  168. package/src/db/dynamoClient.js +1 -3
  169. package/src/events/AutomationEmitter.js +3 -1
  170. package/src/integrations/dynamodb.ts +15 -25
  171. package/src/integrations/tests/dynamodb.spec.js +48 -0
  172. package/src/utilities/fileSystem/index.js +7 -2
@@ -250,14 +250,16 @@ exports.getComponentLibraryManifest = (library) => __awaiter(void 0, void 0, voi
250
250
  return require(path);
251
251
  }
252
252
  let resp;
253
+ let path;
253
254
  try {
254
255
  // Try to load the manifest from the new file location
255
- const path = join(appId, filename);
256
+ path = join(appId, filename);
256
257
  resp = yield retrieve(ObjectStoreBuckets.APPS, path);
257
258
  }
258
259
  catch (error) {
260
+ console.error(`component-manifest-objectstore=failed appId=${appId} path=${path}`, error);
259
261
  // Fallback to loading it from the old location for old apps
260
- const path = join(appId, "node_modules", library, "package", filename);
262
+ path = join(appId, "node_modules", library, "package", filename);
261
263
  resp = yield retrieve(ObjectStoreBuckets.APPS, path);
262
264
  }
263
265
  if (typeof resp !== "string") {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@budibase/server",
3
3
  "email": "hi@budibase.com",
4
- "version": "1.2.49",
4
+ "version": "1.2.52",
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.2.49",
81
- "@budibase/client": "^1.2.49",
82
- "@budibase/pro": "1.2.48",
83
- "@budibase/string-templates": "^1.2.49",
84
- "@budibase/types": "^1.2.49",
80
+ "@budibase/backend-core": "^1.2.52",
81
+ "@budibase/client": "^1.2.52",
82
+ "@budibase/pro": "1.2.51",
83
+ "@budibase/string-templates": "^1.2.52",
84
+ "@budibase/types": "^1.2.52",
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": "279e3878011f8c1fdb7c1502bc7f19a9efd4bd90"
198
+ "gitHead": "00e10574fc82b720a1213f7e651c482b5d884b3a"
199
199
  }
@@ -3,32 +3,36 @@ const { getComponentLibraryManifest } = require("../../utilities/fileSystem")
3
3
  const { getAppDB } = require("@budibase/backend-core/context")
4
4
 
5
5
  exports.fetchAppComponentDefinitions = async function (ctx) {
6
- const db = getAppDB()
7
- const app = await db.get(DocumentType.APP_METADATA)
6
+ try {
7
+ const db = getAppDB()
8
+ const app = await db.get(DocumentType.APP_METADATA)
8
9
 
9
- let componentManifests = await Promise.all(
10
- app.componentLibraries.map(async library => {
11
- let manifest = await getComponentLibraryManifest(library)
10
+ let componentManifests = await Promise.all(
11
+ app.componentLibraries.map(async library => {
12
+ let manifest = await getComponentLibraryManifest(library)
12
13
 
13
- return {
14
- manifest,
15
- library,
16
- }
17
- })
18
- )
19
- const definitions = {}
20
- for (let { manifest, library } of componentManifests) {
21
- for (let key of Object.keys(manifest)) {
22
- if (key === "features") {
23
- definitions[key] = manifest[key]
24
- } else {
25
- const fullComponentName = `${library}/${key}`.toLowerCase()
26
- definitions[fullComponentName] = {
27
- component: fullComponentName,
28
- ...manifest[key],
14
+ return {
15
+ manifest,
16
+ library,
17
+ }
18
+ })
19
+ )
20
+ const definitions = {}
21
+ for (let { manifest, library } of componentManifests) {
22
+ for (let key of Object.keys(manifest)) {
23
+ if (key === "features") {
24
+ definitions[key] = manifest[key]
25
+ } else {
26
+ const fullComponentName = `${library}/${key}`.toLowerCase()
27
+ definitions[fullComponentName] = {
28
+ component: fullComponentName,
29
+ ...manifest[key],
30
+ }
29
31
  }
30
32
  }
31
33
  }
34
+ ctx.body = definitions
35
+ } catch (err) {
36
+ console.error(`component-definitions=failed`, err)
32
37
  }
33
- ctx.body = definitions
34
38
  }
@@ -35,9 +35,8 @@ export async function patch(ctx: any): Promise<any> {
35
35
  pickApi(tableId).patch(ctx)
36
36
  )
37
37
  ctx.status = 200
38
- if (!ctx.disableEmit && ctx.eventEmitter) {
38
+ ctx.eventEmitter &&
39
39
  ctx.eventEmitter.emitRow(`row:update`, appId, row, table)
40
- }
41
40
  ctx.message = `${table.name} updated successfully.`
42
41
  ctx.body = row
43
42
  } catch (err) {
@@ -1,7 +1,6 @@
1
1
  const rowController = require("../../api/controllers/row")
2
2
  const automationUtils = require("../automationUtils")
3
3
  const { buildCtx } = require("./utils")
4
- const env = require("../../environment")
5
4
 
6
5
  exports.definition = {
7
6
  name: "Update Row",
@@ -84,7 +83,6 @@ exports.run = async function ({ inputs, appId, emitter }) {
84
83
  rowId: inputs.rowId,
85
84
  tableId: tableId,
86
85
  },
87
- disableEmit: !env.SELF_HOSTED,
88
86
  })
89
87
 
90
88
  try {
@@ -103,11 +103,9 @@ class Table {
103
103
 
104
104
  exports.init = endpoint => {
105
105
  let AWS = require("aws-sdk")
106
- AWS.config.update({
107
- region: AWS_REGION,
108
- })
109
106
  let docClientParams = {
110
107
  correctClockSkew: true,
108
+ region: AWS_REGION,
111
109
  }
112
110
  if (endpoint) {
113
111
  docClientParams.endpoint = endpoint
@@ -1,8 +1,10 @@
1
1
  const { rowEmission, tableEmission } = require("./utils")
2
2
  const mainEmitter = require("./index")
3
+ const env = require("../environment")
3
4
 
4
5
  // max number of automations that can chain on top of each other
5
- const MAX_AUTOMATION_CHAIN = 5
6
+ // TODO: in future make this configurable at the automation level
7
+ const MAX_AUTOMATION_CHAIN = env.SELF_HOSTED ? 5 : 0
6
8
 
7
9
  /**
8
10
  * Special emitter which takes the count of automation runs which have occurred and blocks an
@@ -13,7 +13,8 @@ module DynamoModule {
13
13
  region: string
14
14
  accessKeyId: string
15
15
  secretAccessKey: string
16
- endpoint: string
16
+ endpoint?: string
17
+ currentClockSkew?: boolean
17
18
  }
18
19
 
19
20
  const SCHEMA: Integration = {
@@ -132,31 +133,20 @@ module DynamoModule {
132
133
 
133
134
  constructor(config: DynamoDBConfig) {
134
135
  this.config = config
135
- if (this.config.endpoint && !this.config.endpoint.includes("localhost")) {
136
- this.connect()
137
- }
138
- let options = {
139
- correctClockSkew: true,
140
- region: this.config.region || AWS_REGION,
141
- endpoint: config.endpoint ? config.endpoint : undefined,
142
- }
143
- this.client = new AWS.DynamoDB.DocumentClient(options)
144
- }
145
-
146
- end() {
147
- this.disconnect()
148
- }
149
136
 
150
- connect() {
151
- AWS.config.update(this.config)
152
- }
137
+ // User is using a local dynamoDB endpoint, don't auth with remote
138
+ if (this.config?.endpoint?.includes("localhost")) {
139
+ // @ts-ignore
140
+ this.config = {}
141
+ }
153
142
 
154
- disconnect() {
155
- AWS.config.update({
156
- secretAccessKey: undefined,
157
- accessKeyId: undefined,
158
- region: AWS_REGION,
159
- })
143
+ this.config = {
144
+ ...this.config,
145
+ currentClockSkew: true,
146
+ region: config.region || AWS_REGION,
147
+ endpoint: config.endpoint || undefined,
148
+ }
149
+ this.client = new AWS.DynamoDB.DocumentClient(this.config)
160
150
  }
161
151
 
162
152
  async create(query: { table: string; json: object }) {
@@ -197,7 +187,7 @@ module DynamoModule {
197
187
  const params = {
198
188
  TableName: query.table,
199
189
  }
200
- return new AWS.DynamoDB().describeTable(params).promise()
190
+ return new AWS.DynamoDB(this.config).describeTable(params).promise()
201
191
  }
202
192
 
203
193
  async get(query: { table: string; json: object }) {
@@ -100,4 +100,52 @@ describe("DynamoDB Integration", () => {
100
100
  Name: "John"
101
101
  })
102
102
  })
103
+
104
+ it("configures the dynamoDB constructor based on an empty endpoint parameter", async () => {
105
+ const config = {
106
+ region: "us-east-1",
107
+ accessKeyId: "test",
108
+ secretAccessKeyId: "test"
109
+ }
110
+
111
+ const integration = new DynamoDBIntegration.integration(config)
112
+
113
+ expect(integration.config).toEqual({
114
+ currentClockSkew: true,
115
+ ...config
116
+ })
117
+ })
118
+
119
+ it("configures the dynamoDB constructor based on a localhost endpoint parameter", async () => {
120
+ const config = {
121
+ region: "us-east-1",
122
+ accessKeyId: "test",
123
+ secretAccessKeyId: "test",
124
+ endpoint: "localhost:8080"
125
+ }
126
+
127
+ const integration = new DynamoDBIntegration.integration(config)
128
+
129
+ expect(integration.config).toEqual({
130
+ region: "us-east-1",
131
+ currentClockSkew: true,
132
+ endpoint: "localhost:8080"
133
+ })
134
+ })
135
+
136
+ it("configures the dynamoDB constructor based on a remote endpoint parameter", async () => {
137
+ const config = {
138
+ region: "us-east-1",
139
+ accessKeyId: "test",
140
+ secretAccessKeyId: "test",
141
+ endpoint: "dynamodb.aws.foo.net"
142
+ }
143
+
144
+ const integration = new DynamoDBIntegration.integration(config)
145
+
146
+ expect(integration.config).toEqual({
147
+ currentClockSkew: true,
148
+ ...config
149
+ })
150
+ })
103
151
  })
@@ -286,13 +286,18 @@ exports.getComponentLibraryManifest = async library => {
286
286
  }
287
287
 
288
288
  let resp
289
+ let path
289
290
  try {
290
291
  // Try to load the manifest from the new file location
291
- const path = join(appId, filename)
292
+ path = join(appId, filename)
292
293
  resp = await retrieve(ObjectStoreBuckets.APPS, path)
293
294
  } catch (error) {
295
+ console.error(
296
+ `component-manifest-objectstore=failed appId=${appId} path=${path}`,
297
+ error
298
+ )
294
299
  // Fallback to loading it from the old location for old apps
295
- const path = join(appId, "node_modules", library, "package", filename)
300
+ path = join(appId, "node_modules", library, "package", filename)
296
301
  resp = await retrieve(ObjectStoreBuckets.APPS, path)
297
302
  }
298
303
  if (typeof resp !== "string") {