@budibase/server 1.3.13 → 1.3.15-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.e50bda9f.css → index.ecdac070.css} +2 -2
- package/builder/assets/index.ed9ae6a1.js +995 -0
- package/builder/index.html +2 -4
- package/coverage/clover.xml +377 -313
- package/coverage/coverage-final.json +22 -22
- 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 +8 -5
- package/coverage/lcov-report/api/controllers/cloud.js.html +1 -1
- package/coverage/lcov-report/api/controllers/component.js.html +82 -13
- 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 +32 -32
- 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 +204 -12
- 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 +24 -24
- package/coverage/lcov-report/automations/index.js.html +18 -9
- 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 +126 -24
- 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 +56 -20
- 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 +48 -48
- 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 +19 -19
- package/coverage/lcov-report/utilities/index.js.html +66 -42
- 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 +5 -5
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +1 -1
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +4 -4
- 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 +6 -3
- 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 +692 -564
- package/dist/api/controllers/application.js +6 -9
- package/dist/api/controllers/backup.js +2 -1
- package/dist/api/controllers/component.js +18 -1
- package/dist/api/controllers/datasource.js +4 -4
- package/dist/api/controllers/deploy/index.js +17 -2
- package/dist/api/controllers/integration.js +4 -4
- package/dist/api/controllers/plugin/file.js +24 -0
- package/dist/api/controllers/plugin/github.js +69 -0
- package/dist/api/controllers/plugin/index.js +189 -0
- package/dist/api/controllers/plugin/npm.js +58 -0
- package/dist/api/controllers/plugin/uploaders.js +11 -0
- package/dist/api/controllers/plugin/url.js +24 -0
- package/dist/api/controllers/plugin/utils.js +26 -0
- package/dist/api/controllers/row/ExternalRequest.js +1 -1
- package/dist/api/controllers/screen.js +51 -2
- 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 +3 -1
- package/dist/api/routes/index.js +2 -0
- package/dist/api/routes/plugin.js +39 -0
- package/dist/app.js +9 -0
- package/dist/automations/index.js +10 -5
- package/dist/automations/triggers.js +39 -5
- package/dist/automations/utils.js +16 -7
- package/dist/db/utils.js +10 -1
- 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/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 +93 -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 +293 -281
- package/dist/integrations/s3.js +61 -64
- package/dist/integrations/snowflake.js +83 -86
- package/dist/package.json +8 -6
- package/dist/threads/automation.js +6 -0
- package/dist/threads/query.js +2 -2
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utilities/fileSystem/index.js +116 -7
- package/dist/utilities/index.js +8 -0
- package/dist/utilities/rowProcessor/utils.js +1 -1
- package/dist/utilities/usageQuota/rows.js +2 -1
- package/dist/watch.js +77 -0
- package/package.json +9 -7
- package/scripts/dev/manage.js +1 -0
- package/src/api/controllers/application.ts +2 -6
- package/src/api/controllers/backup.js +2 -1
- package/src/api/controllers/component.js +25 -2
- package/src/api/controllers/datasource.js +4 -4
- package/src/api/controllers/deploy/index.ts +17 -4
- 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 +202 -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/row/ExternalRequest.ts +1 -1
- package/src/api/controllers/screen.js +65 -1
- package/src/api/controllers/static/index.ts +1 -0
- package/src/api/controllers/static/templates/BudibaseApp.svelte +10 -0
- package/src/api/controllers/static/templates/preview.hbs +3 -1
- package/src/api/routes/index.ts +2 -0
- package/src/api/routes/plugin.ts +14 -0
- package/src/api/routes/tests/query.spec.js +11 -28
- package/src/app.ts +12 -0
- package/src/automations/index.js +6 -3
- package/src/automations/triggers.js +44 -10
- package/src/automations/utils.ts +21 -9
- package/src/db/utils.js +12 -0
- package/src/definitions/datasource.ts +1 -0
- 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/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 +59 -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 +325 -317
- 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} +57 -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/module.d.ts +2 -0
- package/src/threads/automation.ts +6 -0
- package/src/threads/query.ts +2 -2
- package/src/utilities/fileSystem/index.js +135 -6
- package/src/utilities/index.js +8 -0
- package/src/utilities/rowProcessor/utils.js +1 -1
- package/src/utilities/usageQuota/rows.js +2 -1
- package/src/watch.ts +38 -0
- package/builder/assets/index.fb22f106.js +0 -875
- package/builder/assets/vendor.5e1fe644.css +0 -1
- package/builder/assets/vendor.67dbd8fa.js +0 -248
|
@@ -15,9 +15,11 @@ const {
|
|
|
15
15
|
streamUpload,
|
|
16
16
|
deleteFolder,
|
|
17
17
|
downloadTarball,
|
|
18
|
+
downloadTarballDirect,
|
|
18
19
|
deleteFiles,
|
|
19
20
|
} = require("./utilities")
|
|
20
21
|
const { updateClientLibrary } = require("./clientLibrary")
|
|
22
|
+
const { checkSlashesInUrl } = require("../")
|
|
21
23
|
const env = require("../../environment")
|
|
22
24
|
const {
|
|
23
25
|
USER_METDATA_PREFIX,
|
|
@@ -26,9 +28,12 @@ const {
|
|
|
26
28
|
} = require("../../db/utils")
|
|
27
29
|
const MemoryStream = require("memorystream")
|
|
28
30
|
const { getAppId } = require("@budibase/backend-core/context")
|
|
31
|
+
const tar = require("tar")
|
|
32
|
+
const fetch = require("node-fetch")
|
|
29
33
|
|
|
30
34
|
const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..")
|
|
31
35
|
const NODE_MODULES_PATH = join(TOP_LEVEL_PATH, "node_modules")
|
|
36
|
+
const DATASOURCE_PATH = join(budibaseTempDir(), "datasource")
|
|
32
37
|
|
|
33
38
|
/**
|
|
34
39
|
* The single stack system (Cloud and Builder) should not make use of the file system where possible,
|
|
@@ -99,6 +104,13 @@ exports.loadHandlebarsFile = path => {
|
|
|
99
104
|
return fs.readFileSync(path, "utf8")
|
|
100
105
|
}
|
|
101
106
|
|
|
107
|
+
/**
|
|
108
|
+
* Same as above just with a different name.
|
|
109
|
+
*/
|
|
110
|
+
exports.loadJSFile = (directory, name) => {
|
|
111
|
+
return fs.readFileSync(join(directory, name), "utf8")
|
|
112
|
+
}
|
|
113
|
+
|
|
102
114
|
/**
|
|
103
115
|
* When return a file from the API need to write the file to the system temporarily so we
|
|
104
116
|
* can create a read stream to send.
|
|
@@ -125,13 +137,13 @@ exports.defineFilter = excludeRows => {
|
|
|
125
137
|
* data or user relationships.
|
|
126
138
|
* @param {string} appId The app to backup
|
|
127
139
|
* @param {object} config Config to send to export DB
|
|
128
|
-
* @param {boolean}
|
|
140
|
+
* @param {boolean} excludeRows Flag to state whether the export should include data.
|
|
129
141
|
* @returns {*} either a string or a stream of the backup
|
|
130
142
|
*/
|
|
131
|
-
const backupAppData = async (appId, config,
|
|
143
|
+
const backupAppData = async (appId, config, excludeRows) => {
|
|
132
144
|
return await exports.exportDB(appId, {
|
|
133
145
|
...config,
|
|
134
|
-
filter: exports.defineFilter(
|
|
146
|
+
filter: exports.defineFilter(excludeRows),
|
|
135
147
|
})
|
|
136
148
|
}
|
|
137
149
|
|
|
@@ -148,11 +160,11 @@ exports.performBackup = async (appId, backupName) => {
|
|
|
148
160
|
/**
|
|
149
161
|
* Streams a backup of the database state for an app
|
|
150
162
|
* @param {string} appId The ID of the app which is to be backed up.
|
|
151
|
-
* @param {boolean}
|
|
163
|
+
* @param {boolean} excludeRows Flag to state whether the export should include data.
|
|
152
164
|
* @returns {*} a readable stream of the backup which is written in real time
|
|
153
165
|
*/
|
|
154
|
-
exports.streamBackup = async (appId,
|
|
155
|
-
return await backupAppData(appId, { stream: true },
|
|
166
|
+
exports.streamBackup = async (appId, excludeRows) => {
|
|
167
|
+
return await backupAppData(appId, { stream: true }, excludeRows)
|
|
156
168
|
}
|
|
157
169
|
|
|
158
170
|
/**
|
|
@@ -327,6 +339,122 @@ exports.cleanup = appIds => {
|
|
|
327
339
|
}
|
|
328
340
|
}
|
|
329
341
|
|
|
342
|
+
const createTempFolder = item => {
|
|
343
|
+
const path = join(budibaseTempDir(), item)
|
|
344
|
+
try {
|
|
345
|
+
// remove old tmp directories automatically - don't combine
|
|
346
|
+
if (fs.existsSync(path)) {
|
|
347
|
+
fs.rmSync(path, { recursive: true, force: true })
|
|
348
|
+
}
|
|
349
|
+
fs.mkdirSync(path)
|
|
350
|
+
} catch (err) {
|
|
351
|
+
throw new Error(`Path cannot be created: ${err.message}`)
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
return path
|
|
355
|
+
}
|
|
356
|
+
exports.createTempFolder = createTempFolder
|
|
357
|
+
|
|
358
|
+
const extractTarball = async (fromFilePath, toPath) => {
|
|
359
|
+
await tar.extract({
|
|
360
|
+
file: fromFilePath,
|
|
361
|
+
C: toPath,
|
|
362
|
+
})
|
|
363
|
+
}
|
|
364
|
+
exports.extractTarball = extractTarball
|
|
365
|
+
|
|
366
|
+
const getPluginMetadata = async path => {
|
|
367
|
+
let metadata = {}
|
|
368
|
+
try {
|
|
369
|
+
const pkg = fs.readFileSync(join(path, "package.json"), "utf8")
|
|
370
|
+
const schema = fs.readFileSync(join(path, "schema.json"), "utf8")
|
|
371
|
+
|
|
372
|
+
metadata.schema = JSON.parse(schema)
|
|
373
|
+
metadata.package = JSON.parse(pkg)
|
|
374
|
+
|
|
375
|
+
if (
|
|
376
|
+
!metadata.package.name ||
|
|
377
|
+
!metadata.package.version ||
|
|
378
|
+
!metadata.package.description
|
|
379
|
+
) {
|
|
380
|
+
throw new Error(
|
|
381
|
+
"package.json is missing one of 'name', 'version' or 'description'."
|
|
382
|
+
)
|
|
383
|
+
}
|
|
384
|
+
} catch (err) {
|
|
385
|
+
throw new Error(
|
|
386
|
+
`Unable to process schema.json/package.json in plugin. ${err.message}`
|
|
387
|
+
)
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
return { metadata, directory: path }
|
|
391
|
+
}
|
|
392
|
+
exports.getPluginMetadata = getPluginMetadata
|
|
393
|
+
|
|
394
|
+
exports.getDatasourcePlugin = async (name, url, hash) => {
|
|
395
|
+
if (!fs.existsSync(DATASOURCE_PATH)) {
|
|
396
|
+
fs.mkdirSync(DATASOURCE_PATH)
|
|
397
|
+
}
|
|
398
|
+
const filename = join(DATASOURCE_PATH, name)
|
|
399
|
+
const metadataName = `${filename}.bbmetadata`
|
|
400
|
+
if (fs.existsSync(filename)) {
|
|
401
|
+
const currentHash = fs.readFileSync(metadataName, "utf8")
|
|
402
|
+
// if hash is the same return the file, otherwise remove it and re-download
|
|
403
|
+
if (currentHash === hash) {
|
|
404
|
+
return require(filename)
|
|
405
|
+
} else {
|
|
406
|
+
console.log(`Updating plugin: ${name}`)
|
|
407
|
+
fs.unlinkSync(filename)
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
const fullUrl = checkSlashesInUrl(
|
|
411
|
+
`${env.MINIO_URL}/${ObjectStoreBuckets.PLUGINS}/${url}`
|
|
412
|
+
)
|
|
413
|
+
const response = await fetch(fullUrl)
|
|
414
|
+
if (response.status === 200) {
|
|
415
|
+
const content = await response.text()
|
|
416
|
+
fs.writeFileSync(filename, content)
|
|
417
|
+
fs.writeFileSync(metadataName, hash)
|
|
418
|
+
require(filename)
|
|
419
|
+
} else {
|
|
420
|
+
throw new Error(
|
|
421
|
+
`Unable to retrieve plugin - reason: ${await response.text()}`
|
|
422
|
+
)
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* Find for a file recursively from start path applying filter, return first match
|
|
428
|
+
*/
|
|
429
|
+
exports.findFileRec = (startPath, filter) => {
|
|
430
|
+
if (!fs.existsSync(startPath)) {
|
|
431
|
+
return
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
const files = fs.readdirSync(startPath)
|
|
435
|
+
for (let i = 0, len = files.length; i < len; i++) {
|
|
436
|
+
const filename = join(startPath, files[i])
|
|
437
|
+
const stat = fs.lstatSync(filename)
|
|
438
|
+
|
|
439
|
+
if (stat.isDirectory()) {
|
|
440
|
+
return exports.findFileRec(filename, filter)
|
|
441
|
+
} else if (filename.endsWith(filter)) {
|
|
442
|
+
return filename
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/**
|
|
448
|
+
* Remove a folder which is not empty from the file system
|
|
449
|
+
*/
|
|
450
|
+
exports.deleteFolderFileSystem = path => {
|
|
451
|
+
if (!fs.existsSync(path)) {
|
|
452
|
+
return
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
fs.rmSync(path, { recursive: true, force: true })
|
|
456
|
+
}
|
|
457
|
+
|
|
330
458
|
/**
|
|
331
459
|
* Full function definition for below can be found in the utilities.
|
|
332
460
|
*/
|
|
@@ -334,5 +462,6 @@ exports.upload = upload
|
|
|
334
462
|
exports.retrieve = retrieve
|
|
335
463
|
exports.retrieveToTmp = retrieveToTmp
|
|
336
464
|
exports.deleteFiles = deleteFiles
|
|
465
|
+
exports.downloadTarballDirect = downloadTarballDirect
|
|
337
466
|
exports.TOP_LEVEL_PATH = TOP_LEVEL_PATH
|
|
338
467
|
exports.NODE_MODULES_PATH = NODE_MODULES_PATH
|
package/src/utilities/index.js
CHANGED
|
@@ -72,7 +72,8 @@ exports.getUniqueRows = async appIds => {
|
|
|
72
72
|
// ensure uniqueness on a per app pair basis
|
|
73
73
|
// this can't be done on all rows because app import results in
|
|
74
74
|
// duplicate row ids across apps
|
|
75
|
-
|
|
75
|
+
// the array pre-concat is important to avoid stack overflow
|
|
76
|
+
uniqueRows = uniqueRows.concat([...new Set(appRows)])
|
|
76
77
|
}
|
|
77
78
|
|
|
78
79
|
return uniqueRows
|
package/src/watch.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
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
|
+
}
|