@budibase/server 1.3.21 → 1.3.22-alpha.1
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.
- package/__mocks__/mongodb.ts +1 -1
- package/builder/assets/index.96c69636.js +1008 -0
- package/builder/assets/index.c167b5c3.css +6 -0
- package/builder/index.html +2 -4
- package/coverage/clover.xml +308 -338
- package/coverage/coverage-final.json +19 -21
- package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/controllers/auth.js.html +41 -8
- package/coverage/lcov-report/api/controllers/automation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/backup.js.html +1 -1
- package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
- package/coverage/lcov-report/api/controllers/datasource.js.html +73 -34
- package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
- package/coverage/lcov-report/api/controllers/index.html +27 -57
- package/coverage/lcov-report/api/controllers/integration.js.html +6 -6
- package/coverage/lcov-report/api/controllers/layout.js.html +1 -1
- package/coverage/lcov-report/api/controllers/metadata.js.html +1 -1
- package/coverage/lcov-report/api/controllers/migrations.js.html +1 -1
- package/coverage/lcov-report/api/controllers/permission.js.html +1 -1
- package/coverage/lcov-report/api/controllers/query/index.html +1 -1
- package/coverage/lcov-report/api/controllers/query/validation.js.html +1 -1
- package/coverage/lcov-report/api/controllers/role.js.html +1 -1
- package/coverage/lcov-report/api/controllers/routing.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/external.js.html +2 -2
- package/coverage/lcov-report/api/controllers/row/index.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internal.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +1 -1
- package/coverage/lcov-report/api/controllers/row/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/script.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/external.js.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.html +1 -1
- package/coverage/lcov-report/api/controllers/table/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/templates.js.html +1 -1
- package/coverage/lcov-report/api/controllers/user.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.html +1 -1
- package/coverage/lcov-report/api/controllers/view/index.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/utils.js.html +1 -1
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +1 -1
- package/coverage/lcov-report/api/controllers/webhook.js.html +1 -1
- package/coverage/lcov-report/api/index.html +1 -1
- package/coverage/lcov-report/api/index.js.html +13 -13
- package/coverage/lcov-report/api/routes/analytics.js.html +1 -1
- package/coverage/lcov-report/api/routes/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/routes/auth.js.html +1 -1
- package/coverage/lcov-report/api/routes/automation.js.html +1 -1
- package/coverage/lcov-report/api/routes/backup.js.html +1 -1
- package/coverage/lcov-report/api/routes/cloud.js.html +1 -1
- package/coverage/lcov-report/api/routes/component.js.html +1 -1
- package/coverage/lcov-report/api/routes/datasource.js.html +1 -1
- package/coverage/lcov-report/api/routes/deploy.js.html +1 -1
- package/coverage/lcov-report/api/routes/dev.js.html +1 -1
- package/coverage/lcov-report/api/routes/index.html +1 -1
- package/coverage/lcov-report/api/routes/integration.js.html +1 -1
- package/coverage/lcov-report/api/routes/layout.js.html +1 -1
- package/coverage/lcov-report/api/routes/metadata.js.html +1 -1
- package/coverage/lcov-report/api/routes/migrations.js.html +1 -1
- package/coverage/lcov-report/api/routes/permission.js.html +1 -1
- package/coverage/lcov-report/api/routes/query.js.html +1 -1
- package/coverage/lcov-report/api/routes/role.js.html +1 -1
- package/coverage/lcov-report/api/routes/routing.js.html +1 -1
- package/coverage/lcov-report/api/routes/screen.js.html +1 -1
- package/coverage/lcov-report/api/routes/script.js.html +1 -1
- package/coverage/lcov-report/api/routes/table.js.html +2 -2
- package/coverage/lcov-report/api/routes/templates.js.html +1 -1
- package/coverage/lcov-report/api/routes/user.js.html +1 -1
- package/coverage/lcov-report/api/routes/utils/index.html +9 -9
- package/coverage/lcov-report/api/routes/utils/validators.js.html +75 -12
- package/coverage/lcov-report/api/routes/view.js.html +1 -1
- package/coverage/lcov-report/api/routes/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/actions.js.html +1 -1
- package/coverage/lcov-report/automations/automationUtils.js.html +1 -1
- package/coverage/lcov-report/automations/bullboard.js.html +1 -1
- package/coverage/lcov-report/automations/index.html +1 -1
- package/coverage/lcov-report/automations/index.js.html +1 -1
- package/coverage/lcov-report/automations/steps/bash.js.html +1 -1
- package/coverage/lcov-report/automations/steps/delay.js.html +1 -1
- package/coverage/lcov-report/automations/steps/discord.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +1 -1
- package/coverage/lcov-report/automations/steps/executeScript.js.html +1 -1
- package/coverage/lcov-report/automations/steps/filter.js.html +1 -1
- package/coverage/lcov-report/automations/steps/index.html +1 -1
- package/coverage/lcov-report/automations/steps/integromat.js.html +1 -1
- package/coverage/lcov-report/automations/steps/loop.js.html +1 -1
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +1 -1
- package/coverage/lcov-report/automations/steps/queryRows.js.html +1 -1
- package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +1 -1
- package/coverage/lcov-report/automations/steps/serverLog.js.html +1 -1
- package/coverage/lcov-report/automations/steps/slack.js.html +1 -1
- package/coverage/lcov-report/automations/steps/updateRow.js.html +1 -1
- package/coverage/lcov-report/automations/steps/utils.js.html +1 -1
- package/coverage/lcov-report/automations/steps/zapier.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +1 -1
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +1 -1
- package/coverage/lcov-report/automations/triggers.js.html +1 -1
- package/coverage/lcov-report/constants/index.html +1 -1
- package/coverage/lcov-report/constants/index.js.html +1 -1
- package/coverage/lcov-report/constants/layouts.js.html +1 -1
- package/coverage/lcov-report/constants/screens.js.html +1 -1
- package/coverage/lcov-report/db/inMemoryView.js.html +1 -1
- package/coverage/lcov-report/db/index.html +14 -14
- package/coverage/lcov-report/db/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.html +1 -1
- package/coverage/lcov-report/db/linkedRows/index.js.html +1 -1
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +1 -1
- package/coverage/lcov-report/db/newid.js.html +2 -2
- package/coverage/lcov-report/db/utils.js.html +30 -18
- package/coverage/lcov-report/events/AutomationEmitter.js.html +3 -3
- package/coverage/lcov-report/events/index.html +1 -1
- package/coverage/lcov-report/events/index.js.html +1 -1
- package/coverage/lcov-report/events/utils.js.html +1 -1
- package/coverage/lcov-report/index.html +44 -44
- package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +1 -1
- package/coverage/lcov-report/integrations/tests/index.html +1 -1
- package/coverage/lcov-report/middleware/appInfo.js.html +1 -1
- package/coverage/lcov-report/middleware/builder.js.html +12 -12
- package/coverage/lcov-report/middleware/currentapp.js.html +46 -40
- package/coverage/lcov-report/middleware/index.html +15 -15
- package/coverage/lcov-report/middleware/joi-validator.js.html +1 -1
- package/coverage/lcov-report/middleware/publicApi.js.html +1 -1
- package/coverage/lcov-report/middleware/resourceId.js.html +7 -7
- package/coverage/lcov-report/middleware/selfhost.js.html +1 -1
- package/coverage/lcov-report/middleware/utils.js.html +2 -2
- package/coverage/lcov-report/utilities/budibaseDir.js.html +3 -3
- package/coverage/lcov-report/utilities/centralPath.js.html +4 -4
- package/coverage/lcov-report/utilities/csvParser.js.html +1 -1
- package/coverage/lcov-report/utilities/global.js.html +16 -16
- package/coverage/lcov-report/utilities/index.html +15 -15
- package/coverage/lcov-report/utilities/index.js.html +24 -24
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +2 -2
- package/coverage/lcov-report/utilities/queue/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.html +1 -1
- package/coverage/lcov-report/utilities/routing/index.js.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +1 -1
- package/coverage/lcov-report/utilities/scriptRunner.js.html +1 -1
- package/coverage/lcov-report/utilities/security.js.html +2 -2
- package/coverage/lcov-report/utilities/statusCodes.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/index.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +1 -1
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +1 -1
- package/coverage/lcov-report/utilities/users.js.html +1 -1
- package/coverage/lcov-report/utilities/workerRequests.js.html +32 -8
- package/coverage/lcov.info +521 -558
- package/dist/api/controllers/application.js +5 -5
- package/dist/api/controllers/auth.js +9 -0
- package/dist/api/controllers/component.js +19 -6
- package/dist/api/controllers/datasource.js +21 -8
- package/dist/api/controllers/deploy/index.js +1 -8
- package/dist/api/controllers/integration.js +4 -4
- package/dist/{migrations/functions/usageQuotas/syncDevelopers.js → api/controllers/plugin/file.js} +13 -13
- package/dist/api/controllers/plugin/github.js +69 -0
- package/dist/api/controllers/plugin/index.js +144 -0
- package/dist/api/controllers/plugin/npm.js +58 -0
- package/dist/api/controllers/plugin/uploaders.js +11 -0
- package/dist/{migrations/functions/usageQuotas/syncPublishedApps.js → api/controllers/plugin/url.js} +13 -15
- package/dist/api/controllers/plugin/utils.js +26 -0
- package/dist/api/controllers/row/external.js +1 -1
- package/dist/api/controllers/screen.js +62 -14
- package/dist/api/controllers/static/index.js +1 -0
- package/dist/api/controllers/static/templates/BudibaseApp.svelte +10 -0
- package/dist/api/controllers/static/templates/preview.hbs +5 -1
- package/dist/api/index.js +1 -1
- package/dist/api/routes/application.js +3 -2
- package/dist/api/routes/index.js +2 -0
- package/dist/{migrations/functions/publishedAppsQuota.js → api/routes/plugin.js} +13 -21
- package/dist/api/routes/public/rows.js +1 -82
- package/dist/api/routes/public/tables.js +1 -1
- package/dist/api/routes/table.js +1 -1
- package/dist/api/routes/utils/validators.js +20 -2
- package/dist/app.js +16 -1
- package/dist/db/utils.js +3 -0
- package/dist/environment.js +1 -0
- package/dist/integrations/airtable.js +126 -129
- package/dist/integrations/arangodb.js +86 -89
- package/dist/integrations/base/query.js +2 -2
- package/dist/integrations/base/sqlTable.js +3 -1
- package/dist/integrations/couchdb.js +80 -83
- package/dist/integrations/dynamodb.js +161 -164
- package/dist/integrations/elasticsearch.js +135 -138
- package/dist/integrations/firebase.js +154 -157
- package/dist/integrations/googlesheets.js +323 -327
- package/dist/integrations/index.js +99 -51
- package/dist/integrations/microsoftSqlServer.js +240 -243
- package/dist/integrations/mongodb.js +239 -242
- package/dist/integrations/mysql.js +215 -219
- package/dist/integrations/oracle.js +318 -322
- package/dist/integrations/postgres.js +262 -265
- package/dist/integrations/redis.js +134 -139
- package/dist/integrations/rest.js +289 -292
- package/dist/integrations/s3.js +61 -64
- package/dist/integrations/snowflake.js +83 -86
- package/dist/middleware/currentapp.js +2 -0
- package/dist/migrations/functions/backfill/global.js +0 -3
- package/dist/migrations/index.js +0 -10
- package/dist/package.json +9 -6
- package/dist/tests/utilities/TestConfiguration.js +1 -1
- package/dist/threads/query.js +2 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utilities/fileSystem/index.js +105 -1
- package/dist/utilities/workerRequests.js +4 -0
- package/dist/watch.js +77 -0
- package/dist/websocket.js +22 -0
- package/package.json +10 -7
- package/scripts/dev/manage.js +4 -0
- package/scripts/localdomain.js +3 -1
- package/specs/openapi.json +115 -112
- package/specs/openapi.yaml +96 -94
- package/specs/resources/misc.js +116 -0
- package/specs/resources/query.js +1 -1
- package/src/api/controllers/application.ts +1 -2
- package/src/api/controllers/auth.js +11 -0
- package/src/api/controllers/component.ts +57 -0
- package/src/api/controllers/datasource.js +21 -8
- package/src/api/controllers/deploy/index.ts +1 -6
- package/src/api/controllers/integration.js +4 -4
- package/src/api/controllers/plugin/file.ts +15 -0
- package/src/api/controllers/plugin/github.ts +75 -0
- package/src/api/controllers/plugin/index.ts +134 -0
- package/src/api/controllers/plugin/npm.ts +56 -0
- package/src/api/controllers/plugin/uploaders.ts +4 -0
- package/src/api/controllers/plugin/url.ts +12 -0
- package/src/api/controllers/plugin/utils.ts +19 -0
- package/src/api/controllers/public/mapping/types.ts +8 -0
- package/src/api/controllers/row/external.js +1 -1
- package/src/api/controllers/screen.ts +122 -0
- package/src/api/controllers/static/index.ts +1 -1
- package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
- package/src/api/controllers/static/templates/preview.hbs +5 -1
- package/src/api/index.js +1 -1
- package/src/api/routes/application.ts +13 -2
- package/src/api/routes/index.ts +2 -0
- package/src/api/routes/plugin.ts +14 -0
- package/src/api/routes/public/rows.ts +1 -82
- package/src/api/routes/public/tables.ts +1 -1
- package/src/api/routes/table.js +1 -1
- package/src/api/routes/tests/query.spec.js +8 -25
- package/src/api/routes/tests/user.spec.js +0 -2
- package/src/api/routes/utils/validators.js +26 -5
- package/src/app.ts +25 -2
- package/src/db/utils.js +4 -0
- package/src/definitions/openapi.ts +56 -55
- package/src/environment.js +1 -0
- package/src/integrations/airtable.ts +116 -118
- package/src/integrations/arangodb.ts +87 -89
- package/src/integrations/base/query.ts +2 -2
- package/src/integrations/base/sqlTable.ts +3 -1
- package/src/integrations/couchdb.ts +83 -89
- package/src/integrations/dynamodb.ts +173 -175
- package/src/integrations/elasticsearch.ts +120 -122
- package/src/integrations/firebase.ts +157 -159
- package/src/integrations/googlesheets.ts +328 -338
- package/src/integrations/index.ts +64 -21
- package/src/integrations/microsoftSqlServer.ts +249 -251
- package/src/integrations/mongodb.ts +261 -258
- package/src/integrations/mysql.ts +229 -234
- package/src/integrations/oracle.ts +373 -380
- package/src/integrations/postgres.ts +264 -268
- package/src/integrations/redis.ts +128 -132
- package/src/integrations/rest.ts +324 -329
- package/src/integrations/s3.ts +68 -71
- package/src/integrations/snowflake.ts +80 -82
- package/src/integrations/tests/{airtable.spec.js → airtable.spec.ts} +21 -18
- package/src/integrations/tests/{arangodb.spec.js → arangodb.spec.ts} +12 -9
- package/src/integrations/tests/{couchdb.spec.js → couchdb.spec.ts} +33 -27
- package/src/integrations/tests/{dynamodb.spec.js → dynamodb.spec.ts} +45 -41
- package/src/integrations/tests/{elasticsearch.spec.js → elasticsearch.spec.ts} +22 -21
- package/src/integrations/tests/{firebase.spec.js → firebase.spec.ts} +33 -28
- package/src/integrations/tests/{microsoftSqlServer.spec.js → microsoftSqlServer.spec.ts} +12 -11
- package/src/integrations/tests/{mongo.spec.js → mongo.spec.ts} +46 -35
- package/src/integrations/tests/{mysql.spec.js → mysql.spec.ts} +17 -15
- package/src/integrations/tests/{oracle.spec.js → oracle.spec.ts} +19 -17
- package/src/integrations/tests/{postgres.spec.js → postgres.spec.ts} +19 -17
- package/src/integrations/tests/{redis.spec.js → redis.spec.ts} +27 -18
- package/src/integrations/tests/{rest.spec.js → rest.spec.ts} +22 -14
- package/src/integrations/tests/{s3.spec.js → s3.spec.ts} +10 -8
- package/src/integrations/tests/{sql.spec.js → sql.spec.ts} +228 -177
- package/src/middleware/currentapp.js +2 -0
- package/src/migrations/functions/backfill/global.ts +0 -3
- package/src/migrations/index.ts +0 -16
- package/src/module.d.ts +2 -0
- package/src/tests/utilities/TestConfiguration.js +1 -1
- package/src/threads/query.ts +2 -2
- package/src/utilities/fileSystem/index.js +123 -0
- package/src/utilities/workerRequests.js +8 -0
- package/src/watch.ts +38 -0
- package/src/websocket.ts +26 -0
- package/builder/assets/index.8d12d461.css +0 -6
- package/builder/assets/index.d354271c.js +0 -879
- package/builder/assets/vendor.5e1fe644.css +0 -1
- package/builder/assets/vendor.67dbd8fa.js +0 -248
- package/coverage/lcov-report/api/controllers/component.js.html +0 -199
- package/coverage/lcov-report/api/controllers/screen.js.html +0 -259
- package/dist/migrations/functions/developerQuota.js +0 -49
- package/src/api/controllers/component.js +0 -38
- package/src/api/controllers/screen.js +0 -58
- package/src/migrations/functions/developerQuota.ts +0 -15
- package/src/migrations/functions/publishedAppsQuota.ts +0 -13
- package/src/migrations/functions/usageQuotas/syncDevelopers.ts +0 -19
- package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +0 -21
package/specs/openapi.yaml
CHANGED
|
@@ -1004,7 +1004,7 @@ components:
|
|
|
1004
1004
|
description: The ID of the query.
|
|
1005
1005
|
type: string
|
|
1006
1006
|
datasourceId:
|
|
1007
|
-
description: The ID of the
|
|
1007
|
+
description: The ID of the datasource the query belongs to.
|
|
1008
1008
|
type: string
|
|
1009
1009
|
parameters:
|
|
1010
1010
|
description: The bindings which are required to perform this query.
|
|
@@ -1051,7 +1051,7 @@ components:
|
|
|
1051
1051
|
description: The ID of the query.
|
|
1052
1052
|
type: string
|
|
1053
1053
|
datasourceId:
|
|
1054
|
-
description: The ID of the
|
|
1054
|
+
description: The ID of the datasource the query belongs to.
|
|
1055
1055
|
type: string
|
|
1056
1056
|
parameters:
|
|
1057
1057
|
description: The bindings which are required to perform this query.
|
|
@@ -1264,6 +1264,98 @@ components:
|
|
|
1264
1264
|
- _id
|
|
1265
1265
|
required:
|
|
1266
1266
|
- data
|
|
1267
|
+
rowSearch:
|
|
1268
|
+
type: object
|
|
1269
|
+
properties:
|
|
1270
|
+
query:
|
|
1271
|
+
type: object
|
|
1272
|
+
properties:
|
|
1273
|
+
allOr:
|
|
1274
|
+
type: boolean
|
|
1275
|
+
description: Specifies that a row should be returned if it satisfies any of the
|
|
1276
|
+
specified options, rather than requiring it to fulfill all the
|
|
1277
|
+
search parameters. This defaults to false, meaning AND logic
|
|
1278
|
+
will be used.
|
|
1279
|
+
string:
|
|
1280
|
+
type: object
|
|
1281
|
+
example:
|
|
1282
|
+
columnName1: value
|
|
1283
|
+
columnName2: value
|
|
1284
|
+
description: A map of field name to the string to search for, this will look for
|
|
1285
|
+
rows that have a value starting with the string value.
|
|
1286
|
+
additionalProperties:
|
|
1287
|
+
type: string
|
|
1288
|
+
description: The value to search for in the column.
|
|
1289
|
+
fuzzy:
|
|
1290
|
+
type: object
|
|
1291
|
+
description: A fuzzy search, only supported by internal tables.
|
|
1292
|
+
range:
|
|
1293
|
+
type: object
|
|
1294
|
+
description: Searches within a range, the format of this must be in the format
|
|
1295
|
+
of an object with a "low" and "high" property.
|
|
1296
|
+
example:
|
|
1297
|
+
columnName1:
|
|
1298
|
+
low: 10
|
|
1299
|
+
high: 20
|
|
1300
|
+
equal:
|
|
1301
|
+
type: object
|
|
1302
|
+
description: Searches for rows that have a column value that is exactly the
|
|
1303
|
+
value set.
|
|
1304
|
+
notEqual:
|
|
1305
|
+
type: object
|
|
1306
|
+
description: Searches for any row which does not contain the specified column
|
|
1307
|
+
value.
|
|
1308
|
+
empty:
|
|
1309
|
+
type: object
|
|
1310
|
+
description: Searches for rows which do not contain the specified column. The
|
|
1311
|
+
object should simply contain keys of the column names, these can
|
|
1312
|
+
map to any value.
|
|
1313
|
+
example:
|
|
1314
|
+
columnName1: ""
|
|
1315
|
+
notEmpty:
|
|
1316
|
+
type: object
|
|
1317
|
+
description: Searches for rows which have the specified column.
|
|
1318
|
+
oneOf:
|
|
1319
|
+
type: object
|
|
1320
|
+
description: Searches for rows which have a column value that is any of the
|
|
1321
|
+
specified values. The format of this must be columnName ->
|
|
1322
|
+
[value1, value2].
|
|
1323
|
+
paginate:
|
|
1324
|
+
type: boolean
|
|
1325
|
+
description: Enables pagination, by default this is disabled.
|
|
1326
|
+
bookmark:
|
|
1327
|
+
oneOf:
|
|
1328
|
+
- type: string
|
|
1329
|
+
- type: integer
|
|
1330
|
+
description: If retrieving another page, the bookmark from the previous request
|
|
1331
|
+
must be supplied.
|
|
1332
|
+
limit:
|
|
1333
|
+
type: integer
|
|
1334
|
+
description: The maximum number of rows to return, useful when paginating, for
|
|
1335
|
+
internal tables this will be limited to 1000, for SQL tables it will
|
|
1336
|
+
be 5000.
|
|
1337
|
+
sort:
|
|
1338
|
+
type: object
|
|
1339
|
+
description: A set of parameters describing the sort behaviour of the search.
|
|
1340
|
+
properties:
|
|
1341
|
+
order:
|
|
1342
|
+
type: string
|
|
1343
|
+
enum:
|
|
1344
|
+
- ascending
|
|
1345
|
+
- descending
|
|
1346
|
+
description: The order of the sort, by default this is ascending.
|
|
1347
|
+
column:
|
|
1348
|
+
type: string
|
|
1349
|
+
description: The name of the column by which the rows will be sorted.
|
|
1350
|
+
type:
|
|
1351
|
+
type: string
|
|
1352
|
+
enum:
|
|
1353
|
+
- string
|
|
1354
|
+
- number
|
|
1355
|
+
description: Defines whether the column should be treated as a string or as
|
|
1356
|
+
numbers when sorting.
|
|
1357
|
+
required:
|
|
1358
|
+
- query
|
|
1267
1359
|
nameSearch:
|
|
1268
1360
|
type: object
|
|
1269
1361
|
properties:
|
|
@@ -1544,97 +1636,7 @@ paths:
|
|
|
1544
1636
|
content:
|
|
1545
1637
|
application/json:
|
|
1546
1638
|
schema:
|
|
1547
|
-
|
|
1548
|
-
required:
|
|
1549
|
-
- query
|
|
1550
|
-
properties:
|
|
1551
|
-
query:
|
|
1552
|
-
type: object
|
|
1553
|
-
properties:
|
|
1554
|
-
allOr:
|
|
1555
|
-
type: boolean
|
|
1556
|
-
description: Specifies that a row should be returned if it satisfies any of the
|
|
1557
|
-
specified options, rather than requiring it to fulfill
|
|
1558
|
-
all the search parameters. This defaults to false,
|
|
1559
|
-
meaning AND logic will be used.
|
|
1560
|
-
string:
|
|
1561
|
-
type: object
|
|
1562
|
-
example:
|
|
1563
|
-
columnName1: value
|
|
1564
|
-
columnName2: value
|
|
1565
|
-
description: A map of field name to the string to search for, this will look for
|
|
1566
|
-
rows that have a value starting with the string value.
|
|
1567
|
-
additionalProperties:
|
|
1568
|
-
type: string
|
|
1569
|
-
description: The value to search for in the column.
|
|
1570
|
-
fuzzy:
|
|
1571
|
-
type: object
|
|
1572
|
-
description: A fuzzy search, only supported by internal tables.
|
|
1573
|
-
range:
|
|
1574
|
-
type: object
|
|
1575
|
-
description: Searches within a range, the format of this must be in the format
|
|
1576
|
-
of an object with a "low" and "high" property.
|
|
1577
|
-
example:
|
|
1578
|
-
columnName1:
|
|
1579
|
-
low: 10
|
|
1580
|
-
high: 20
|
|
1581
|
-
equal:
|
|
1582
|
-
type: object
|
|
1583
|
-
description: Searches for rows that have a column value that is exactly the
|
|
1584
|
-
value set.
|
|
1585
|
-
notEqual:
|
|
1586
|
-
type: object
|
|
1587
|
-
description: Searches for any row which does not contain the specified column
|
|
1588
|
-
value.
|
|
1589
|
-
empty:
|
|
1590
|
-
type: object
|
|
1591
|
-
description: Searches for rows which do not contain the specified column. The
|
|
1592
|
-
object should simply contain keys of the column names,
|
|
1593
|
-
these can map to any value.
|
|
1594
|
-
example:
|
|
1595
|
-
columnName1: ""
|
|
1596
|
-
notEmpty:
|
|
1597
|
-
type: object
|
|
1598
|
-
description: Searches for rows which have the specified column.
|
|
1599
|
-
oneOf:
|
|
1600
|
-
type: object
|
|
1601
|
-
description: Searches for rows which have a column value that is any of the
|
|
1602
|
-
specified values. The format of this must be columnName
|
|
1603
|
-
-> [value1, value2].
|
|
1604
|
-
paginate:
|
|
1605
|
-
type: boolean
|
|
1606
|
-
description: Enables pagination, by default this is disabled.
|
|
1607
|
-
bookmark:
|
|
1608
|
-
oneOf:
|
|
1609
|
-
- type: string
|
|
1610
|
-
- type: integer
|
|
1611
|
-
description: If retrieving another page, the bookmark from the previous request
|
|
1612
|
-
must be supplied.
|
|
1613
|
-
limit:
|
|
1614
|
-
type: integer
|
|
1615
|
-
description: The maximum number of rows to return, useful when paginating, for
|
|
1616
|
-
internal tables this will be limited to 1000, for SQL tables
|
|
1617
|
-
it will be 5000.
|
|
1618
|
-
sort:
|
|
1619
|
-
type: object
|
|
1620
|
-
description: A set of parameters describing the sort behaviour of the search.
|
|
1621
|
-
properties:
|
|
1622
|
-
order:
|
|
1623
|
-
type: string
|
|
1624
|
-
enum:
|
|
1625
|
-
- ascending
|
|
1626
|
-
- descending
|
|
1627
|
-
description: The order of the sort, by default this is ascending.
|
|
1628
|
-
column:
|
|
1629
|
-
type: string
|
|
1630
|
-
description: The name of the column by which the rows will be sorted.
|
|
1631
|
-
type:
|
|
1632
|
-
type: string
|
|
1633
|
-
enum:
|
|
1634
|
-
- string
|
|
1635
|
-
- number
|
|
1636
|
-
description: Defines whether the column should be treated as a string or as
|
|
1637
|
-
numbers when sorting.
|
|
1639
|
+
$ref: "#/components/schemas/rowSearch"
|
|
1638
1640
|
responses:
|
|
1639
1641
|
"200":
|
|
1640
1642
|
description: The response will contain an array of rows that match the search
|
|
@@ -1665,7 +1667,7 @@ paths:
|
|
|
1665
1667
|
responses:
|
|
1666
1668
|
"200":
|
|
1667
1669
|
description: Returns the created table, including the ID which has been
|
|
1668
|
-
generated for it. This can be internal or external
|
|
1670
|
+
generated for it. This can be internal or external datasources.
|
|
1669
1671
|
content:
|
|
1670
1672
|
application/json:
|
|
1671
1673
|
schema:
|
package/specs/resources/misc.js
CHANGED
|
@@ -2,6 +2,122 @@ const { object } = require("./utils")
|
|
|
2
2
|
const Resource = require("./utils/Resource")
|
|
3
3
|
|
|
4
4
|
module.exports = new Resource().setSchemas({
|
|
5
|
+
rowSearch: object(
|
|
6
|
+
{
|
|
7
|
+
query: {
|
|
8
|
+
type: "object",
|
|
9
|
+
properties: {
|
|
10
|
+
allOr: {
|
|
11
|
+
type: "boolean",
|
|
12
|
+
description:
|
|
13
|
+
"Specifies that a row should be returned if it satisfies any of the specified options, rather than requiring it to fulfill all the search parameters. This defaults to false, meaning AND logic will be used.",
|
|
14
|
+
},
|
|
15
|
+
string: {
|
|
16
|
+
type: "object",
|
|
17
|
+
example: {
|
|
18
|
+
columnName1: "value",
|
|
19
|
+
columnName2: "value",
|
|
20
|
+
},
|
|
21
|
+
description:
|
|
22
|
+
"A map of field name to the string to search for, this will look for rows that have a value starting with the string value.",
|
|
23
|
+
additionalProperties: {
|
|
24
|
+
type: "string",
|
|
25
|
+
description: "The value to search for in the column.",
|
|
26
|
+
},
|
|
27
|
+
},
|
|
28
|
+
fuzzy: {
|
|
29
|
+
type: "object",
|
|
30
|
+
description: "A fuzzy search, only supported by internal tables.",
|
|
31
|
+
},
|
|
32
|
+
range: {
|
|
33
|
+
type: "object",
|
|
34
|
+
description:
|
|
35
|
+
'Searches within a range, the format of this must be in the format of an object with a "low" and "high" property.',
|
|
36
|
+
example: {
|
|
37
|
+
columnName1: {
|
|
38
|
+
low: 10,
|
|
39
|
+
high: 20,
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
equal: {
|
|
44
|
+
type: "object",
|
|
45
|
+
description:
|
|
46
|
+
"Searches for rows that have a column value that is exactly the value set.",
|
|
47
|
+
},
|
|
48
|
+
notEqual: {
|
|
49
|
+
type: "object",
|
|
50
|
+
description:
|
|
51
|
+
"Searches for any row which does not contain the specified column value.",
|
|
52
|
+
},
|
|
53
|
+
empty: {
|
|
54
|
+
type: "object",
|
|
55
|
+
description:
|
|
56
|
+
"Searches for rows which do not contain the specified column. The object should simply contain keys of the column names, these can map to any value.",
|
|
57
|
+
example: {
|
|
58
|
+
columnName1: "",
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
notEmpty: {
|
|
62
|
+
type: "object",
|
|
63
|
+
description: "Searches for rows which have the specified column.",
|
|
64
|
+
},
|
|
65
|
+
oneOf: {
|
|
66
|
+
type: "object",
|
|
67
|
+
description:
|
|
68
|
+
"Searches for rows which have a column value that is any of the specified values. The format of this must be columnName -> [value1, value2].",
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
paginate: {
|
|
73
|
+
type: "boolean",
|
|
74
|
+
description: "Enables pagination, by default this is disabled.",
|
|
75
|
+
},
|
|
76
|
+
bookmark: {
|
|
77
|
+
oneOf: [
|
|
78
|
+
{
|
|
79
|
+
type: "string",
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
type: "integer",
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
description:
|
|
86
|
+
"If retrieving another page, the bookmark from the previous request must be supplied.",
|
|
87
|
+
},
|
|
88
|
+
limit: {
|
|
89
|
+
type: "integer",
|
|
90
|
+
description:
|
|
91
|
+
"The maximum number of rows to return, useful when paginating, for internal tables this will be limited to 1000, for SQL tables it will be 5000.",
|
|
92
|
+
},
|
|
93
|
+
sort: {
|
|
94
|
+
type: "object",
|
|
95
|
+
description:
|
|
96
|
+
"A set of parameters describing the sort behaviour of the search.",
|
|
97
|
+
properties: {
|
|
98
|
+
order: {
|
|
99
|
+
type: "string",
|
|
100
|
+
enum: ["ascending", "descending"],
|
|
101
|
+
description: "The order of the sort, by default this is ascending.",
|
|
102
|
+
},
|
|
103
|
+
column: {
|
|
104
|
+
type: "string",
|
|
105
|
+
description:
|
|
106
|
+
"The name of the column by which the rows will be sorted.",
|
|
107
|
+
},
|
|
108
|
+
type: {
|
|
109
|
+
type: "string",
|
|
110
|
+
enum: ["string", "number"],
|
|
111
|
+
description:
|
|
112
|
+
"Defines whether the column should be treated as a string or as numbers when sorting.",
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
required: ["query"],
|
|
119
|
+
}
|
|
120
|
+
),
|
|
5
121
|
nameSearch: object({
|
|
6
122
|
name: {
|
|
7
123
|
type: "string",
|
package/specs/resources/query.js
CHANGED
|
@@ -472,7 +472,6 @@ const destroyApp = async (ctx: any) => {
|
|
|
472
472
|
const result = await db.destroy()
|
|
473
473
|
|
|
474
474
|
if (isUnpublish) {
|
|
475
|
-
await quotas.removePublishedApp()
|
|
476
475
|
await events.app.unpublished(app)
|
|
477
476
|
} else {
|
|
478
477
|
await quotas.removeApp()
|
|
@@ -572,7 +571,7 @@ export const sync = async (ctx: any, next: any) => {
|
|
|
572
571
|
}
|
|
573
572
|
}
|
|
574
573
|
|
|
575
|
-
const updateAppPackage = async (appPackage: any, appId: any) => {
|
|
574
|
+
export const updateAppPackage = async (appPackage: any, appId: any) => {
|
|
576
575
|
return context.doInAppContext(appId, async () => {
|
|
577
576
|
const db = context.getAppDB()
|
|
578
577
|
const application = await db.get(DocumentType.APP_METADATA)
|
|
@@ -4,6 +4,15 @@ const { getFullUser } = require("../../utilities/users")
|
|
|
4
4
|
const { BUILTIN_ROLE_IDS } = require("@budibase/backend-core/roles")
|
|
5
5
|
const { getAppDB, getAppId } = require("@budibase/backend-core/context")
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* Add the attributes that are session based to the current user.
|
|
9
|
+
*/
|
|
10
|
+
const addSessionAttributesToUser = ctx => {
|
|
11
|
+
if (ctx.user) {
|
|
12
|
+
ctx.body.license = ctx.user.license
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
7
16
|
exports.fetchSelf = async ctx => {
|
|
8
17
|
let userId = ctx.user.userId || ctx.user._id
|
|
9
18
|
/* istanbul ignore next */
|
|
@@ -55,4 +64,6 @@ exports.fetchSelf = async ctx => {
|
|
|
55
64
|
} else {
|
|
56
65
|
ctx.body = user
|
|
57
66
|
}
|
|
67
|
+
|
|
68
|
+
addSessionAttributesToUser(ctx)
|
|
58
69
|
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { DocumentType } from "../../db/utils"
|
|
2
|
+
import { Plugin } from "@budibase/types"
|
|
3
|
+
import { db as dbCore, context, tenancy } from "@budibase/backend-core"
|
|
4
|
+
import { getComponentLibraryManifest } from "../../utilities/fileSystem"
|
|
5
|
+
|
|
6
|
+
exports.fetchAppComponentDefinitions = async function (ctx: any) {
|
|
7
|
+
try {
|
|
8
|
+
const db = context.getAppDB()
|
|
9
|
+
const app = await db.get(DocumentType.APP_METADATA)
|
|
10
|
+
|
|
11
|
+
let componentManifests = await Promise.all(
|
|
12
|
+
app.componentLibraries.map(async (library: any) => {
|
|
13
|
+
let manifest = await getComponentLibraryManifest(library)
|
|
14
|
+
return {
|
|
15
|
+
manifest,
|
|
16
|
+
library,
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
)
|
|
20
|
+
const definitions: { [key: string]: any } = {}
|
|
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
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Add custom components
|
|
36
|
+
const globalDB = tenancy.getGlobalDB()
|
|
37
|
+
const response = await globalDB.allDocs(
|
|
38
|
+
dbCore.getPluginParams(null, {
|
|
39
|
+
include_docs: true,
|
|
40
|
+
})
|
|
41
|
+
)
|
|
42
|
+
response.rows
|
|
43
|
+
.map((row: any) => row.doc)
|
|
44
|
+
.filter((plugin: Plugin) => plugin.schema.type === "component")
|
|
45
|
+
.forEach((plugin: Plugin) => {
|
|
46
|
+
const fullComponentName = `plugin/${plugin.name}`
|
|
47
|
+
definitions[fullComponentName] = {
|
|
48
|
+
component: fullComponentName,
|
|
49
|
+
...plugin.schema.schema,
|
|
50
|
+
}
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
ctx.body = definitions
|
|
54
|
+
} catch (err) {
|
|
55
|
+
console.error(`component-definitions=failed`, err)
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -7,7 +7,7 @@ const {
|
|
|
7
7
|
getTableParams,
|
|
8
8
|
} = require("../../db/utils")
|
|
9
9
|
const { BuildSchemaErrors, InvalidColumns } = require("../../constants")
|
|
10
|
-
const {
|
|
10
|
+
const { getIntegration } = require("../../integrations")
|
|
11
11
|
const { getDatasourceAndQuery } = require("./row/utils")
|
|
12
12
|
const { invalidateDynamicVariables } = require("../../threads/utils")
|
|
13
13
|
const { getAppDB } = require("@budibase/backend-core/context")
|
|
@@ -50,9 +50,23 @@ exports.fetch = async function (ctx) {
|
|
|
50
50
|
exports.buildSchemaFromDb = async function (ctx) {
|
|
51
51
|
const db = getAppDB()
|
|
52
52
|
const datasource = await db.get(ctx.params.datasourceId)
|
|
53
|
+
const tablesFilter = ctx.request.body.tablesFilter
|
|
53
54
|
|
|
54
|
-
|
|
55
|
-
|
|
55
|
+
let { tables, error } = await buildSchemaHelper(datasource)
|
|
56
|
+
if (tablesFilter) {
|
|
57
|
+
if (!datasource.entities) {
|
|
58
|
+
datasource.entities = {}
|
|
59
|
+
}
|
|
60
|
+
for (let key in tables) {
|
|
61
|
+
if (
|
|
62
|
+
tablesFilter.some(filter => filter.toLowerCase() === key.toLowerCase())
|
|
63
|
+
) {
|
|
64
|
+
datasource.entities[key] = tables[key]
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
} else {
|
|
68
|
+
datasource.entities = tables
|
|
69
|
+
}
|
|
56
70
|
|
|
57
71
|
const dbResp = await db.put(datasource)
|
|
58
72
|
datasource._rev = dbResp.rev
|
|
@@ -114,7 +128,7 @@ exports.update = async function (ctx) {
|
|
|
114
128
|
|
|
115
129
|
// Drain connection pools when configuration is changed
|
|
116
130
|
if (datasource.source) {
|
|
117
|
-
const source =
|
|
131
|
+
const source = await getIntegration(datasource.source)
|
|
118
132
|
if (source && source.pool) {
|
|
119
133
|
await source.pool.end()
|
|
120
134
|
}
|
|
@@ -149,7 +163,7 @@ exports.save = async function (ctx) {
|
|
|
149
163
|
|
|
150
164
|
// Drain connection pools when configuration is changed
|
|
151
165
|
if (datasource.source) {
|
|
152
|
-
const source =
|
|
166
|
+
const source = await getIntegration(datasource.source)
|
|
153
167
|
if (source && source.pool) {
|
|
154
168
|
await source.pool.end()
|
|
155
169
|
}
|
|
@@ -218,15 +232,14 @@ function updateError(error, newError, tables) {
|
|
|
218
232
|
}
|
|
219
233
|
|
|
220
234
|
const buildSchemaHelper = async datasource => {
|
|
221
|
-
const Connector =
|
|
235
|
+
const Connector = await getIntegration(datasource.source)
|
|
222
236
|
|
|
223
237
|
// Connect to the DB and build the schema
|
|
224
238
|
const connector = new Connector(datasource.config)
|
|
225
239
|
await connector.buildSchema(datasource._id, datasource.entities)
|
|
226
|
-
datasource.entities = connector.tables
|
|
227
240
|
|
|
228
241
|
// make sure they all have a display name selected
|
|
229
|
-
for (let entity of Object.values(datasource.entities)) {
|
|
242
|
+
for (let entity of Object.values(datasource.entities ?? {})) {
|
|
230
243
|
if (entity.primaryDisplay) {
|
|
231
244
|
continue
|
|
232
245
|
}
|
|
@@ -206,12 +206,7 @@ const _deployApp = async function (ctx: any) {
|
|
|
206
206
|
|
|
207
207
|
console.log("Deploying app...")
|
|
208
208
|
|
|
209
|
-
let app
|
|
210
|
-
if (await isFirstDeploy()) {
|
|
211
|
-
app = await quotas.addPublishedApp(() => deployApp(deployment))
|
|
212
|
-
} else {
|
|
213
|
-
app = await deployApp(deployment)
|
|
214
|
-
}
|
|
209
|
+
let app = await deployApp(deployment)
|
|
215
210
|
|
|
216
211
|
await events.app.published(app)
|
|
217
212
|
ctx.body = deployment
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
const {
|
|
2
|
-
const { definitions } = require("../../integrations")
|
|
1
|
+
const { getDefinitions } = require("../../integrations")
|
|
3
2
|
const { SourceName } = require("@budibase/types")
|
|
4
3
|
const googlesheets = require("../../integrations/googlesheets")
|
|
5
4
|
const { featureFlags } = require("@budibase/backend-core")
|
|
6
5
|
|
|
7
6
|
exports.fetch = async function (ctx) {
|
|
8
7
|
ctx.status = 200
|
|
9
|
-
const defs =
|
|
8
|
+
const defs = await getDefinitions()
|
|
10
9
|
|
|
11
10
|
// for google sheets integration google verification
|
|
12
11
|
if (featureFlags.isEnabled(featureFlags.FeatureFlag.GOOGLE_SHEETS)) {
|
|
@@ -17,6 +16,7 @@ exports.fetch = async function (ctx) {
|
|
|
17
16
|
}
|
|
18
17
|
|
|
19
18
|
exports.find = async function (ctx) {
|
|
19
|
+
const defs = await getDefinitions()
|
|
20
20
|
ctx.status = 200
|
|
21
|
-
ctx.body =
|
|
21
|
+
ctx.body = defs[ctx.params.type]
|
|
22
22
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createTempFolder,
|
|
3
|
+
getPluginMetadata,
|
|
4
|
+
extractTarball,
|
|
5
|
+
} from "../../../utilities/fileSystem"
|
|
6
|
+
|
|
7
|
+
export async function fileUpload(file: { name: string; path: string }) {
|
|
8
|
+
if (!file.name.endsWith(".tar.gz")) {
|
|
9
|
+
throw new Error("Plugin must be compressed into a gzipped tarball.")
|
|
10
|
+
}
|
|
11
|
+
const path = createTempFolder(file.name.split(".tar.gz")[0])
|
|
12
|
+
await extractTarball(file.path, path)
|
|
13
|
+
|
|
14
|
+
return await getPluginMetadata(path)
|
|
15
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { getPluginMetadata } from "../../../utilities/fileSystem"
|
|
2
|
+
import fetch from "node-fetch"
|
|
3
|
+
import { downloadUnzipTarball } from "./utils"
|
|
4
|
+
|
|
5
|
+
export async function request(
|
|
6
|
+
url: string,
|
|
7
|
+
headers: { [key: string]: string },
|
|
8
|
+
err: string
|
|
9
|
+
) {
|
|
10
|
+
const response = await fetch(url, { headers })
|
|
11
|
+
if (response.status >= 300) {
|
|
12
|
+
const respErr = await response.text()
|
|
13
|
+
throw new Error(`Error: ${err} - ${respErr}`)
|
|
14
|
+
}
|
|
15
|
+
return response.json()
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export async function githubUpload(url: string, name = "", token = "") {
|
|
19
|
+
let githubUrl = url
|
|
20
|
+
|
|
21
|
+
if (!githubUrl.includes("https://github.com/")) {
|
|
22
|
+
throw new Error("The plugin origin must be from Github")
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (url.includes(".git")) {
|
|
26
|
+
githubUrl = url.replace(".git", "")
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const githubApiUrl = githubUrl.replace(
|
|
30
|
+
"https://github.com/",
|
|
31
|
+
"https://api.github.com/repos/"
|
|
32
|
+
)
|
|
33
|
+
const headers: any = token ? { Authorization: `Bearer ${token}` } : {}
|
|
34
|
+
const pluginDetails = await request(
|
|
35
|
+
githubApiUrl,
|
|
36
|
+
headers,
|
|
37
|
+
"Repository not found"
|
|
38
|
+
)
|
|
39
|
+
const pluginName = pluginDetails.name || name
|
|
40
|
+
const pluginLatestReleaseUrl = pluginDetails?.["releases_url"]
|
|
41
|
+
? pluginDetails?.["releases_url"].replace("{/id}", "/latest")
|
|
42
|
+
: undefined
|
|
43
|
+
if (!pluginLatestReleaseUrl) {
|
|
44
|
+
throw new Error("Github release not found")
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const pluginReleaseDetails = await request(
|
|
48
|
+
pluginLatestReleaseUrl,
|
|
49
|
+
headers,
|
|
50
|
+
"Github latest release not found"
|
|
51
|
+
)
|
|
52
|
+
const pluginReleaseTarballAsset = pluginReleaseDetails?.assets?.find(
|
|
53
|
+
(x: any) => x?.["content_type"] === "application/gzip"
|
|
54
|
+
)
|
|
55
|
+
const pluginLastReleaseTarballUrl =
|
|
56
|
+
pluginReleaseTarballAsset?.["browser_download_url"]
|
|
57
|
+
if (!pluginLastReleaseTarballUrl) {
|
|
58
|
+
throw new Error("Github latest release url not found")
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
try {
|
|
62
|
+
const path = await downloadUnzipTarball(
|
|
63
|
+
pluginLastReleaseTarballUrl,
|
|
64
|
+
pluginName,
|
|
65
|
+
headers
|
|
66
|
+
)
|
|
67
|
+
return await getPluginMetadata(path)
|
|
68
|
+
} catch (err: any) {
|
|
69
|
+
let errMsg = err?.message || err
|
|
70
|
+
if (errMsg === "unexpected response Not Found") {
|
|
71
|
+
errMsg = "Github release tarball not found"
|
|
72
|
+
}
|
|
73
|
+
throw new Error(errMsg)
|
|
74
|
+
}
|
|
75
|
+
}
|