@budibase/server 1.3.15-alpha.3 → 1.3.17
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.8f5f192a.js +876 -0
- package/builder/assets/{index.ecdac070.css → index.a70e216a.css} +2 -2
- package/builder/assets/vendor.5e1fe644.css +1 -0
- package/builder/assets/vendor.67dbd8fa.js +248 -0
- package/builder/index.html +4 -2
- package/coverage/clover.xml +254 -296
- package/coverage/coverage-final.json +17 -17
- package/coverage/lcov-report/api/controllers/apikeys.js.html +1 -1
- package/coverage/lcov-report/api/controllers/auth.js.html +1 -1
- 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/component.js.html +13 -82
- package/coverage/lcov-report/api/controllers/datasource.js.html +20 -20
- package/coverage/lcov-report/api/controllers/dev.js.html +1 -1
- package/coverage/lcov-report/api/controllers/index.html +30 -30
- 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 +1 -1
- 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/screen.js.html +12 -207
- 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 +12 -12
- 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 +1 -1
- 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 +1 -1
- package/coverage/lcov-report/api/routes/utils/validators.js.html +1 -1
- 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 +18 -18
- 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 +20 -56
- package/coverage/lcov-report/events/AutomationEmitter.js.html +1 -1
- 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 +28 -28
- 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 +33 -33
- package/coverage/lcov-report/middleware/index.html +1 -1
- 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 +1 -1
- 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 +1 -1
- package/coverage/lcov.info +445 -533
- package/dist/api/controllers/application.js +4 -5
- package/dist/api/controllers/component.js +1 -18
- package/dist/api/controllers/datasource.js +4 -4
- package/dist/api/controllers/integration.js +4 -4
- package/dist/api/controllers/row/ExternalRequest.js +3 -1
- package/dist/api/controllers/screen.js +2 -52
- package/dist/api/controllers/static/index.js +0 -1
- package/dist/api/controllers/static/templates/BudibaseApp.svelte +0 -10
- package/dist/api/controllers/static/templates/preview.hbs +1 -5
- package/dist/api/routes/index.js +0 -2
- package/dist/app.js +0 -11
- package/dist/db/utils.js +1 -10
- package/dist/environment.js +2 -3
- package/dist/integrations/airtable.js +129 -126
- package/dist/integrations/arangodb.js +89 -86
- package/dist/integrations/base/query.js +2 -2
- package/dist/integrations/base/sqlTable.js +1 -3
- package/dist/integrations/couchdb.js +83 -80
- package/dist/integrations/dynamodb.js +164 -161
- package/dist/integrations/elasticsearch.js +138 -135
- package/dist/integrations/firebase.js +157 -154
- package/dist/integrations/googlesheets.js +327 -323
- package/dist/integrations/index.js +51 -93
- package/dist/integrations/microsoftSqlServer.js +243 -240
- package/dist/integrations/mongodb.js +242 -239
- package/dist/integrations/mysql.js +219 -215
- package/dist/integrations/oracle.js +322 -318
- package/dist/integrations/postgres.js +265 -262
- package/dist/integrations/redis.js +139 -134
- package/dist/integrations/rest.js +292 -289
- package/dist/integrations/s3.js +64 -61
- package/dist/integrations/snowflake.js +86 -83
- package/dist/package.json +6 -9
- package/dist/threads/query.js +2 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utilities/fileSystem/index.js +11 -111
- package/package.json +7 -10
- package/scripts/dev/manage.js +0 -1
- package/src/api/controllers/application.ts +1 -1
- package/src/api/controllers/component.js +2 -25
- package/src/api/controllers/datasource.js +4 -4
- package/src/api/controllers/integration.js +4 -4
- package/src/api/controllers/row/ExternalRequest.ts +4 -1
- package/src/api/controllers/screen.js +1 -66
- package/src/api/controllers/static/index.ts +0 -1
- package/src/api/controllers/static/templates/BudibaseApp.svelte +0 -10
- package/src/api/controllers/static/templates/preview.hbs +1 -5
- package/src/api/routes/index.ts +0 -2
- package/src/api/routes/tests/query.spec.js +25 -8
- package/src/app.ts +0 -14
- package/src/db/utils.js +0 -12
- package/src/environment.js +2 -3
- package/src/integrations/airtable.ts +118 -116
- package/src/integrations/arangodb.ts +89 -87
- package/src/integrations/base/query.ts +2 -2
- package/src/integrations/base/sqlTable.ts +1 -3
- package/src/integrations/couchdb.ts +89 -83
- package/src/integrations/dynamodb.ts +175 -173
- package/src/integrations/elasticsearch.ts +122 -120
- package/src/integrations/firebase.ts +159 -157
- package/src/integrations/googlesheets.ts +338 -328
- package/src/integrations/index.ts +21 -59
- package/src/integrations/microsoftSqlServer.ts +251 -249
- package/src/integrations/mongodb.ts +258 -261
- package/src/integrations/mysql.ts +234 -229
- package/src/integrations/oracle.ts +380 -373
- package/src/integrations/postgres.ts +268 -264
- package/src/integrations/redis.ts +132 -128
- package/src/integrations/rest.ts +329 -324
- package/src/integrations/s3.ts +71 -68
- package/src/integrations/snowflake.ts +82 -80
- package/src/integrations/tests/{airtable.spec.ts → airtable.spec.js} +18 -21
- package/src/integrations/tests/{arangodb.spec.ts → arangodb.spec.js} +9 -12
- package/src/integrations/tests/{couchdb.spec.ts → couchdb.spec.js} +27 -33
- package/src/integrations/tests/{dynamodb.spec.ts → dynamodb.spec.js} +41 -45
- package/src/integrations/tests/{elasticsearch.spec.ts → elasticsearch.spec.js} +21 -22
- package/src/integrations/tests/{firebase.spec.ts → firebase.spec.js} +28 -33
- package/src/integrations/tests/{microsoftSqlServer.spec.ts → microsoftSqlServer.spec.js} +11 -12
- package/src/integrations/tests/{mongo.spec.ts → mongo.spec.js} +35 -46
- package/src/integrations/tests/{mysql.spec.ts → mysql.spec.js} +15 -17
- package/src/integrations/tests/{oracle.spec.ts → oracle.spec.js} +17 -19
- package/src/integrations/tests/{postgres.spec.ts → postgres.spec.js} +17 -19
- package/src/integrations/tests/{redis.spec.ts → redis.spec.js} +18 -27
- package/src/integrations/tests/{rest.spec.ts → rest.spec.js} +14 -22
- package/src/integrations/tests/{s3.spec.ts → s3.spec.js} +8 -10
- package/src/integrations/tests/{sql.spec.ts → sql.spec.js} +177 -228
- package/src/module.d.ts +0 -2
- package/src/threads/query.ts +2 -2
- package/src/utilities/fileSystem/index.js +9 -130
- package/builder/assets/index.e1d89439.js +0 -995
- package/dist/api/controllers/plugin/file.js +0 -24
- package/dist/api/controllers/plugin/github.js +0 -69
- package/dist/api/controllers/plugin/index.js +0 -192
- package/dist/api/controllers/plugin/npm.js +0 -58
- package/dist/api/controllers/plugin/uploaders.js +0 -11
- package/dist/api/controllers/plugin/url.js +0 -24
- package/dist/api/controllers/plugin/utils.js +0 -26
- package/dist/api/routes/plugin.js +0 -39
- package/dist/watch.js +0 -77
- package/dist/websocket.js +0 -22
- package/src/api/controllers/plugin/file.ts +0 -15
- package/src/api/controllers/plugin/github.ts +0 -75
- package/src/api/controllers/plugin/index.ts +0 -206
- package/src/api/controllers/plugin/npm.ts +0 -56
- package/src/api/controllers/plugin/uploaders.ts +0 -4
- package/src/api/controllers/plugin/url.ts +0 -12
- package/src/api/controllers/plugin/utils.ts +0 -19
- package/src/api/routes/plugin.ts +0 -14
- package/src/watch.ts +0 -38
- package/src/websocket.ts +0 -26
|
@@ -1,206 +0,0 @@
|
|
|
1
|
-
import { ObjectStoreBuckets } from "../../../constants"
|
|
2
|
-
import { loadJSFile } from "../../../utilities/fileSystem"
|
|
3
|
-
import { npmUpload, urlUpload, githubUpload, fileUpload } from "./uploaders"
|
|
4
|
-
import { getGlobalDB } from "@budibase/backend-core/tenancy"
|
|
5
|
-
import { validate } from "@budibase/backend-core/plugins"
|
|
6
|
-
import { generatePluginID, getPluginParams } from "../../../db/utils"
|
|
7
|
-
import {
|
|
8
|
-
uploadDirectory,
|
|
9
|
-
deleteFolder,
|
|
10
|
-
} from "@budibase/backend-core/objectStore"
|
|
11
|
-
import { PluginType, FileType, PluginSource } from "@budibase/types"
|
|
12
|
-
import env from "../../../environment"
|
|
13
|
-
import { ClientAppSocket } from "../../../websocket"
|
|
14
|
-
|
|
15
|
-
export async function getPlugins(type?: PluginType) {
|
|
16
|
-
const db = getGlobalDB()
|
|
17
|
-
const response = await db.allDocs(
|
|
18
|
-
getPluginParams(null, {
|
|
19
|
-
include_docs: true,
|
|
20
|
-
})
|
|
21
|
-
)
|
|
22
|
-
const plugins = response.rows.map((row: any) => row.doc)
|
|
23
|
-
if (type) {
|
|
24
|
-
return plugins.filter((plugin: any) => plugin.schema?.type === type)
|
|
25
|
-
} else {
|
|
26
|
-
return plugins
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
export async function upload(ctx: any) {
|
|
31
|
-
const plugins: FileType[] =
|
|
32
|
-
ctx.request.files.file.length > 1
|
|
33
|
-
? Array.from(ctx.request.files.file)
|
|
34
|
-
: [ctx.request.files.file]
|
|
35
|
-
try {
|
|
36
|
-
let docs = []
|
|
37
|
-
// can do single or multiple plugins
|
|
38
|
-
for (let plugin of plugins) {
|
|
39
|
-
const doc = await processPlugin(plugin, PluginSource.FILE)
|
|
40
|
-
docs.push(doc)
|
|
41
|
-
}
|
|
42
|
-
ctx.body = {
|
|
43
|
-
message: "Plugin(s) uploaded successfully",
|
|
44
|
-
plugins: docs,
|
|
45
|
-
}
|
|
46
|
-
} catch (err: any) {
|
|
47
|
-
const errMsg = err?.message ? err?.message : err
|
|
48
|
-
|
|
49
|
-
ctx.throw(400, `Failed to import plugin: ${errMsg}`)
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export async function create(ctx: any) {
|
|
54
|
-
const { source, url, headers, githubToken } = ctx.request.body
|
|
55
|
-
|
|
56
|
-
if (!env.SELF_HOSTED) {
|
|
57
|
-
ctx.throw(400, "Plugins not supported outside of self-host.")
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
try {
|
|
61
|
-
let metadata
|
|
62
|
-
let directory
|
|
63
|
-
// Generating random name as a backup and needed for url
|
|
64
|
-
let name = "PLUGIN_" + Math.floor(100000 + Math.random() * 900000)
|
|
65
|
-
|
|
66
|
-
switch (source) {
|
|
67
|
-
case PluginSource.NPM:
|
|
68
|
-
const { metadata: metadataNpm, directory: directoryNpm } =
|
|
69
|
-
await npmUpload(url, name)
|
|
70
|
-
metadata = metadataNpm
|
|
71
|
-
directory = directoryNpm
|
|
72
|
-
break
|
|
73
|
-
case PluginSource.GITHUB:
|
|
74
|
-
const { metadata: metadataGithub, directory: directoryGithub } =
|
|
75
|
-
await githubUpload(url, name, githubToken)
|
|
76
|
-
metadata = metadataGithub
|
|
77
|
-
directory = directoryGithub
|
|
78
|
-
break
|
|
79
|
-
case PluginSource.URL:
|
|
80
|
-
const headersObj = headers || {}
|
|
81
|
-
const { metadata: metadataUrl, directory: directoryUrl } =
|
|
82
|
-
await urlUpload(url, name, headersObj)
|
|
83
|
-
metadata = metadataUrl
|
|
84
|
-
directory = directoryUrl
|
|
85
|
-
break
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
validate(metadata?.schema)
|
|
89
|
-
|
|
90
|
-
const doc = await storePlugin(metadata, directory, source)
|
|
91
|
-
|
|
92
|
-
ctx.body = {
|
|
93
|
-
message: "Plugin uploaded successfully",
|
|
94
|
-
plugins: [doc],
|
|
95
|
-
}
|
|
96
|
-
} catch (err: any) {
|
|
97
|
-
const errMsg = err?.message ? err?.message : err
|
|
98
|
-
|
|
99
|
-
ctx.throw(400, `Failed to import plugin: ${errMsg}`)
|
|
100
|
-
}
|
|
101
|
-
ctx.status = 200
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export async function fetch(ctx: any) {
|
|
105
|
-
ctx.body = await getPlugins()
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
export async function destroy(ctx: any) {
|
|
109
|
-
const db = getGlobalDB()
|
|
110
|
-
const { pluginId } = ctx.params
|
|
111
|
-
|
|
112
|
-
try {
|
|
113
|
-
const plugin = await db.get(pluginId)
|
|
114
|
-
const bucketPath = `${plugin.name}/`
|
|
115
|
-
await deleteFolder(ObjectStoreBuckets.PLUGINS, bucketPath)
|
|
116
|
-
|
|
117
|
-
await db.remove(pluginId, plugin._rev)
|
|
118
|
-
} catch (err: any) {
|
|
119
|
-
const errMsg = err?.message ? err?.message : err
|
|
120
|
-
|
|
121
|
-
ctx.throw(400, `Failed to delete plugin: ${errMsg}`)
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
ctx.message = `Plugin ${ctx.params.pluginId} deleted.`
|
|
125
|
-
ctx.status = 200
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
export async function storePlugin(
|
|
129
|
-
metadata: any,
|
|
130
|
-
directory: any,
|
|
131
|
-
source?: string
|
|
132
|
-
) {
|
|
133
|
-
const db = getGlobalDB()
|
|
134
|
-
const version = metadata.package.version,
|
|
135
|
-
name = metadata.package.name,
|
|
136
|
-
description = metadata.package.description,
|
|
137
|
-
hash = metadata.schema.hash
|
|
138
|
-
|
|
139
|
-
// first open the tarball into tmp directory
|
|
140
|
-
const bucketPath = `${name}/`
|
|
141
|
-
const files = await uploadDirectory(
|
|
142
|
-
ObjectStoreBuckets.PLUGINS,
|
|
143
|
-
directory,
|
|
144
|
-
bucketPath
|
|
145
|
-
)
|
|
146
|
-
const jsFile = files.find((file: any) => file.name.endsWith(".js"))
|
|
147
|
-
if (!jsFile) {
|
|
148
|
-
throw new Error(`Plugin missing .js file.`)
|
|
149
|
-
}
|
|
150
|
-
// validate the JS for a datasource
|
|
151
|
-
if (metadata.schema.type === PluginType.DATASOURCE) {
|
|
152
|
-
const js = loadJSFile(directory, jsFile.name)
|
|
153
|
-
// TODO: this isn't safe - but we need full node environment
|
|
154
|
-
// in future we should do this in a thread for safety
|
|
155
|
-
try {
|
|
156
|
-
eval(js)
|
|
157
|
-
} catch (err: any) {
|
|
158
|
-
const message = err?.message ? err.message : JSON.stringify(err)
|
|
159
|
-
throw new Error(`JS invalid: ${message}`)
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
const jsFileName = jsFile.name
|
|
163
|
-
const pluginId = generatePluginID(name)
|
|
164
|
-
|
|
165
|
-
// overwrite existing docs entirely if they exist
|
|
166
|
-
let rev
|
|
167
|
-
try {
|
|
168
|
-
const existing = await db.get(pluginId)
|
|
169
|
-
rev = existing._rev
|
|
170
|
-
} catch (err) {
|
|
171
|
-
rev = undefined
|
|
172
|
-
}
|
|
173
|
-
let doc = {
|
|
174
|
-
_id: pluginId,
|
|
175
|
-
_rev: rev,
|
|
176
|
-
...metadata,
|
|
177
|
-
name,
|
|
178
|
-
version,
|
|
179
|
-
hash,
|
|
180
|
-
description,
|
|
181
|
-
jsUrl: `${bucketPath}${jsFileName}`,
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
if (source) {
|
|
185
|
-
doc = {
|
|
186
|
-
...doc,
|
|
187
|
-
source,
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
const response = await db.put(doc)
|
|
192
|
-
ClientAppSocket.emit("plugin-update", { name, hash })
|
|
193
|
-
return {
|
|
194
|
-
...doc,
|
|
195
|
-
_rev: response.rev,
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
export async function processPlugin(plugin: FileType, source?: string) {
|
|
200
|
-
if (!env.SELF_HOSTED) {
|
|
201
|
-
throw new Error("Plugins not supported outside of self-host.")
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
const { metadata, directory } = await fileUpload(plugin)
|
|
205
|
-
return await storePlugin(metadata, directory, source)
|
|
206
|
-
}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
getPluginMetadata,
|
|
3
|
-
findFileRec,
|
|
4
|
-
extractTarball,
|
|
5
|
-
deleteFolderFileSystem,
|
|
6
|
-
} from "../../../utilities/fileSystem"
|
|
7
|
-
import fetch from "node-fetch"
|
|
8
|
-
import { join } from "path"
|
|
9
|
-
import { downloadUnzipTarball } from "./utils"
|
|
10
|
-
|
|
11
|
-
export async function npmUpload(url: string, name: string, headers = {}) {
|
|
12
|
-
let npmTarballUrl = url
|
|
13
|
-
let pluginName = name
|
|
14
|
-
|
|
15
|
-
if (
|
|
16
|
-
!npmTarballUrl.includes("https://www.npmjs.com") &&
|
|
17
|
-
!npmTarballUrl.includes("https://registry.npmjs.org")
|
|
18
|
-
) {
|
|
19
|
-
throw new Error("The plugin origin must be from NPM")
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
if (!npmTarballUrl.includes(".tgz")) {
|
|
23
|
-
const npmPackageURl = url.replace(
|
|
24
|
-
"https://www.npmjs.com/package/",
|
|
25
|
-
"https://registry.npmjs.org/"
|
|
26
|
-
)
|
|
27
|
-
const response = await fetch(npmPackageURl)
|
|
28
|
-
if (response.status !== 200) {
|
|
29
|
-
throw new Error("NPM Package not found")
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
let npmDetails = await response.json()
|
|
33
|
-
pluginName = npmDetails.name
|
|
34
|
-
const npmVersion = npmDetails["dist-tags"].latest
|
|
35
|
-
npmTarballUrl = npmDetails?.versions?.[npmVersion]?.dist?.tarball
|
|
36
|
-
|
|
37
|
-
if (!npmTarballUrl) {
|
|
38
|
-
throw new Error("NPM tarball url not found")
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const path = await downloadUnzipTarball(npmTarballUrl, pluginName, headers)
|
|
43
|
-
const tarballPluginFile = findFileRec(path, ".tar.gz")
|
|
44
|
-
if (!tarballPluginFile) {
|
|
45
|
-
throw new Error("Tarball plugin file not found")
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
try {
|
|
49
|
-
await extractTarball(tarballPluginFile, path)
|
|
50
|
-
deleteFolderFileSystem(join(path, "package"))
|
|
51
|
-
} catch (err: any) {
|
|
52
|
-
throw new Error(err)
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return await getPluginMetadata(path)
|
|
56
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { downloadUnzipTarball } from "./utils"
|
|
2
|
-
import { getPluginMetadata } from "../../../utilities/fileSystem"
|
|
3
|
-
|
|
4
|
-
export async function urlUpload(url: string, name = "", headers = {}) {
|
|
5
|
-
if (!url.includes(".tar.gz")) {
|
|
6
|
-
throw new Error("Plugin must be compressed into a gzipped tarball.")
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
const path = await downloadUnzipTarball(url, name, headers)
|
|
10
|
-
|
|
11
|
-
return await getPluginMetadata(path)
|
|
12
|
-
}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createTempFolder,
|
|
3
|
-
downloadTarballDirect,
|
|
4
|
-
} from "../../../utilities/fileSystem"
|
|
5
|
-
|
|
6
|
-
export async function downloadUnzipTarball(
|
|
7
|
-
url: string,
|
|
8
|
-
name: string,
|
|
9
|
-
headers = {}
|
|
10
|
-
) {
|
|
11
|
-
try {
|
|
12
|
-
const path = createTempFolder(name)
|
|
13
|
-
await downloadTarballDirect(url, path, headers)
|
|
14
|
-
|
|
15
|
-
return path
|
|
16
|
-
} catch (e: any) {
|
|
17
|
-
throw new Error(e.message)
|
|
18
|
-
}
|
|
19
|
-
}
|
package/src/api/routes/plugin.ts
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import Router from "@koa/router"
|
|
2
|
-
import * as controller from "../controllers/plugin"
|
|
3
|
-
import authorized from "../../middleware/authorized"
|
|
4
|
-
import { BUILDER } from "@budibase/backend-core/permissions"
|
|
5
|
-
|
|
6
|
-
const router = new Router()
|
|
7
|
-
|
|
8
|
-
router
|
|
9
|
-
.post("/api/plugin/upload", authorized(BUILDER), controller.upload)
|
|
10
|
-
.post("/api/plugin", authorized(BUILDER), controller.create)
|
|
11
|
-
.get("/api/plugin", authorized(BUILDER), controller.fetch)
|
|
12
|
-
.delete("/api/plugin/:pluginId", authorized(BUILDER), controller.destroy)
|
|
13
|
-
|
|
14
|
-
export default router
|
package/src/watch.ts
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import path from "path"
|
|
2
|
-
import * as env from "./environment"
|
|
3
|
-
import chokidar from "chokidar"
|
|
4
|
-
import fs from "fs"
|
|
5
|
-
import { tenancy } from "@budibase/backend-core"
|
|
6
|
-
import { DEFAULT_TENANT_ID } from "@budibase/backend-core/constants"
|
|
7
|
-
import { processPlugin } from "./api/controllers/plugin"
|
|
8
|
-
|
|
9
|
-
export function watch() {
|
|
10
|
-
const watchPath = path.join(env.PLUGINS_DIR, "./**/*.tar.gz")
|
|
11
|
-
chokidar
|
|
12
|
-
.watch(watchPath, {
|
|
13
|
-
ignored: "**/node_modules",
|
|
14
|
-
awaitWriteFinish: {
|
|
15
|
-
pollInterval: 100,
|
|
16
|
-
stabilityThreshold: 250,
|
|
17
|
-
},
|
|
18
|
-
usePolling: true,
|
|
19
|
-
interval: 250,
|
|
20
|
-
})
|
|
21
|
-
.on("all", async (event: string, path: string) => {
|
|
22
|
-
// Sanity checks
|
|
23
|
-
if (!path?.endsWith(".tar.gz") || !fs.existsSync(path)) {
|
|
24
|
-
return
|
|
25
|
-
}
|
|
26
|
-
await tenancy.doInTenant(DEFAULT_TENANT_ID, async () => {
|
|
27
|
-
try {
|
|
28
|
-
const split = path.split("/")
|
|
29
|
-
const name = split[split.length - 1]
|
|
30
|
-
console.log("Importing plugin:", path)
|
|
31
|
-
await processPlugin({ name, path })
|
|
32
|
-
} catch (err: any) {
|
|
33
|
-
const message = err?.message ? err?.message : err
|
|
34
|
-
console.error("Failed to import plugin:", message)
|
|
35
|
-
}
|
|
36
|
-
})
|
|
37
|
-
})
|
|
38
|
-
}
|
package/src/websocket.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { Server } from "socket.io"
|
|
2
|
-
import http from "http"
|
|
3
|
-
|
|
4
|
-
class Websocket {
|
|
5
|
-
socketServer: Server
|
|
6
|
-
|
|
7
|
-
constructor(server: http.Server, path: string) {
|
|
8
|
-
this.socketServer = new Server(server, {
|
|
9
|
-
path,
|
|
10
|
-
})
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
// Emit an event to all sockets
|
|
14
|
-
emit(event: string, payload: any) {
|
|
15
|
-
this.socketServer.sockets.emit(event, payload)
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Likely to be more socket instances in future
|
|
20
|
-
let ClientAppSocket: Websocket
|
|
21
|
-
|
|
22
|
-
export const initialise = (server: http.Server) => {
|
|
23
|
-
ClientAppSocket = new Websocket(server, "/socket/client")
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export { ClientAppSocket }
|