@budibase/server 2.2.3 → 2.2.4-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__/aws-sdk.ts +19 -0
- package/__mocks__/node-fetch.ts +78 -0
- package/builder/assets/{index.c7a7a2d0.js → index.77b82b83.js} +185 -185
- package/builder/index.html +1 -1
- package/coverage/clover.xml +4914 -4899
- package/coverage/coverage-final.json +265 -262
- package/coverage/lcov-report/index.html +176 -176
- package/coverage/lcov-report/src/api/controllers/analytics.ts.html +7 -7
- package/coverage/lcov-report/src/api/controllers/apikeys.ts.html +5 -5
- package/coverage/lcov-report/src/api/controllers/application.ts.html +171 -159
- package/coverage/lcov-report/src/api/controllers/auth.ts.html +11 -11
- package/coverage/lcov-report/src/api/controllers/automation.ts.html +51 -51
- package/coverage/lcov-report/src/api/controllers/backup.ts.html +6 -6
- package/coverage/lcov-report/src/api/controllers/cloud.ts.html +91 -79
- package/coverage/lcov-report/src/api/controllers/component.ts.html +5 -5
- package/coverage/lcov-report/src/api/controllers/datasource.ts.html +30 -30
- package/coverage/lcov-report/src/api/controllers/deploy/Deployment.ts.html +14 -14
- package/coverage/lcov-report/src/api/controllers/deploy/index.html +1 -1
- package/coverage/lcov-report/src/api/controllers/deploy/index.ts.html +83 -83
- package/coverage/lcov-report/src/api/controllers/dev.ts.html +18 -18
- package/coverage/lcov-report/src/api/controllers/index.html +51 -51
- package/coverage/lcov-report/src/api/controllers/integration.ts.html +4 -4
- package/coverage/lcov-report/src/api/controllers/layout.ts.html +6 -6
- package/coverage/lcov-report/src/api/controllers/metadata.ts.html +9 -9
- package/coverage/lcov-report/src/api/controllers/migrations.ts.html +4 -4
- package/coverage/lcov-report/src/api/controllers/permission.ts.html +13 -13
- package/coverage/lcov-report/src/api/controllers/plugin/file.ts.html +19 -19
- package/coverage/lcov-report/src/api/controllers/plugin/github.ts.html +63 -63
- package/coverage/lcov-report/src/api/controllers/plugin/index.html +72 -72
- package/coverage/lcov-report/src/api/controllers/plugin/index.ts.html +150 -135
- package/coverage/lcov-report/src/api/controllers/plugin/npm.ts.html +55 -55
- package/coverage/lcov-report/src/api/controllers/plugin/uploaders.ts.html +11 -11
- package/coverage/lcov-report/src/api/controllers/plugin/url.ts.html +18 -18
- package/coverage/lcov-report/src/api/controllers/plugin/utils.ts.html +20 -20
- package/coverage/lcov-report/src/api/controllers/public/applications.ts.html +10 -10
- package/coverage/lcov-report/src/api/controllers/public/index.html +1 -1
- package/coverage/lcov-report/src/api/controllers/public/mapping/applications.ts.html +2 -2
- package/coverage/lcov-report/src/api/controllers/public/mapping/index.html +1 -1
- package/coverage/lcov-report/src/api/controllers/public/mapping/index.ts.html +7 -7
- package/coverage/lcov-report/src/api/controllers/public/mapping/queries.ts.html +2 -2
- package/coverage/lcov-report/src/api/controllers/public/mapping/rows.ts.html +2 -2
- package/coverage/lcov-report/src/api/controllers/public/mapping/tables.ts.html +2 -2
- package/coverage/lcov-report/src/api/controllers/public/mapping/users.ts.html +2 -2
- package/coverage/lcov-report/src/api/controllers/public/queries.ts.html +6 -6
- package/coverage/lcov-report/src/api/controllers/public/rows.ts.html +10 -10
- package/coverage/lcov-report/src/api/controllers/public/tables.ts.html +9 -9
- package/coverage/lcov-report/src/api/controllers/public/users.ts.html +11 -11
- package/coverage/lcov-report/src/api/controllers/public/utils.ts.html +6 -6
- package/coverage/lcov-report/src/api/controllers/query/import/index.html +1 -1
- package/coverage/lcov-report/src/api/controllers/query/import/index.ts.html +8 -8
- package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.html +1 -1
- package/coverage/lcov-report/src/api/controllers/query/import/sources/base/index.ts.html +8 -8
- package/coverage/lcov-report/src/api/controllers/query/import/sources/base/openapi.ts.html +5 -5
- package/coverage/lcov-report/src/api/controllers/query/import/sources/curl.ts.html +8 -8
- package/coverage/lcov-report/src/api/controllers/query/import/sources/index.html +1 -1
- package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi2.ts.html +10 -10
- package/coverage/lcov-report/src/api/controllers/query/import/sources/openapi3.ts.html +14 -14
- package/coverage/lcov-report/src/api/controllers/query/index.html +19 -19
- package/coverage/lcov-report/src/api/controllers/query/index.ts.html +60 -60
- package/coverage/lcov-report/src/api/controllers/query/validation.ts.html +10 -10
- package/coverage/lcov-report/src/api/controllers/role.ts.html +8 -8
- package/coverage/lcov-report/src/api/controllers/routing.ts.html +6 -6
- package/coverage/lcov-report/src/api/controllers/row/ExternalRequest.ts.html +43 -25
- package/coverage/lcov-report/src/api/controllers/row/external.ts.html +20 -20
- package/coverage/lcov-report/src/api/controllers/row/index.html +13 -13
- package/coverage/lcov-report/src/api/controllers/row/index.ts.html +14 -14
- package/coverage/lcov-report/src/api/controllers/row/internal.ts.html +54 -51
- package/coverage/lcov-report/src/api/controllers/row/internalSearch.ts.html +9 -9
- package/coverage/lcov-report/src/api/controllers/row/staticFormula.ts.html +21 -12
- package/coverage/lcov-report/src/api/controllers/row/utils.ts.html +17 -14
- package/coverage/lcov-report/src/api/controllers/screen.ts.html +26 -26
- package/coverage/lcov-report/src/api/controllers/script.ts.html +18 -18
- package/coverage/lcov-report/src/api/controllers/static/index.html +11 -11
- package/coverage/lcov-report/src/api/controllers/static/index.ts.html +32 -44
- package/coverage/lcov-report/src/api/controllers/table/bulkFormula.ts.html +10 -10
- package/coverage/lcov-report/src/api/controllers/table/external.ts.html +14 -14
- package/coverage/lcov-report/src/api/controllers/table/index.html +19 -19
- package/coverage/lcov-report/src/api/controllers/table/index.ts.html +14 -14
- package/coverage/lcov-report/src/api/controllers/table/internal.ts.html +17 -17
- package/coverage/lcov-report/src/api/controllers/table/utils.ts.html +51 -51
- package/coverage/lcov-report/src/api/controllers/templates.ts.html +7 -7
- package/coverage/lcov-report/src/api/controllers/user.ts.html +119 -119
- package/coverage/lcov-report/src/api/controllers/view/exporters.ts.html +4 -4
- package/coverage/lcov-report/src/api/controllers/view/index.html +1 -1
- package/coverage/lcov-report/src/api/controllers/view/index.ts.html +47 -47
- package/coverage/lcov-report/src/api/controllers/view/utils.ts.html +22 -22
- package/coverage/lcov-report/src/api/controllers/view/viewBuilder.ts.html +33 -33
- package/coverage/lcov-report/src/api/controllers/webhook.ts.html +14 -14
- package/coverage/lcov-report/src/api/index.html +1 -1
- package/coverage/lcov-report/src/api/index.ts.html +33 -33
- package/coverage/lcov-report/src/api/routes/analytics.ts.html +7 -7
- package/coverage/lcov-report/src/api/routes/apikeys.ts.html +8 -8
- package/coverage/lcov-report/src/api/routes/application.ts.html +9 -9
- package/coverage/lcov-report/src/api/routes/auth.ts.html +6 -6
- package/coverage/lcov-report/src/api/routes/automation.ts.html +11 -11
- package/coverage/lcov-report/src/api/routes/backup.ts.html +8 -8
- package/coverage/lcov-report/src/api/routes/cloud.ts.html +8 -8
- package/coverage/lcov-report/src/api/routes/component.ts.html +8 -8
- package/coverage/lcov-report/src/api/routes/datasource.ts.html +9 -9
- package/coverage/lcov-report/src/api/routes/deploy.ts.html +8 -8
- package/coverage/lcov-report/src/api/routes/dev.ts.html +13 -13
- package/coverage/lcov-report/src/api/routes/index.html +1 -1
- package/coverage/lcov-report/src/api/routes/index.ts.html +40 -37
- package/coverage/lcov-report/src/api/routes/integration.ts.html +8 -8
- package/coverage/lcov-report/src/api/routes/layout.ts.html +8 -8
- package/coverage/lcov-report/src/api/routes/metadata.ts.html +9 -9
- package/coverage/lcov-report/src/api/routes/migrations.ts.html +7 -7
- package/coverage/lcov-report/src/api/routes/permission.ts.html +9 -9
- package/coverage/lcov-report/src/api/routes/plugin.ts.html +8 -8
- package/coverage/lcov-report/src/api/routes/public/applications.ts.html +12 -12
- package/coverage/lcov-report/src/api/routes/public/index.html +1 -1
- package/coverage/lcov-report/src/api/routes/public/index.ts.html +52 -52
- package/coverage/lcov-report/src/api/routes/public/middleware/index.html +1 -1
- package/coverage/lcov-report/src/api/routes/public/middleware/mapper.ts.html +10 -10
- package/coverage/lcov-report/src/api/routes/public/queries.ts.html +9 -9
- package/coverage/lcov-report/src/api/routes/public/rows.ts.html +12 -12
- package/coverage/lcov-report/src/api/routes/public/tables.ts.html +12 -12
- package/coverage/lcov-report/src/api/routes/public/tests/index.html +1 -1
- package/coverage/lcov-report/src/api/routes/public/tests/utils.ts.html +1 -1
- package/coverage/lcov-report/src/api/routes/public/users.ts.html +12 -12
- package/coverage/lcov-report/src/api/routes/public/utils/Endpoint.ts.html +19 -19
- package/coverage/lcov-report/src/api/routes/public/utils/index.html +1 -1
- package/coverage/lcov-report/src/api/routes/query.ts.html +11 -11
- package/coverage/lcov-report/src/api/routes/role.ts.html +9 -9
- package/coverage/lcov-report/src/api/routes/routing.ts.html +8 -8
- package/coverage/lcov-report/src/api/routes/row.ts.html +11 -11
- package/coverage/lcov-report/src/api/routes/screen.ts.html +9 -9
- package/coverage/lcov-report/src/api/routes/script.ts.html +1 -1
- package/coverage/lcov-report/src/api/routes/static.ts.html +14 -14
- package/coverage/lcov-report/src/api/routes/table.ts.html +11 -11
- package/coverage/lcov-report/src/api/routes/templates.ts.html +8 -8
- package/coverage/lcov-report/src/api/routes/tests/utilities/TestFunctions.ts.html +16 -16
- package/coverage/lcov-report/src/api/routes/tests/utilities/index.html +1 -1
- package/coverage/lcov-report/src/api/routes/tests/utilities/index.ts.html +22 -22
- package/coverage/lcov-report/src/api/routes/user.ts.html +9 -9
- package/coverage/lcov-report/src/api/routes/utils/index.html +1 -1
- package/coverage/lcov-report/src/api/routes/utils/validators.ts.html +42 -42
- package/coverage/lcov-report/src/api/routes/view.ts.html +10 -10
- package/coverage/lcov-report/src/api/routes/webhook.ts.html +10 -10
- package/coverage/lcov-report/src/app.ts.html +32 -32
- package/coverage/lcov-report/src/automations/actions.ts.html +25 -25
- package/coverage/lcov-report/src/automations/automationUtils.ts.html +91 -19
- package/coverage/lcov-report/src/automations/bullboard.ts.html +11 -11
- package/coverage/lcov-report/src/automations/index.html +19 -19
- package/coverage/lcov-report/src/automations/index.ts.html +13 -13
- package/coverage/lcov-report/src/automations/logging/index.html +1 -1
- package/coverage/lcov-report/src/automations/logging/index.ts.html +11 -11
- package/coverage/lcov-report/src/automations/steps/bash.ts.html +34 -34
- package/coverage/lcov-report/src/automations/steps/createRow.ts.html +7 -7
- package/coverage/lcov-report/src/automations/steps/delay.ts.html +5 -5
- package/coverage/lcov-report/src/automations/steps/deleteRow.ts.html +7 -7
- package/coverage/lcov-report/src/automations/steps/discord.ts.html +33 -33
- package/coverage/lcov-report/src/automations/steps/executeQuery.ts.html +35 -35
- package/coverage/lcov-report/src/automations/steps/executeScript.ts.html +31 -31
- package/coverage/lcov-report/src/automations/steps/filter.ts.html +6 -6
- package/coverage/lcov-report/src/automations/steps/index.html +83 -83
- package/coverage/lcov-report/src/automations/steps/integromat.ts.html +6 -6
- package/coverage/lcov-report/src/automations/steps/loop.ts.html +3 -3
- package/coverage/lcov-report/src/automations/steps/outgoingWebhook.ts.html +14 -14
- package/coverage/lcov-report/src/automations/steps/queryRows.ts.html +17 -17
- package/coverage/lcov-report/src/automations/steps/sendSmtpEmail.ts.html +28 -28
- package/coverage/lcov-report/src/automations/steps/serverLog.ts.html +18 -18
- package/coverage/lcov-report/src/automations/steps/slack.ts.html +6 -6
- package/coverage/lcov-report/src/automations/steps/updateRow.ts.html +7 -7
- package/coverage/lcov-report/src/automations/steps/utils.ts.html +16 -16
- package/coverage/lcov-report/src/automations/steps/zapier.ts.html +22 -22
- package/coverage/lcov-report/src/automations/tests/utilities/index.html +5 -5
- package/coverage/lcov-report/src/automations/tests/utilities/index.ts.html +26 -26
- package/coverage/lcov-report/src/automations/triggerInfo/app.ts.html +3 -3
- package/coverage/lcov-report/src/automations/triggerInfo/cron.ts.html +3 -3
- package/coverage/lcov-report/src/automations/triggerInfo/index.html +1 -1
- package/coverage/lcov-report/src/automations/triggerInfo/index.ts.html +8 -8
- package/coverage/lcov-report/src/automations/triggerInfo/rowDeleted.ts.html +3 -3
- package/coverage/lcov-report/src/automations/triggerInfo/rowSaved.ts.html +3 -3
- package/coverage/lcov-report/src/automations/triggerInfo/rowUpdated.ts.html +3 -3
- package/coverage/lcov-report/src/automations/triggerInfo/webhook.ts.html +3 -3
- package/coverage/lcov-report/src/automations/triggers.ts.html +21 -21
- package/coverage/lcov-report/src/automations/utils.ts.html +56 -56
- package/coverage/lcov-report/src/constants/index.html +1 -1
- package/coverage/lcov-report/src/constants/index.ts.html +92 -92
- package/coverage/lcov-report/src/constants/layouts.ts.html +4 -4
- package/coverage/lcov-report/src/constants/screens.ts.html +5 -5
- package/coverage/lcov-report/src/db/defaultData/datasource_bb_default.ts.html +23 -23
- package/coverage/lcov-report/src/db/defaultData/employeeImport.ts.html +2 -2
- package/coverage/lcov-report/src/db/defaultData/expensesImport.ts.html +2 -2
- package/coverage/lcov-report/src/db/defaultData/index.html +1 -1
- package/coverage/lcov-report/src/db/defaultData/inventoryImport.ts.html +2 -2
- package/coverage/lcov-report/src/db/defaultData/jobsImport.ts.html +2 -2
- package/coverage/lcov-report/src/db/dynamoClient.ts.html +16 -16
- package/coverage/lcov-report/src/db/inMemoryView.ts.html +5 -5
- package/coverage/lcov-report/src/db/index.html +19 -19
- package/coverage/lcov-report/src/db/index.ts.html +9 -9
- package/coverage/lcov-report/src/db/linkedRows/LinkController.ts.html +8 -8
- package/coverage/lcov-report/src/db/linkedRows/LinkDocument.ts.html +4 -4
- package/coverage/lcov-report/src/db/linkedRows/index.html +1 -1
- package/coverage/lcov-report/src/db/linkedRows/index.ts.html +15 -15
- package/coverage/lcov-report/src/db/linkedRows/linkUtils.ts.html +12 -12
- package/coverage/lcov-report/src/db/newid.ts.html +4 -4
- package/coverage/lcov-report/src/db/utils.ts.html +80 -80
- package/coverage/lcov-report/src/definitions/automations.ts.html +4 -4
- package/coverage/lcov-report/src/definitions/datasource.ts.html +4 -4
- package/coverage/lcov-report/src/definitions/index.html +1 -1
- package/coverage/lcov-report/src/environment.ts.html +43 -31
- package/coverage/lcov-report/src/events/AutomationEmitter.ts.html +6 -6
- package/coverage/lcov-report/src/events/BudibaseEmitter.ts.html +5 -5
- package/coverage/lcov-report/src/events/index.html +1 -1
- package/coverage/lcov-report/src/events/index.ts.html +4 -4
- package/coverage/lcov-report/src/events/utils.ts.html +3 -3
- package/coverage/lcov-report/src/index.html +26 -26
- package/coverage/lcov-report/src/index.ts.html +1 -1
- package/coverage/lcov-report/src/integrations/airtable.ts.html +5 -5
- package/coverage/lcov-report/src/integrations/arangodb.ts.html +5 -5
- package/coverage/lcov-report/src/integrations/base/index.html +1 -1
- package/coverage/lcov-report/src/integrations/base/query.ts.html +3 -3
- package/coverage/lcov-report/src/integrations/base/sql.ts.html +14 -14
- package/coverage/lcov-report/src/integrations/base/sqlTable.ts.html +8 -8
- package/coverage/lcov-report/src/integrations/base/utils.ts.html +3 -3
- package/coverage/lcov-report/src/integrations/couchdb.ts.html +5 -5
- package/coverage/lcov-report/src/integrations/dynamodb.ts.html +6 -6
- package/coverage/lcov-report/src/integrations/elasticsearch.ts.html +5 -5
- package/coverage/lcov-report/src/integrations/firebase.ts.html +5 -5
- package/coverage/lcov-report/src/integrations/googlesheets.ts.html +11 -11
- package/coverage/lcov-report/src/integrations/index.html +5 -5
- package/coverage/lcov-report/src/integrations/index.ts.html +35 -47
- package/coverage/lcov-report/src/integrations/microsoftSqlServer.ts.html +8 -8
- package/coverage/lcov-report/src/integrations/mongodb.ts.html +5 -5
- package/coverage/lcov-report/src/integrations/mysql.ts.html +10 -10
- package/coverage/lcov-report/src/integrations/oracle.ts.html +13 -13
- package/coverage/lcov-report/src/integrations/postgres.ts.html +42 -42
- package/coverage/lcov-report/src/integrations/queries/index.html +1 -1
- package/coverage/lcov-report/src/integrations/queries/sql.ts.html +13 -13
- package/coverage/lcov-report/src/integrations/redis.ts.html +5 -5
- package/coverage/lcov-report/src/integrations/rest.ts.html +16 -16
- package/coverage/lcov-report/src/integrations/s3.ts.html +6 -6
- package/coverage/lcov-report/src/integrations/snowflake.ts.html +5 -5
- package/coverage/lcov-report/src/integrations/tests/TestConfiguration.js.html +1 -1
- package/coverage/lcov-report/src/integrations/tests/index.html +1 -1
- package/coverage/lcov-report/src/integrations/utils.ts.html +36 -36
- package/coverage/lcov-report/src/middleware/appInfo.ts.html +7 -7
- package/coverage/lcov-report/src/middleware/authorized.ts.html +28 -28
- package/coverage/lcov-report/src/middleware/builder.ts.html +17 -17
- package/coverage/lcov-report/src/middleware/currentapp.ts.html +39 -39
- package/coverage/lcov-report/src/middleware/index.html +1 -1
- package/coverage/lcov-report/src/middleware/joi-validator.ts.html +1 -1
- package/coverage/lcov-report/src/middleware/publicApi.ts.html +4 -4
- package/coverage/lcov-report/src/middleware/resourceId.ts.html +22 -22
- package/coverage/lcov-report/src/middleware/selfhost.ts.html +1 -1
- package/coverage/lcov-report/src/middleware/utils.ts.html +4 -4
- package/coverage/lcov-report/src/migrations/functions/appUrls.ts.html +4 -4
- package/coverage/lcov-report/src/migrations/functions/backfill/app/automations.ts.html +5 -5
- package/coverage/lcov-report/src/migrations/functions/backfill/app/datasources.ts.html +5 -5
- package/coverage/lcov-report/src/migrations/functions/backfill/app/index.html +1 -1
- package/coverage/lcov-report/src/migrations/functions/backfill/app/layouts.ts.html +5 -5
- package/coverage/lcov-report/src/migrations/functions/backfill/app/queries.ts.html +7 -7
- package/coverage/lcov-report/src/migrations/functions/backfill/app/roles.ts.html +5 -5
- package/coverage/lcov-report/src/migrations/functions/backfill/app/screens.ts.html +5 -5
- package/coverage/lcov-report/src/migrations/functions/backfill/app/tables.ts.html +4 -4
- package/coverage/lcov-report/src/migrations/functions/backfill/app.ts.html +19 -19
- package/coverage/lcov-report/src/migrations/functions/backfill/global/configs.ts.html +13 -10
- package/coverage/lcov-report/src/migrations/functions/backfill/global/index.html +1 -1
- package/coverage/lcov-report/src/migrations/functions/backfill/global/quotas.ts.html +7 -7
- package/coverage/lcov-report/src/migrations/functions/backfill/global/users.ts.html +6 -6
- package/coverage/lcov-report/src/migrations/functions/backfill/global.ts.html +15 -15
- package/coverage/lcov-report/src/migrations/functions/backfill/index.html +1 -1
- package/coverage/lcov-report/src/migrations/functions/backfill/index.ts.html +5 -5
- package/coverage/lcov-report/src/migrations/functions/backfill/installation.ts.html +8 -8
- package/coverage/lcov-report/src/migrations/functions/index.html +1 -1
- package/coverage/lcov-report/src/migrations/functions/syncQuotas.ts.html +6 -6
- package/coverage/lcov-report/src/migrations/functions/tableSettings.ts.html +6 -6
- package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.html +1 -1
- package/coverage/lcov-report/src/migrations/functions/usageQuotas/index.ts.html +2 -2
- package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncApps.ts.html +5 -5
- package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncPlugins.ts.html +4 -4
- package/coverage/lcov-report/src/migrations/functions/usageQuotas/syncRows.ts.html +6 -6
- package/coverage/lcov-report/src/migrations/functions/userEmailViewCasing.ts.html +3 -3
- package/coverage/lcov-report/src/migrations/index.html +1 -1
- package/coverage/lcov-report/src/migrations/index.ts.html +32 -32
- package/coverage/lcov-report/src/migrations/tests/helpers.ts.html +1 -1
- package/coverage/lcov-report/src/migrations/tests/index.html +1 -1
- package/coverage/lcov-report/src/migrations/tests/structures.ts.html +1 -1
- package/coverage/lcov-report/src/sdk/app/applications/index.html +15 -15
- package/coverage/lcov-report/src/sdk/app/applications/index.ts.html +4 -4
- package/coverage/lcov-report/src/sdk/app/applications/sync.ts.html +34 -34
- package/coverage/lcov-report/src/sdk/app/applications/utils.ts.html +9 -9
- package/coverage/lcov-report/src/sdk/app/automations/index.html +1 -1
- package/coverage/lcov-report/src/sdk/app/automations/index.ts.html +3 -3
- package/coverage/lcov-report/src/sdk/app/automations/webhook.ts.html +6 -6
- package/coverage/lcov-report/src/sdk/app/backups/constants.ts.html +3 -3
- package/coverage/lcov-report/src/sdk/app/backups/exports.ts.html +17 -17
- package/coverage/lcov-report/src/sdk/app/backups/imports.ts.html +42 -54
- package/coverage/lcov-report/src/sdk/app/backups/index.html +30 -30
- package/coverage/lcov-report/src/sdk/app/backups/index.ts.html +5 -5
- package/coverage/lcov-report/src/sdk/app/backups/statistics.ts.html +73 -73
- package/coverage/lcov-report/src/sdk/app/tables/index.html +1 -1
- package/coverage/lcov-report/src/sdk/app/tables/index.ts.html +5 -5
- package/coverage/lcov-report/src/sdk/index.html +1 -1
- package/coverage/lcov-report/src/sdk/index.ts.html +8 -8
- package/coverage/lcov-report/src/sdk/users/index.html +5 -5
- package/coverage/lcov-report/src/sdk/users/index.ts.html +3 -3
- package/coverage/lcov-report/src/sdk/users/utils.ts.html +34 -34
- package/coverage/lcov-report/src/startup.ts.html +42 -42
- package/coverage/lcov-report/src/tests/utilities/TestConfiguration.ts.html +146 -119
- package/coverage/lcov-report/src/tests/utilities/controllers.ts.html +15 -15
- package/coverage/lcov-report/src/tests/utilities/index.html +10 -10
- package/coverage/lcov-report/src/tests/utilities/index.ts.html +1 -1
- package/coverage/lcov-report/src/tests/utilities/structures.ts.html +30 -30
- package/coverage/lcov-report/src/threads/automation.ts.html +32 -101
- package/coverage/lcov-report/src/threads/index.html +19 -19
- package/coverage/lcov-report/src/threads/index.ts.html +25 -25
- package/coverage/lcov-report/src/threads/query.ts.html +71 -71
- package/coverage/lcov-report/src/threads/utils.ts.html +18 -18
- package/coverage/lcov-report/src/utilities/budibaseDir.ts.html +3 -3
- package/coverage/lcov-report/src/utilities/centralPath.ts.html +4 -4
- package/coverage/lcov-report/src/utilities/csvParser.ts.html +8 -8
- package/coverage/lcov-report/src/utilities/fileSystem/app.ts.html +343 -0
- package/coverage/lcov-report/src/utilities/fileSystem/clientLibrary.ts.html +12 -12
- package/coverage/lcov-report/src/utilities/fileSystem/filesystem.ts.html +595 -0
- package/coverage/lcov-report/src/utilities/fileSystem/index.html +79 -19
- package/coverage/lcov-report/src/utilities/fileSystem/index.ts.html +20 -1049
- package/coverage/lcov-report/src/utilities/fileSystem/plugin.ts.html +280 -0
- package/coverage/lcov-report/src/utilities/fileSystem/processor.ts.html +1 -1
- package/coverage/lcov-report/src/utilities/fileSystem/template.ts.html +193 -0
- package/coverage/lcov-report/src/utilities/global.ts.html +42 -42
- package/coverage/lcov-report/src/utilities/index.html +48 -63
- package/coverage/lcov-report/src/utilities/index.ts.html +36 -168
- package/coverage/lcov-report/src/utilities/redis.ts.html +32 -32
- package/coverage/lcov-report/src/utilities/routing/index.html +1 -1
- package/coverage/lcov-report/src/utilities/routing/index.ts.html +5 -5
- package/coverage/lcov-report/src/utilities/rowProcessor/index.html +28 -28
- package/coverage/lcov-report/src/utilities/rowProcessor/index.ts.html +60 -33
- package/coverage/lcov-report/src/utilities/rowProcessor/map.ts.html +3 -3
- package/coverage/lcov-report/src/utilities/rowProcessor/utils.ts.html +38 -38
- package/coverage/lcov-report/src/utilities/scriptRunner.ts.html +32 -32
- package/coverage/lcov-report/src/utilities/security.ts.html +6 -6
- package/coverage/lcov-report/src/utilities/statusCodes.ts.html +1 -1
- package/coverage/lcov-report/src/utilities/usageQuota/index.html +1 -1
- package/coverage/lcov-report/src/utilities/usageQuota/rows.ts.html +35 -35
- package/coverage/lcov-report/src/utilities/usageQuota/usageQuoteReset.ts.html +1 -1
- package/coverage/lcov-report/src/utilities/users.ts.html +6 -6
- package/coverage/lcov-report/src/utilities/workerRequests.ts.html +56 -56
- package/coverage/lcov-report/src/watch.ts.html +9 -9
- package/coverage/lcov-report/src/websocket.ts.html +15 -15
- package/coverage/lcov.info +6978 -6941
- package/dist/api/controllers/application.js +9 -10
- package/dist/api/controllers/cloud.js +6 -2
- package/dist/api/controllers/plugin/index.js +6 -6
- package/dist/api/controllers/row/ExternalRequest.js +14 -8
- package/dist/api/controllers/row/internal.js +11 -11
- package/dist/api/controllers/row/staticFormula.js +1 -1
- package/dist/api/controllers/static/index.js +8 -11
- package/dist/automations/automationUtils.js +26 -1
- package/dist/environment.js +6 -2
- package/dist/integrations/index.js +1 -2
- package/dist/migrations/functions/backfill/global/configs.js +4 -4
- package/dist/package.json +9 -7
- package/dist/sdk/app/backups/imports.js +3 -7
- package/dist/threads/automation.js +2 -26
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/utilities/fileSystem/app.js +97 -0
- package/dist/utilities/fileSystem/clientLibrary.js +3 -3
- package/dist/utilities/fileSystem/filesystem.js +182 -0
- package/dist/utilities/fileSystem/index.js +18 -342
- package/dist/utilities/fileSystem/plugin.js +63 -0
- package/dist/utilities/fileSystem/template.js +44 -0
- package/dist/utilities/index.js +1 -44
- package/dist/utilities/rowProcessor/index.js +12 -4
- package/package.json +10 -8
- package/src/api/controllers/application.ts +16 -12
- package/src/api/controllers/auth.ts +2 -2
- package/src/api/controllers/cloud.ts +10 -6
- package/src/api/controllers/plugin/index.ts +14 -9
- package/src/api/controllers/row/ExternalRequest.ts +14 -8
- package/src/api/controllers/row/internal.ts +23 -22
- package/src/api/controllers/row/staticFormula.ts +5 -2
- package/src/api/controllers/row/utils.ts +2 -1
- package/src/api/controllers/static/index.ts +6 -10
- package/src/api/routes/index.ts +4 -3
- package/src/api/routes/tests/__snapshots__/{datasource.spec.js.snap → datasource.spec.ts.snap} +0 -0
- package/src/api/routes/tests/{application.spec.js → application.spec.ts} +40 -7
- package/src/api/routes/tests/{backup.spec.js → backup.spec.ts} +17 -6
- package/src/api/routes/tests/cloud.spec.ts +66 -0
- package/src/api/routes/tests/data/budibase-component-1.0.1.tgz +0 -0
- package/src/api/routes/tests/data/comment-box-1.0.2.tar.gz +0 -0
- package/src/api/routes/tests/data/export-test.tar.gz +0 -0
- package/src/api/routes/tests/{datasource.spec.js → datasource.spec.ts} +23 -15
- package/src/api/routes/tests/plugin.spec.ts +179 -0
- package/src/api/routes/tests/routing.spec.js +0 -1
- package/src/api/routes/tests/row.spec.js +4 -2
- package/src/api/routes/tests/static.spec.js +2 -17
- package/src/api/routes/tests/table.spec.js +8 -2
- package/src/api/routes/tests/user.spec.js +86 -0
- package/src/api/routes/tests/utilities/index.ts +2 -2
- package/src/automations/automationUtils.ts +24 -0
- package/src/automations/tests/bash.spec.js +34 -0
- package/src/automations/tests/discord.spec.js +27 -0
- package/src/automations/tests/executeQuery.spec.js +49 -0
- package/src/automations/tests/executeScript.spec.js +48 -0
- package/src/automations/tests/sendSmtpEmail.spec.js +71 -0
- package/src/automations/tests/serverLog.spec.js +22 -0
- package/src/automations/tests/utilities/index.ts +2 -2
- package/src/automations/tests/zapier.spec.js +27 -0
- package/src/automations/unitTests/automationUtils.spec.ts +65 -0
- package/src/environment.ts +6 -2
- package/src/integrations/index.ts +1 -5
- package/src/migrations/functions/backfill/global/configs.ts +5 -4
- package/src/sdk/app/backups/imports.ts +3 -7
- package/src/tests/jestSetup.ts +4 -1
- package/src/tests/utilities/TestConfiguration.ts +9 -0
- package/src/threads/automation.ts +2 -25
- package/src/utilities/fileSystem/app.ts +86 -0
- package/src/utilities/fileSystem/clientLibrary.ts +1 -1
- package/src/utilities/fileSystem/filesystem.ts +170 -0
- package/src/utilities/fileSystem/index.ts +5 -348
- package/src/utilities/fileSystem/plugin.ts +65 -0
- package/src/utilities/fileSystem/template.ts +36 -0
- package/src/utilities/index.ts +1 -45
- package/src/utilities/rowProcessor/index.ts +17 -8
- package/src/utilities/rowProcessor/tests/utils.spec.ts +57 -0
- package/tsconfig.build.json +2 -0
- package/coverage/lcov-report/src/utilities/plugins.ts.html +0 -151
- package/dist/api/routes/tests/utilities/TestFunctions.js +0 -167
- package/dist/api/routes/tests/utilities/index.js +0 -131
- package/dist/automations/tests/utilities/index.js +0 -81
- package/dist/tests/utilities/TestConfiguration.js +0 -562
- package/dist/tests/utilities/controllers.js +0 -40
- package/dist/tests/utilities/structures.js +0 -168
- package/dist/utilities/plugins.js +0 -26
- package/src/automations/unitTests/automationUtils.spec.js +0 -17
- package/src/utilities/plugins.ts +0 -22
|
@@ -31,7 +31,7 @@ export async function runInProd(fn: any) {
|
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
export async function runStep(stepId: string, inputs: any) {
|
|
34
|
+
export async function runStep(stepId: string, inputs: any, stepContext?: any) {
|
|
35
35
|
async function run() {
|
|
36
36
|
let step = await getAction(stepId)
|
|
37
37
|
expect(step).toBeDefined()
|
|
@@ -39,7 +39,7 @@ export async function runStep(stepId: string, inputs: any) {
|
|
|
39
39
|
throw new Error("No step found")
|
|
40
40
|
}
|
|
41
41
|
return step({
|
|
42
|
-
context: {},
|
|
42
|
+
context: stepContext || {},
|
|
43
43
|
inputs,
|
|
44
44
|
appId: config ? config.getAppId() : null,
|
|
45
45
|
// don't really need an API key, mocked out usage quota, not being tested here
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const setup = require("./utilities")
|
|
2
|
+
const fetch = require("node-fetch")
|
|
3
|
+
|
|
4
|
+
jest.mock("node-fetch")
|
|
5
|
+
|
|
6
|
+
describe("test the outgoing webhook action", () => {
|
|
7
|
+
let inputs
|
|
8
|
+
let config = setup.getConfig()
|
|
9
|
+
|
|
10
|
+
beforeEach(async () => {
|
|
11
|
+
await config.init()
|
|
12
|
+
inputs = {
|
|
13
|
+
value1: "test",
|
|
14
|
+
url: "http://www.test.com",
|
|
15
|
+
}
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
afterAll(setup.afterAll)
|
|
19
|
+
|
|
20
|
+
it("should be able to run the action", async () => {
|
|
21
|
+
const res = await setup.runStep(setup.actions.zapier.stepId, inputs)
|
|
22
|
+
expect(res.response.url).toEqual("http://www.test.com")
|
|
23
|
+
expect(res.response.method).toEqual("post")
|
|
24
|
+
expect(res.success).toEqual(true)
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
})
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const automationUtils = require("../automationUtils")
|
|
2
|
+
|
|
3
|
+
describe("automationUtils", () => {
|
|
4
|
+
describe("substituteLoopStep", () => {
|
|
5
|
+
it("should allow multiple loop binding substitutes", () => {
|
|
6
|
+
expect(
|
|
7
|
+
automationUtils.substituteLoopStep(
|
|
8
|
+
`{{ loop.currentItem._id }} {{ loop.currentItem._id }} {{ loop.currentItem._id }}`,
|
|
9
|
+
"step.2"
|
|
10
|
+
)
|
|
11
|
+
).toBe(
|
|
12
|
+
`{{ step.2.currentItem._id }} {{ step.2.currentItem._id }} {{ step.2.currentItem._id }}`
|
|
13
|
+
)
|
|
14
|
+
})
|
|
15
|
+
|
|
16
|
+
it("should handle not subsituting outside of curly braces", () => {
|
|
17
|
+
expect(
|
|
18
|
+
automationUtils.substituteLoopStep(
|
|
19
|
+
`loop {{ loop.currentItem._id }}loop loop{{ loop.currentItem._id }}loop`,
|
|
20
|
+
"step.2"
|
|
21
|
+
)
|
|
22
|
+
).toBe(
|
|
23
|
+
`loop {{ step.2.currentItem._id }}loop loop{{ step.2.currentItem._id }}loop`
|
|
24
|
+
)
|
|
25
|
+
})
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
describe("typeCastForLooping", () => {
|
|
29
|
+
it("should parse to correct type", () => {
|
|
30
|
+
expect(
|
|
31
|
+
automationUtils.typecastForLooping(
|
|
32
|
+
{ inputs: { option: "Array" } },
|
|
33
|
+
{ binding: [1, 2, 3] }
|
|
34
|
+
)
|
|
35
|
+
).toEqual([1, 2, 3])
|
|
36
|
+
expect(
|
|
37
|
+
automationUtils.typecastForLooping(
|
|
38
|
+
{ inputs: { option: "Array" } },
|
|
39
|
+
{ binding: "[1, 2, 3]" }
|
|
40
|
+
)
|
|
41
|
+
).toEqual([1, 2, 3])
|
|
42
|
+
expect(
|
|
43
|
+
automationUtils.typecastForLooping(
|
|
44
|
+
{ inputs: { option: "String" } },
|
|
45
|
+
{ binding: [1, 2, 3] }
|
|
46
|
+
)
|
|
47
|
+
).toEqual("1,2,3")
|
|
48
|
+
})
|
|
49
|
+
it("should handle null values", () => {
|
|
50
|
+
// expect it to handle where the binding is null
|
|
51
|
+
expect(
|
|
52
|
+
automationUtils.typecastForLooping(
|
|
53
|
+
{ inputs: { option: "Array" } },
|
|
54
|
+
{ binding: null }
|
|
55
|
+
)
|
|
56
|
+
).toEqual(null)
|
|
57
|
+
expect(() =>
|
|
58
|
+
automationUtils.typecastForLooping(
|
|
59
|
+
{ inputs: { option: "Array" } },
|
|
60
|
+
{ binding: "test" }
|
|
61
|
+
)
|
|
62
|
+
).toThrow()
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
})
|
package/src/environment.ts
CHANGED
|
@@ -79,7 +79,6 @@ const environment = {
|
|
|
79
79
|
// flags
|
|
80
80
|
ALLOW_DEV_AUTOMATIONS: process.env.ALLOW_DEV_AUTOMATIONS,
|
|
81
81
|
DISABLE_THREADING: process.env.DISABLE_THREADING,
|
|
82
|
-
DISABLE_DEVELOPER_LICENSE: process.env.DISABLE_DEVELOPER_LICENSE,
|
|
83
82
|
DISABLE_AUTOMATION_LOGS: process.env.DISABLE_AUTOMATION_LOGS,
|
|
84
83
|
MULTI_TENANCY: process.env.MULTI_TENANCY,
|
|
85
84
|
ENABLE_ANALYTICS: process.env.ENABLE_ANALYTICS,
|
|
@@ -113,12 +112,17 @@ if (isDev() && module.exports.DISABLE_THREADING == null) {
|
|
|
113
112
|
}
|
|
114
113
|
|
|
115
114
|
// clean up any environment variable edge cases
|
|
116
|
-
for (let [key, value] of Object.entries(
|
|
115
|
+
for (let [key, value] of Object.entries(environment)) {
|
|
117
116
|
// handle the edge case of "0" to disable an environment variable
|
|
118
117
|
if (value === "0") {
|
|
119
118
|
// @ts-ignore
|
|
120
119
|
environment[key] = 0
|
|
121
120
|
}
|
|
121
|
+
// handle the edge case of "false" to disable an environment variable
|
|
122
|
+
if (value === "false") {
|
|
123
|
+
// @ts-ignore
|
|
124
|
+
environment[key] = 0
|
|
125
|
+
}
|
|
122
126
|
}
|
|
123
127
|
|
|
124
128
|
export = environment
|
|
@@ -98,11 +98,7 @@ export async function getIntegration(integration: string) {
|
|
|
98
98
|
for (let plugin of plugins) {
|
|
99
99
|
if (plugin.name === integration) {
|
|
100
100
|
// need to use commonJS require due to its dynamic runtime nature
|
|
101
|
-
const retrieved: any = await getDatasourcePlugin(
|
|
102
|
-
plugin.name,
|
|
103
|
-
plugin.jsUrl,
|
|
104
|
-
plugin.schema?.hash
|
|
105
|
-
)
|
|
101
|
+
const retrieved: any = await getDatasourcePlugin(plugin)
|
|
106
102
|
if (retrieved.integration) {
|
|
107
103
|
return retrieved.integration
|
|
108
104
|
} else {
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
isGoogleConfig,
|
|
6
6
|
isOIDCConfig,
|
|
7
7
|
isSettingsConfig,
|
|
8
|
+
ConfigType,
|
|
8
9
|
} from "@budibase/types"
|
|
9
10
|
import env from "./../../../../environment"
|
|
10
11
|
|
|
@@ -31,15 +32,15 @@ export const backfill = async (
|
|
|
31
32
|
await events.email.SMTPCreated(timestamp)
|
|
32
33
|
}
|
|
33
34
|
if (isGoogleConfig(config)) {
|
|
34
|
-
await events.auth.SSOCreated(
|
|
35
|
+
await events.auth.SSOCreated(ConfigType.GOOGLE, timestamp)
|
|
35
36
|
if (config.config.activated) {
|
|
36
|
-
await events.auth.SSOActivated(
|
|
37
|
+
await events.auth.SSOActivated(ConfigType.GOOGLE, timestamp)
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
if (isOIDCConfig(config)) {
|
|
40
|
-
await events.auth.SSOCreated(
|
|
41
|
+
await events.auth.SSOCreated(ConfigType.OIDC, timestamp)
|
|
41
42
|
if (config.config.configs[0].activated) {
|
|
42
|
-
await events.auth.SSOActivated(
|
|
43
|
+
await events.auth.SSOActivated(ConfigType.OIDC, timestamp)
|
|
43
44
|
}
|
|
44
45
|
}
|
|
45
46
|
if (isSettingsConfig(config)) {
|
|
@@ -55,12 +55,8 @@ async function updateAttachmentColumns(prodAppId: string, db: Database) {
|
|
|
55
55
|
continue
|
|
56
56
|
}
|
|
57
57
|
row[column] = row[column].map((attachment: RowAttachment) => {
|
|
58
|
-
//
|
|
59
|
-
const urlParts = attachment.
|
|
60
|
-
// drop the first empty element
|
|
61
|
-
urlParts.shift()
|
|
62
|
-
// get the prefix
|
|
63
|
-
const prefix = urlParts.shift()
|
|
58
|
+
// Key looks like: appId/attachments/file.csv
|
|
59
|
+
const urlParts = attachment.key.split("/")
|
|
64
60
|
// remove the app ID
|
|
65
61
|
urlParts.shift()
|
|
66
62
|
// add new app ID
|
|
@@ -69,7 +65,7 @@ async function updateAttachmentColumns(prodAppId: string, db: Database) {
|
|
|
69
65
|
return {
|
|
70
66
|
...attachment,
|
|
71
67
|
key,
|
|
72
|
-
url:
|
|
68
|
+
url: "", // calculated on retrieval using key
|
|
73
69
|
}
|
|
74
70
|
})
|
|
75
71
|
}
|
package/src/tests/jestSetup.ts
CHANGED
|
@@ -19,7 +19,10 @@ import { mocks } from "@budibase/backend-core/tests"
|
|
|
19
19
|
const tk = require("timekeeper")
|
|
20
20
|
tk.freeze(mocks.date.MOCK_DATE)
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
if (!process.env.DEBUG) {
|
|
23
|
+
global.console.log = jest.fn() // console.log are ignored in tests
|
|
24
|
+
global.console.warn = jest.fn() // console.warn are ignored in tests
|
|
25
|
+
}
|
|
23
26
|
|
|
24
27
|
if (!process.env.CI) {
|
|
25
28
|
// set a longer timeout in dev for debugging
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
import { mocks } from "@budibase/backend-core/tests"
|
|
2
|
+
|
|
3
|
+
// init the licensing mock
|
|
4
|
+
import * as pro from "@budibase/pro"
|
|
5
|
+
mocks.licenses.init(pro)
|
|
6
|
+
|
|
7
|
+
// use unlimited license by default
|
|
8
|
+
mocks.licenses.useUnlimited()
|
|
9
|
+
|
|
1
10
|
import { init as dbInit } from "../../db"
|
|
2
11
|
dbInit()
|
|
3
12
|
import env from "../../environment"
|
|
@@ -32,31 +32,8 @@ const LOOP_STEP_ID = actions.ACTION_DEFINITIONS.LOOP.stepId
|
|
|
32
32
|
const CRON_STEP_ID = triggerDefs.CRON.stepId
|
|
33
33
|
const STOPPED_STATUS = { success: true, status: AutomationStatus.STOPPED }
|
|
34
34
|
|
|
35
|
-
function typecastForLooping(loopStep: LoopStep, input: LoopInput) {
|
|
36
|
-
if (!input || !input.binding) {
|
|
37
|
-
return null
|
|
38
|
-
}
|
|
39
|
-
try {
|
|
40
|
-
switch (loopStep.inputs.option) {
|
|
41
|
-
case LoopStepType.ARRAY:
|
|
42
|
-
if (typeof input.binding === "string") {
|
|
43
|
-
return JSON.parse(input.binding)
|
|
44
|
-
}
|
|
45
|
-
break
|
|
46
|
-
case LoopStepType.STRING:
|
|
47
|
-
if (Array.isArray(input.binding)) {
|
|
48
|
-
return input.binding.join(",")
|
|
49
|
-
}
|
|
50
|
-
break
|
|
51
|
-
}
|
|
52
|
-
} catch (err) {
|
|
53
|
-
throw new Error("Unable to cast to correct type")
|
|
54
|
-
}
|
|
55
|
-
return input.binding
|
|
56
|
-
}
|
|
57
|
-
|
|
58
35
|
function getLoopIterations(loopStep: LoopStep, input: LoopInput) {
|
|
59
|
-
const binding = typecastForLooping(loopStep, input)
|
|
36
|
+
const binding = automationUtils.typecastForLooping(loopStep, input)
|
|
60
37
|
if (!loopStep || !binding) {
|
|
61
38
|
return 1
|
|
62
39
|
}
|
|
@@ -289,7 +266,7 @@ class Orchestrator {
|
|
|
289
266
|
|
|
290
267
|
let tempOutput = { items: loopSteps, iterations: iterationCount }
|
|
291
268
|
try {
|
|
292
|
-
newInput.binding = typecastForLooping(
|
|
269
|
+
newInput.binding = automationUtils.typecastForLooping(
|
|
293
270
|
loopStep as LoopStep,
|
|
294
271
|
newInput
|
|
295
272
|
)
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { budibaseTempDir } from "../budibaseDir"
|
|
2
|
+
import fs from "fs"
|
|
3
|
+
import { join } from "path"
|
|
4
|
+
import { ObjectStoreBuckets } from "../../constants"
|
|
5
|
+
import { updateClientLibrary } from "./clientLibrary"
|
|
6
|
+
import env from "../../environment"
|
|
7
|
+
import { objectStore, context } from "@budibase/backend-core"
|
|
8
|
+
import { TOP_LEVEL_PATH } from "./filesystem"
|
|
9
|
+
|
|
10
|
+
export const NODE_MODULES_PATH = join(TOP_LEVEL_PATH, "node_modules")
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Uploads the latest client library to the object store.
|
|
14
|
+
* @param {string} appId The ID of the app which is being created.
|
|
15
|
+
* @return {Promise<void>} once promise completes app resources should be ready in object store.
|
|
16
|
+
*/
|
|
17
|
+
export const createApp = async (appId: string) => {
|
|
18
|
+
await updateClientLibrary(appId)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Removes all of the assets created for an app in the object store.
|
|
23
|
+
* @param {string} appId The ID of the app which is being deleted.
|
|
24
|
+
* @return {Promise<void>} once promise completes the app resources will be removed from object store.
|
|
25
|
+
*/
|
|
26
|
+
export const deleteApp = async (appId: string) => {
|
|
27
|
+
await objectStore.deleteFolder(ObjectStoreBuckets.APPS, `${appId}/`)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Retrieves component libraries from object store (or tmp symlink if in local)
|
|
32
|
+
*/
|
|
33
|
+
export const getComponentLibraryManifest = async (library: string) => {
|
|
34
|
+
const appId = context.getAppId()
|
|
35
|
+
const filename = "manifest.json"
|
|
36
|
+
/* istanbul ignore next */
|
|
37
|
+
// when testing in cypress and so on we need to get the package
|
|
38
|
+
// as the environment may not be fully fleshed out for dev or prod
|
|
39
|
+
if (env.isTest()) {
|
|
40
|
+
library = library.replace("standard-components", "client")
|
|
41
|
+
const lib = library.split("/")[1]
|
|
42
|
+
const path = require.resolve(library).split(lib)[0]
|
|
43
|
+
return require(join(path, lib, filename))
|
|
44
|
+
} else if (env.isDev()) {
|
|
45
|
+
const path = join(NODE_MODULES_PATH, "@budibase", "client", filename)
|
|
46
|
+
// always load from new so that updates are refreshed
|
|
47
|
+
delete require.cache[require.resolve(path)]
|
|
48
|
+
return require(path)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
if (!appId) {
|
|
52
|
+
throw new Error("No app ID found - cannot get component libraries")
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
let resp
|
|
56
|
+
let path
|
|
57
|
+
try {
|
|
58
|
+
// Try to load the manifest from the new file location
|
|
59
|
+
path = join(appId, filename)
|
|
60
|
+
resp = await objectStore.retrieve(ObjectStoreBuckets.APPS, path)
|
|
61
|
+
} catch (error) {
|
|
62
|
+
console.error(
|
|
63
|
+
`component-manifest-objectstore=failed appId=${appId} path=${path}`,
|
|
64
|
+
error
|
|
65
|
+
)
|
|
66
|
+
// Fallback to loading it from the old location for old apps
|
|
67
|
+
path = join(appId, "node_modules", library, "package", filename)
|
|
68
|
+
resp = await objectStore.retrieve(ObjectStoreBuckets.APPS, path)
|
|
69
|
+
}
|
|
70
|
+
if (typeof resp !== "string") {
|
|
71
|
+
resp = resp.toString("utf8")
|
|
72
|
+
}
|
|
73
|
+
return JSON.parse(resp)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Given a set of app IDs makes sure file system is cleared of any of their temp info.
|
|
78
|
+
*/
|
|
79
|
+
export const cleanup = (appIds: string[]) => {
|
|
80
|
+
for (let appId of appIds) {
|
|
81
|
+
const path = join(budibaseTempDir(), appId)
|
|
82
|
+
if (fs.existsSync(path)) {
|
|
83
|
+
fs.rmdirSync(path, { recursive: true })
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -4,7 +4,7 @@ import fs from "fs"
|
|
|
4
4
|
import { objectStore } from "@budibase/backend-core"
|
|
5
5
|
import { resolve } from "../centralPath"
|
|
6
6
|
import env from "../../environment"
|
|
7
|
-
|
|
7
|
+
import { TOP_LEVEL_PATH } from "./filesystem"
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Client library paths in the object store:
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { PathLike } from "fs"
|
|
2
|
+
const { budibaseTempDir } = require("../budibaseDir")
|
|
3
|
+
const fs = require("fs")
|
|
4
|
+
const { join } = require("path")
|
|
5
|
+
const uuid = require("uuid/v4")
|
|
6
|
+
const env = require("../../environment")
|
|
7
|
+
import tar from "tar"
|
|
8
|
+
|
|
9
|
+
export const TOP_LEVEL_PATH = join(__dirname, "..", "..", "..")
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Upon first startup of instance there may not be everything we need in tmp directory, set it up.
|
|
13
|
+
*/
|
|
14
|
+
export const init = () => {
|
|
15
|
+
const tempDir = budibaseTempDir()
|
|
16
|
+
if (!fs.existsSync(tempDir)) {
|
|
17
|
+
// some test cases fire this quickly enough that
|
|
18
|
+
// synchronous cases can end up here at the same time
|
|
19
|
+
try {
|
|
20
|
+
fs.mkdirSync(tempDir)
|
|
21
|
+
} catch (err: any) {
|
|
22
|
+
if (!err || err.code !== "EEXIST") {
|
|
23
|
+
throw err
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
const clientLibPath = join(budibaseTempDir(), "budibase-client.js")
|
|
28
|
+
if (env.isTest() && !fs.existsSync(clientLibPath)) {
|
|
29
|
+
fs.copyFileSync(require.resolve("@budibase/client"), clientLibPath)
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Checks if the system is currently in development mode and if it is makes sure
|
|
35
|
+
* everything required to function is ready.
|
|
36
|
+
*/
|
|
37
|
+
export const checkDevelopmentEnvironment = () => {
|
|
38
|
+
if (!env.isDev() || env.isTest()) {
|
|
39
|
+
return
|
|
40
|
+
}
|
|
41
|
+
if (!fs.existsSync(budibaseTempDir())) {
|
|
42
|
+
fs.mkdirSync(budibaseTempDir())
|
|
43
|
+
}
|
|
44
|
+
let error
|
|
45
|
+
if (!fs.existsSync(join(process.cwd(), ".env"))) {
|
|
46
|
+
error = "Must run via yarn once to generate environment."
|
|
47
|
+
}
|
|
48
|
+
if (error) {
|
|
49
|
+
console.error(error)
|
|
50
|
+
process.exit(-1)
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Used to retrieve a handlebars file from the system which will be used as a template.
|
|
56
|
+
* This is allowable as the template handlebars files should be static and identical across
|
|
57
|
+
* the cluster.
|
|
58
|
+
* @param {string} path The path to the handlebars file which is to be loaded.
|
|
59
|
+
* @returns {string} The loaded handlebars file as a string - loaded as utf8.
|
|
60
|
+
*/
|
|
61
|
+
export const loadHandlebarsFile = (path: PathLike) => {
|
|
62
|
+
return fs.readFileSync(path, "utf8")
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* When return a file from the API need to write the file to the system temporarily so we
|
|
67
|
+
* can create a read stream to send.
|
|
68
|
+
* @param {string} contents the contents of the file which is to be returned from the API.
|
|
69
|
+
* @return {Object} the read stream which can be put into the koa context body.
|
|
70
|
+
*/
|
|
71
|
+
export const apiFileReturn = (contents: any) => {
|
|
72
|
+
const path = join(budibaseTempDir(), uuid())
|
|
73
|
+
fs.writeFileSync(path, contents)
|
|
74
|
+
return fs.createReadStream(path)
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export const streamFile = (path: string) => {
|
|
78
|
+
return fs.createReadStream(path)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Writes the provided contents to a temporary file, which can be used briefly.
|
|
83
|
+
* @param {string} fileContents contents which will be written to a temp file.
|
|
84
|
+
* @return {string} the path to the temp file.
|
|
85
|
+
*/
|
|
86
|
+
export const storeTempFile = (fileContents: any) => {
|
|
87
|
+
const path = join(budibaseTempDir(), uuid())
|
|
88
|
+
fs.writeFileSync(path, fileContents)
|
|
89
|
+
return path
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Utility function for getting a file read stream - a simple in memory buffered read
|
|
94
|
+
* stream doesn't work for pouchdb.
|
|
95
|
+
*/
|
|
96
|
+
export const stringToFileStream = (contents: any) => {
|
|
97
|
+
const path = storeTempFile(contents)
|
|
98
|
+
return fs.createReadStream(path)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Creates a temp file and returns it from the API.
|
|
103
|
+
* @param {string} fileContents the contents to be returned in file.
|
|
104
|
+
*/
|
|
105
|
+
export const sendTempFile = (fileContents: any) => {
|
|
106
|
+
const path = storeTempFile(fileContents)
|
|
107
|
+
return fs.createReadStream(path)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* All file reads come through here just to make sure all of them make sense
|
|
112
|
+
* allows a centralised location to check logic is all good.
|
|
113
|
+
*/
|
|
114
|
+
export const readFileSync = (filepath: PathLike, options = "utf8") => {
|
|
115
|
+
return fs.readFileSync(filepath, options)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export const createTempFolder = (item: any) => {
|
|
119
|
+
const path = join(budibaseTempDir(), item)
|
|
120
|
+
try {
|
|
121
|
+
// remove old tmp directories automatically - don't combine
|
|
122
|
+
if (fs.existsSync(path)) {
|
|
123
|
+
fs.rmSync(path, { recursive: true, force: true })
|
|
124
|
+
}
|
|
125
|
+
fs.mkdirSync(path)
|
|
126
|
+
} catch (err: any) {
|
|
127
|
+
throw new Error(`Path cannot be created: ${err.message}`)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return path
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export const extractTarball = async (fromFilePath: string, toPath: string) => {
|
|
134
|
+
await tar.extract({
|
|
135
|
+
file: fromFilePath,
|
|
136
|
+
C: toPath,
|
|
137
|
+
})
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Find for a file recursively from start path applying filter, return first match
|
|
142
|
+
*/
|
|
143
|
+
export const findFileRec = (startPath: PathLike, filter: string): any => {
|
|
144
|
+
if (!fs.existsSync(startPath)) {
|
|
145
|
+
return
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
const files = fs.readdirSync(startPath)
|
|
149
|
+
for (let i = 0, len = files.length; i < len; i++) {
|
|
150
|
+
const filename = join(startPath, files[i])
|
|
151
|
+
const stat = fs.lstatSync(filename)
|
|
152
|
+
|
|
153
|
+
if (stat.isDirectory()) {
|
|
154
|
+
return findFileRec(filename, filter)
|
|
155
|
+
} else if (filename.endsWith(filter)) {
|
|
156
|
+
return filename
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Remove a folder which is not empty from the file system
|
|
163
|
+
*/
|
|
164
|
+
export const deleteFolderFileSystem = (path: PathLike) => {
|
|
165
|
+
if (!fs.existsSync(path)) {
|
|
166
|
+
return
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
fs.rmSync(path, { recursive: true, force: true })
|
|
170
|
+
}
|