@budibase/server 2.6.22 → 2.6.24-alpha.0
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/.dockerignore +7 -6
- package/Dockerfile +16 -8
- package/builder/assets/index.50121870.js +1869 -0
- package/builder/assets/index.a86e2071.css +6 -0
- package/builder/index.html +2 -2
- package/client/manifest.json +5229 -0
- package/dist/automation.js +32576 -0
- package/dist/automation.js.map +7 -0
- package/dist/index.js +45065 -13
- package/dist/index.js.map +7 -0
- package/dist/query.js +24462 -0
- package/dist/query.js.map +7 -0
- package/jest.config.ts +6 -3
- package/nodemon.json +8 -4
- package/package.json +35 -16
- package/pm2.config.js +1 -1
- package/scripts/build.js +48 -0
- package/src/api/controllers/application.ts +21 -22
- package/src/api/controllers/automation.ts +37 -9
- package/src/api/controllers/datasource.ts +114 -49
- package/src/api/controllers/deploy/index.ts +1 -0
- package/src/api/controllers/integration.ts +3 -3
- package/src/api/controllers/plugin/index.ts +1 -1
- package/src/api/controllers/row/external.ts +39 -15
- package/src/api/controllers/row/index.ts +18 -24
- package/src/api/controllers/row/internal.ts +1 -1
- package/src/api/controllers/row/staticFormula.ts +6 -1
- package/src/api/controllers/row/utils.ts +12 -0
- package/src/api/controllers/static/index.ts +3 -3
- package/src/api/controllers/table/index.ts +3 -0
- package/src/api/controllers/table/internal.ts +2 -6
- package/src/api/controllers/table/utils.ts +32 -1
- package/src/api/controllers/view/index.ts +5 -5
- package/src/api/controllers/webhook.ts +33 -9
- package/src/api/routes/application.ts +5 -0
- package/src/api/routes/automation.ts +0 -1
- package/src/api/routes/datasource.ts +10 -0
- package/src/api/routes/static.ts +3 -1
- package/src/api/routes/tests/{automation.spec.js → automation.spec.ts} +106 -31
- package/src/api/routes/tests/datasource.spec.ts +1 -1
- package/src/api/routes/tests/view.spec.js +4 -3
- package/src/api/routes/tests/{webhook.spec.js → webhook.spec.ts} +33 -11
- package/src/app.ts +0 -1
- package/src/automations/actions.ts +8 -0
- package/src/automations/logging/index.ts +21 -0
- package/src/automations/steps/bash.ts +4 -0
- package/src/automations/steps/collect.ts +58 -0
- package/src/automations/steps/createRow.ts +4 -0
- package/src/automations/steps/delay.ts +1 -0
- package/src/automations/steps/deleteRow.ts +4 -0
- package/src/automations/steps/discord.ts +4 -0
- package/src/automations/steps/executeQuery.ts +4 -0
- package/src/automations/steps/executeScript.ts +4 -0
- package/src/automations/steps/filter.ts +1 -0
- package/src/automations/steps/loop.ts +1 -0
- package/src/automations/steps/make.ts +22 -1
- package/src/automations/steps/openai.ts +106 -0
- package/src/automations/steps/outgoingWebhook.ts +4 -0
- package/src/automations/steps/queryRows.ts +4 -0
- package/src/automations/steps/sendSmtpEmail.ts +4 -0
- package/src/automations/steps/serverLog.ts +4 -0
- package/src/automations/steps/slack.ts +4 -0
- package/src/automations/steps/updateRow.ts +4 -0
- package/src/automations/steps/zapier.ts +22 -1
- package/src/automations/tests/make.spec.ts +54 -0
- package/src/automations/tests/openai.spec.ts +86 -0
- package/src/automations/tests/zapier.spec.ts +56 -0
- package/src/automations/triggers.ts +3 -2
- package/src/constants/index.ts +17 -16
- package/src/db/dynamoClient.ts +1 -1
- package/src/db/inMemoryView.ts +1 -0
- package/src/db/linkedRows/index.ts +5 -3
- package/src/environment.ts +3 -0
- package/src/integration-test/postgres.spec.ts +47 -5
- package/src/integrations/airtable.ts +33 -4
- package/src/integrations/arangodb.ts +20 -2
- package/src/integrations/base/sqlTable.ts +0 -1
- package/src/integrations/couchdb.ts +20 -4
- package/src/integrations/dynamodb.ts +36 -5
- package/src/integrations/elasticsearch.ts +18 -1
- package/src/integrations/firebase.ts +17 -0
- package/src/integrations/googlesheets.ts +66 -5
- package/src/integrations/index.ts +12 -7
- package/src/integrations/microsoftSqlServer.ts +33 -1
- package/src/integrations/mongodb.ts +18 -0
- package/src/integrations/mysql.ts +53 -26
- package/src/integrations/oracle.ts +38 -6
- package/src/integrations/postgres.ts +47 -12
- package/src/integrations/redis.ts +35 -4
- package/src/integrations/s3.ts +21 -3
- package/src/integrations/snowflake.ts +25 -1
- package/src/integrations/tests/googlesheets.spec.ts +41 -9
- package/src/middleware/builder.ts +26 -18
- package/src/migrations/functions/backfill/app/queries.ts +1 -1
- package/src/sdk/app/automations/index.ts +2 -0
- package/src/sdk/app/automations/utils.ts +7 -0
- package/src/sdk/app/datasources/datasources.ts +7 -1
- package/src/sdk/plugins/plugins.ts +1 -1
- package/src/startup.ts +2 -0
- package/src/tests/utilities/TestConfiguration.ts +4 -2
- package/src/tests/utilities/structures.ts +42 -0
- package/src/threads/automation.ts +91 -23
- package/src/threads/index.ts +9 -3
- package/src/threads/utils.ts +2 -0
- package/src/utilities/fileSystem/app.ts +14 -4
- package/src/utilities/fileSystem/clientLibrary.ts +8 -3
- package/src/utilities/fileSystem/filesystem.ts +3 -1
- package/src/utilities/redis.ts +25 -3
- package/src/utilities/rowProcessor/index.ts +4 -1
- package/src/utilities/rowProcessor/map.ts +1 -1
- package/src/websockets/builder.ts +95 -0
- package/src/websockets/client.ts +2 -2
- package/src/websockets/grid.ts +44 -44
- package/src/websockets/index.ts +13 -6
- package/src/websockets/websocket.ts +211 -7
- package/tsconfig.build.json +9 -1
- package/tsconfig.json +1 -14
- package/builder/assets/index.86c992bf.css +0 -6
- package/builder/assets/index.c16c35ca.js +0 -1794
- package/dist/api/controllers/analytics.js +0 -46
- package/dist/api/controllers/apikeys.js +0 -72
- package/dist/api/controllers/application.js +0 -574
- package/dist/api/controllers/auth.js +0 -80
- package/dist/api/controllers/automation.js +0 -303
- package/dist/api/controllers/backup.js +0 -37
- package/dist/api/controllers/component.js +0 -59
- package/dist/api/controllers/datasource.js +0 -306
- package/dist/api/controllers/deploy/Deployment.js +0 -53
- package/dist/api/controllers/deploy/index.js +0 -198
- package/dist/api/controllers/dev.js +0 -146
- package/dist/api/controllers/integration.js +0 -28
- package/dist/api/controllers/layout.js +0 -49
- package/dist/api/controllers/metadata.js +0 -63
- package/dist/api/controllers/migrations.js +0 -29
- package/dist/api/controllers/ops.js +0 -40
- package/dist/api/controllers/permission.js +0 -162
- 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 -112
- 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 -27
- package/dist/api/controllers/public/applications.js +0 -146
- package/dist/api/controllers/public/mapping/applications.js +0 -29
- package/dist/api/controllers/public/mapping/index.js +0 -11
- package/dist/api/controllers/public/mapping/queries.js +0 -36
- package/dist/api/controllers/public/mapping/rows.js +0 -24
- package/dist/api/controllers/public/mapping/tables.js +0 -23
- package/dist/api/controllers/public/mapping/types.js +0 -2
- package/dist/api/controllers/public/mapping/users.js +0 -29
- package/dist/api/controllers/public/metrics.js +0 -113
- package/dist/api/controllers/public/queries.js +0 -58
- package/dist/api/controllers/public/rows.js +0 -120
- package/dist/api/controllers/public/tables.js +0 -95
- package/dist/api/controllers/public/users.js +0 -93
- package/dist/api/controllers/public/utils.js +0 -56
- package/dist/api/controllers/query/import/index.js +0 -87
- package/dist/api/controllers/query/import/sources/base/index.js +0 -75
- package/dist/api/controllers/query/import/sources/base/openapi.js +0 -42
- package/dist/api/controllers/query/import/sources/curl.js +0 -99
- package/dist/api/controllers/query/import/sources/openapi2.js +0 -145
- package/dist/api/controllers/query/import/sources/openapi3.js +0 -177
- package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +0 -253
- package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +0 -1054
- package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +0 -253
- package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +0 -1225
- package/dist/api/controllers/query/index.js +0 -299
- package/dist/api/controllers/query/validation.js +0 -53
- package/dist/api/controllers/role.js +0 -109
- package/dist/api/controllers/routing.js +0 -105
- package/dist/api/controllers/row/ExternalRequest.js +0 -683
- package/dist/api/controllers/row/external.js +0 -339
- package/dist/api/controllers/row/index.js +0 -203
- package/dist/api/controllers/row/internal.js +0 -509
- package/dist/api/controllers/row/internalSearch.js +0 -28
- package/dist/api/controllers/row/staticFormula.js +0 -165
- package/dist/api/controllers/row/utils.js +0 -183
- package/dist/api/controllers/screen.js +0 -110
- package/dist/api/controllers/script.js +0 -30
- package/dist/api/controllers/static/index.js +0 -268
- package/dist/api/controllers/table/bulkFormula.js +0 -173
- package/dist/api/controllers/table/external.js +0 -279
- package/dist/api/controllers/table/index.js +0 -179
- package/dist/api/controllers/table/internal.js +0 -197
- package/dist/api/controllers/table/utils.js +0 -379
- package/dist/api/controllers/templates.js +0 -56
- package/dist/api/controllers/user.js +0 -124
- package/dist/api/controllers/view/exporters.js +0 -46
- package/dist/api/controllers/view/index.js +0 -193
- package/dist/api/controllers/view/utils.js +0 -177
- package/dist/api/controllers/view/viewBuilder.js +0 -158
- package/dist/api/controllers/webhook.js +0 -134
- package/dist/api/index.js +0 -55
- package/dist/api/routes/analytics.js +0 -34
- package/dist/api/routes/apikeys.js +0 -37
- package/dist/api/routes/application.js +0 -48
- package/dist/api/routes/auth.js +0 -33
- package/dist/api/routes/automation.js +0 -50
- package/dist/api/routes/backup.js +0 -35
- package/dist/api/routes/component.js +0 -35
- package/dist/api/routes/datasource.js +0 -43
- package/dist/api/routes/deploy.js +0 -37
- package/dist/api/routes/dev.js +0 -49
- package/dist/api/routes/index.js +0 -75
- package/dist/api/routes/integration.js +0 -37
- package/dist/api/routes/layout.js +0 -37
- package/dist/api/routes/metadata.js +0 -40
- package/dist/api/routes/migrations.js +0 -36
- package/dist/api/routes/ops.js +0 -52
- package/dist/api/routes/permission.js +0 -44
- package/dist/api/routes/plugin.js +0 -39
- package/dist/api/routes/public/applications.js +0 -174
- package/dist/api/routes/public/index.js +0 -140
- package/dist/api/routes/public/metrics.js +0 -30
- package/dist/api/routes/public/middleware/mapper.js +0 -97
- package/dist/api/routes/public/queries.js +0 -72
- package/dist/api/routes/public/rows.js +0 -158
- package/dist/api/routes/public/tables.js +0 -152
- package/dist/api/routes/public/users.js +0 -135
- package/dist/api/routes/public/utils/Endpoint.js +0 -36
- package/dist/api/routes/query.js +0 -47
- package/dist/api/routes/role.js +0 -40
- package/dist/api/routes/routing.js +0 -39
- package/dist/api/routes/row.js +0 -239
- package/dist/api/routes/screen.js +0 -39
- package/dist/api/routes/script.js +0 -35
- package/dist/api/routes/static.js +0 -80
- package/dist/api/routes/table.js +0 -163
- package/dist/api/routes/templates.js +0 -37
- package/dist/api/routes/user.js +0 -43
- package/dist/api/routes/utils/validators.js +0 -238
- package/dist/api/routes/view.js +0 -42
- package/dist/api/routes/webhook.js +0 -43
- package/dist/app.js +0 -132
- package/dist/automations/actions.js +0 -137
- package/dist/automations/automationUtils.js +0 -173
- package/dist/automations/bullboard.js +0 -71
- package/dist/automations/index.js +0 -43
- package/dist/automations/logging/index.js +0 -53
- package/dist/automations/steps/bash.js +0 -111
- package/dist/automations/steps/createRow.js +0 -108
- package/dist/automations/steps/delay.js +0 -53
- package/dist/automations/steps/deleteRow.js +0 -96
- package/dist/automations/steps/discord.js +0 -116
- package/dist/automations/steps/executeQuery.js +0 -134
- package/dist/automations/steps/executeScript.js +0 -106
- package/dist/automations/steps/filter.js +0 -112
- package/dist/automations/steps/loop.js +0 -54
- package/dist/automations/steps/make.js +0 -120
- package/dist/automations/steps/outgoingWebhook.js +0 -166
- package/dist/automations/steps/queryRows.js +0 -220
- package/dist/automations/steps/sendSmtpEmail.js +0 -115
- package/dist/automations/steps/serverLog.js +0 -65
- package/dist/automations/steps/slack.js +0 -98
- package/dist/automations/steps/updateRow.js +0 -144
- package/dist/automations/steps/utils.js +0 -56
- package/dist/automations/steps/zapier.js +0 -117
- package/dist/automations/triggerInfo/app.js +0 -36
- package/dist/automations/triggerInfo/cron.js +0 -35
- package/dist/automations/triggerInfo/index.js +0 -40
- package/dist/automations/triggerInfo/rowDeleted.js +0 -36
- package/dist/automations/triggerInfo/rowSaved.js +0 -44
- package/dist/automations/triggerInfo/rowUpdated.js +0 -44
- package/dist/automations/triggerInfo/webhook.js +0 -40
- package/dist/automations/triggers.js +0 -181
- package/dist/automations/utils.js +0 -275
- package/dist/constants/definitions.js +0 -2
- package/dist/constants/index.js +0 -181
- package/dist/constants/layouts.js +0 -148
- package/dist/constants/screens.js +0 -51
- package/dist/db/defaultData/datasource_bb_default.js +0 -574
- package/dist/db/defaultData/employeeImport.js +0 -155
- package/dist/db/defaultData/expensesImport.js +0 -117
- package/dist/db/defaultData/inventoryImport.js +0 -109
- package/dist/db/defaultData/jobsImport.js +0 -152
- package/dist/db/dynamoClient.js +0 -124
- package/dist/db/inMemoryView.js +0 -62
- package/dist/db/index.js +0 -43
- package/dist/db/linkedRows/LinkController.js +0 -392
- package/dist/db/linkedRows/LinkDocument.js +0 -33
- package/dist/db/linkedRows/index.js +0 -206
- package/dist/db/linkedRows/linkUtils.js +0 -131
- package/dist/db/newid.js +0 -7
- package/dist/db/utils.js +0 -248
- package/dist/db/views/staticViews.js +0 -144
- package/dist/ddApm.js +0 -11
- package/dist/definitions/automations.js +0 -8
- package/dist/definitions/common.js +0 -2
- package/dist/definitions/datasource.js +0 -7
- package/dist/definitions/openapi.js +0 -6
- package/dist/environment.js +0 -109
- package/dist/events/AutomationEmitter.js +0 -53
- package/dist/events/BudibaseEmitter.js +0 -25
- package/dist/events/docUpdates/index.js +0 -17
- package/dist/events/docUpdates/processors.js +0 -18
- package/dist/events/docUpdates/syncUsers.js +0 -49
- package/dist/events/index.js +0 -11
- package/dist/events/utils.js +0 -43
- package/dist/integrations/airtable.js +0 -147
- package/dist/integrations/arangodb.js +0 -103
- package/dist/integrations/base/query.js +0 -32
- package/dist/integrations/base/sql.js +0 -600
- package/dist/integrations/base/sqlTable.js +0 -167
- package/dist/integrations/base/types.js +0 -2
- package/dist/integrations/couchdb.js +0 -125
- package/dist/integrations/dynamodb.js +0 -194
- package/dist/integrations/elasticsearch.js +0 -186
- package/dist/integrations/firebase.js +0 -174
- package/dist/integrations/googlesheets.js +0 -455
- package/dist/integrations/index.js +0 -135
- package/dist/integrations/microsoftSqlServer.js +0 -273
- package/dist/integrations/mongodb.js +0 -614
- package/dist/integrations/mysql.js +0 -256
- package/dist/integrations/oracle.js +0 -375
- package/dist/integrations/postgres.js +0 -300
- package/dist/integrations/queries/sql.js +0 -84
- package/dist/integrations/redis.js +0 -168
- package/dist/integrations/rest.js +0 -400
- package/dist/integrations/s3.js +0 -237
- package/dist/integrations/snowflake.js +0 -99
- package/dist/integrations/utils.js +0 -295
- package/dist/middleware/appInfo.js +0 -22
- package/dist/middleware/authorized.js +0 -112
- package/dist/middleware/builder.js +0 -93
- package/dist/middleware/currentapp.js +0 -103
- package/dist/middleware/joi-validator.js +0 -43
- package/dist/middleware/publicApi.js +0 -25
- package/dist/middleware/resourceId.js +0 -59
- package/dist/middleware/selfhost.js +0 -24
- package/dist/middleware/utils.js +0 -8
- package/dist/migrations/functions/appUrls.js +0 -42
- package/dist/migrations/functions/backfill/app/automations.js +0 -31
- package/dist/migrations/functions/backfill/app/datasources.js +0 -28
- package/dist/migrations/functions/backfill/app/layouts.js +0 -33
- package/dist/migrations/functions/backfill/app/queries.js +0 -50
- package/dist/migrations/functions/backfill/app/roles.js +0 -28
- package/dist/migrations/functions/backfill/app/screens.js +0 -28
- package/dist/migrations/functions/backfill/app/tables.js +0 -37
- package/dist/migrations/functions/backfill/app.js +0 -176
- package/dist/migrations/functions/backfill/global/configs.js +0 -67
- package/dist/migrations/functions/backfill/global/quotas.js +0 -60
- package/dist/migrations/functions/backfill/global/users.js +0 -50
- package/dist/migrations/functions/backfill/global.js +0 -205
- package/dist/migrations/functions/backfill/index.js +0 -32
- package/dist/migrations/functions/backfill/installation.js +0 -80
- package/dist/migrations/functions/syncQuotas.js +0 -52
- package/dist/migrations/functions/tableSettings.js +0 -130
- package/dist/migrations/functions/usageQuotas/index.js +0 -16
- package/dist/migrations/functions/usageQuotas/syncApps.js +0 -24
- package/dist/migrations/functions/usageQuotas/syncPlugins.js +0 -23
- package/dist/migrations/functions/usageQuotas/syncRows.js +0 -33
- package/dist/migrations/functions/usageQuotas/syncUsers.js +0 -21
- package/dist/migrations/functions/userEmailViewCasing.js +0 -24
- package/dist/migrations/index.js +0 -111
- package/dist/migrations/tests/helpers.js +0 -72
- package/dist/migrations/tests/structures.js +0 -37
- package/dist/sdk/app/applications/index.js +0 -28
- package/dist/sdk/app/applications/sync.js +0 -164
- package/dist/sdk/app/applications/utils.js +0 -21
- package/dist/sdk/app/automations/index.js +0 -29
- package/dist/sdk/app/automations/webhook.js +0 -54
- package/dist/sdk/app/backups/constants.js +0 -6
- package/dist/sdk/app/backups/exports.js +0 -160
- package/dist/sdk/app/backups/imports.js +0 -170
- package/dist/sdk/app/backups/index.js +0 -29
- package/dist/sdk/app/backups/statistics.js +0 -73
- package/dist/sdk/app/datasources/datasources.js +0 -166
- package/dist/sdk/app/datasources/index.js +0 -27
- package/dist/sdk/app/queries/index.js +0 -27
- package/dist/sdk/app/queries/queries.js +0 -60
- package/dist/sdk/app/rows/attachments.js +0 -61
- package/dist/sdk/app/rows/index.js +0 -28
- package/dist/sdk/app/rows/rows.js +0 -30
- package/dist/sdk/app/tables/index.js +0 -65
- package/dist/sdk/index.js +0 -27
- package/dist/sdk/plugins/index.js +0 -27
- package/dist/sdk/plugins/plugins.js +0 -53
- package/dist/sdk/users/index.js +0 -27
- package/dist/sdk/users/utils.js +0 -94
- package/dist/sdk/utils/index.js +0 -29
- package/dist/startup.js +0 -158
- package/dist/threads/automation.js +0 -450
- package/dist/threads/definitions.js +0 -2
- package/dist/threads/index.js +0 -140
- package/dist/threads/query.js +0 -265
- package/dist/threads/utils.js +0 -120
- package/dist/tsconfig.build.tsbuildinfo +0 -1
- package/dist/utilities/appDirectoryTemplate/package.json +0 -10
- package/dist/utilities/budibaseDir.js +0 -5
- package/dist/utilities/centralPath.js +0 -27
- package/dist/utilities/csv.js +0 -33
- package/dist/utilities/fileSystem/app.js +0 -88
- package/dist/utilities/fileSystem/clientLibrary.js +0 -138
- package/dist/utilities/fileSystem/filesystem.js +0 -180
- package/dist/utilities/fileSystem/index.js +0 -21
- package/dist/utilities/fileSystem/plugin.js +0 -76
- package/dist/utilities/fileSystem/processor.js +0 -34
- package/dist/utilities/fileSystem/template.js +0 -47
- package/dist/utilities/global.js +0 -146
- package/dist/utilities/index.js +0 -143
- package/dist/utilities/redis.js +0 -117
- package/dist/utilities/retry.js +0 -30
- package/dist/utilities/routing/index.js +0 -39
- package/dist/utilities/rowProcessor/index.js +0 -282
- package/dist/utilities/rowProcessor/map.js +0 -116
- package/dist/utilities/rowProcessor/utils.js +0 -87
- package/dist/utilities/schema.js +0 -112
- package/dist/utilities/scriptRunner.js +0 -26
- package/dist/utilities/security.js +0 -57
- package/dist/utilities/statusCodes.js +0 -9
- package/dist/utilities/usageQuota/rows.js +0 -88
- package/dist/utilities/usageQuota/usageQuoteReset.js +0 -16
- package/dist/utilities/users.js +0 -57
- package/dist/utilities/workerRequests.js +0 -171
- package/dist/watch.js +0 -53
- package/dist/websockets/client.js +0 -14
- package/dist/websockets/grid.js +0 -60
- package/dist/websockets/index.js +0 -17
- package/dist/websockets/websocket.js +0 -78
- package/src/automations/tests/zapier.spec.js +0 -27
- /package/dist/{api/controllers/static/templates/BudibaseApp.svelte → BudibaseApp-Y5NZEDTC.svelte} +0 -0
- /package/dist/{api/controllers/static/templates/app.hbs → app.hbs} +0 -0
- /package/dist/{api/controllers/static/templates/preview.hbs → preview.hbs} +0 -0
|
@@ -17,14 +17,15 @@ jest.mock("google-spreadsheet")
|
|
|
17
17
|
const { GoogleSpreadsheet } = require("google-spreadsheet")
|
|
18
18
|
|
|
19
19
|
const sheetsByTitle: { [title: string]: GoogleSpreadsheetWorksheet } = {}
|
|
20
|
+
const sheetsByIndex: GoogleSpreadsheetWorksheet[] = []
|
|
21
|
+
const mockGoogleIntegration = {
|
|
22
|
+
useOAuth2Client: jest.fn(),
|
|
23
|
+
loadInfo: jest.fn(),
|
|
24
|
+
sheetsByTitle,
|
|
25
|
+
sheetsByIndex,
|
|
26
|
+
}
|
|
20
27
|
|
|
21
|
-
GoogleSpreadsheet.mockImplementation(() =>
|
|
22
|
-
return {
|
|
23
|
-
useOAuth2Client: jest.fn(),
|
|
24
|
-
loadInfo: jest.fn(),
|
|
25
|
-
sheetsByTitle,
|
|
26
|
-
}
|
|
27
|
-
})
|
|
28
|
+
GoogleSpreadsheet.mockImplementation(() => mockGoogleIntegration)
|
|
28
29
|
|
|
29
30
|
import { structures } from "@budibase/backend-core/tests"
|
|
30
31
|
import TestConfiguration from "../../tests/utilities/TestConfiguration"
|
|
@@ -53,6 +54,8 @@ describe("Google Sheets Integration", () => {
|
|
|
53
54
|
},
|
|
54
55
|
})
|
|
55
56
|
await config.init()
|
|
57
|
+
|
|
58
|
+
jest.clearAllMocks()
|
|
56
59
|
})
|
|
57
60
|
|
|
58
61
|
function createBasicTable(name: string, columns: string[]): Table {
|
|
@@ -88,7 +91,7 @@ describe("Google Sheets Integration", () => {
|
|
|
88
91
|
}
|
|
89
92
|
|
|
90
93
|
describe("update table", () => {
|
|
91
|
-
|
|
94
|
+
it("adding a new field will be adding a new header row", async () => {
|
|
92
95
|
await config.doInContext(structures.uuid(), async () => {
|
|
93
96
|
const tableColumns = ["name", "description", "new field"]
|
|
94
97
|
const table = createBasicTable(structures.uuid(), tableColumns)
|
|
@@ -103,7 +106,7 @@ describe("Google Sheets Integration", () => {
|
|
|
103
106
|
})
|
|
104
107
|
})
|
|
105
108
|
|
|
106
|
-
|
|
109
|
+
it("removing an existing field will remove the header from the google sheet", async () => {
|
|
107
110
|
const sheet = await config.doInContext(structures.uuid(), async () => {
|
|
108
111
|
const tableColumns = ["name"]
|
|
109
112
|
const table = createBasicTable(structures.uuid(), tableColumns)
|
|
@@ -123,4 +126,33 @@ describe("Google Sheets Integration", () => {
|
|
|
123
126
|
expect((sheet.setHeaderRow as any).mock.calls[0][0]).toHaveLength(1)
|
|
124
127
|
})
|
|
125
128
|
})
|
|
129
|
+
|
|
130
|
+
describe("getTableNames", () => {
|
|
131
|
+
it("can fetch table names", async () => {
|
|
132
|
+
await config.doInContext(structures.uuid(), async () => {
|
|
133
|
+
const sheetNames: string[] = []
|
|
134
|
+
for (let i = 0; i < 5; i++) {
|
|
135
|
+
const sheet = createSheet({ headerValues: [] })
|
|
136
|
+
sheetsByIndex.push(sheet)
|
|
137
|
+
sheetNames.push(sheet.title)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
const res = await integration.getTableNames()
|
|
141
|
+
|
|
142
|
+
expect(mockGoogleIntegration.loadInfo).toBeCalledTimes(1)
|
|
143
|
+
expect(res).toEqual(sheetNames)
|
|
144
|
+
})
|
|
145
|
+
})
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
describe("testConnection", () => {
|
|
149
|
+
it("can test successful connections", async () => {
|
|
150
|
+
await config.doInContext(structures.uuid(), async () => {
|
|
151
|
+
const res = await integration.testConnection()
|
|
152
|
+
|
|
153
|
+
expect(mockGoogleIntegration.loadInfo).toBeCalledTimes(1)
|
|
154
|
+
expect(res).toEqual({ connected: true })
|
|
155
|
+
})
|
|
156
|
+
})
|
|
157
|
+
})
|
|
126
158
|
})
|
|
@@ -9,8 +9,8 @@ import {
|
|
|
9
9
|
checkDebounce,
|
|
10
10
|
setDebounce,
|
|
11
11
|
} from "../utilities/redis"
|
|
12
|
-
import { db as dbCore, cache
|
|
13
|
-
import {
|
|
12
|
+
import { db as dbCore, cache } from "@budibase/backend-core"
|
|
13
|
+
import { UserCtx, Database } from "@budibase/types"
|
|
14
14
|
|
|
15
15
|
const DEBOUNCE_TIME_SEC = 30
|
|
16
16
|
|
|
@@ -23,7 +23,7 @@ const DEBOUNCE_TIME_SEC = 30
|
|
|
23
23
|
* through the authorized middleware *
|
|
24
24
|
****************************************************/
|
|
25
25
|
|
|
26
|
-
async function checkDevAppLocks(ctx:
|
|
26
|
+
async function checkDevAppLocks(ctx: UserCtx) {
|
|
27
27
|
const appId = ctx.appId
|
|
28
28
|
|
|
29
29
|
// if any public usage, don't proceed
|
|
@@ -35,15 +35,14 @@ async function checkDevAppLocks(ctx: BBContext) {
|
|
|
35
35
|
if (!appId || !appId.startsWith(APP_DEV_PREFIX)) {
|
|
36
36
|
return
|
|
37
37
|
}
|
|
38
|
-
if (!(await doesUserHaveLock(appId, ctx.user))) {
|
|
39
|
-
ctx.throw(400, "User does not hold app lock.")
|
|
40
|
-
}
|
|
41
38
|
|
|
42
|
-
//
|
|
43
|
-
await
|
|
39
|
+
// If this user already owns the lock, then update it
|
|
40
|
+
if (await doesUserHaveLock(appId, ctx.user)) {
|
|
41
|
+
await updateLock(appId, ctx.user)
|
|
42
|
+
}
|
|
44
43
|
}
|
|
45
44
|
|
|
46
|
-
async function updateAppUpdatedAt(ctx:
|
|
45
|
+
async function updateAppUpdatedAt(ctx: UserCtx) {
|
|
47
46
|
const appId = ctx.appId
|
|
48
47
|
// if debouncing skip this update
|
|
49
48
|
// get methods also aren't updating
|
|
@@ -51,20 +50,29 @@ async function updateAppUpdatedAt(ctx: BBContext) {
|
|
|
51
50
|
return
|
|
52
51
|
}
|
|
53
52
|
await dbCore.doWithDB(appId, async (db: Database) => {
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
try {
|
|
54
|
+
const metadata = await db.get(DocumentType.APP_METADATA)
|
|
55
|
+
metadata.updatedAt = new Date().toISOString()
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
metadata.updatedBy = getGlobalIDFromUserMetadataID(ctx.user?.userId!)
|
|
58
58
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
59
|
+
const response = await db.put(metadata)
|
|
60
|
+
metadata._rev = response.rev
|
|
61
|
+
await cache.app.invalidateAppMetadata(appId, metadata)
|
|
62
|
+
// set a new debounce record with a short TTL
|
|
63
|
+
await setDebounce(appId, DEBOUNCE_TIME_SEC)
|
|
64
|
+
} catch (err: any) {
|
|
65
|
+
// if a 409 occurs, then multiple clients connected at the same time - ignore
|
|
66
|
+
if (err?.status === 409) {
|
|
67
|
+
return
|
|
68
|
+
} else {
|
|
69
|
+
throw err
|
|
70
|
+
}
|
|
71
|
+
}
|
|
64
72
|
})
|
|
65
73
|
}
|
|
66
74
|
|
|
67
|
-
export default async function builder(ctx:
|
|
75
|
+
export default async function builder(ctx: UserCtx) {
|
|
68
76
|
const appId = ctx.appId
|
|
69
77
|
// this only functions within an app context
|
|
70
78
|
if (!appId) {
|
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
import { cloneDeep } from "lodash/fp"
|
|
14
14
|
import { getEnvironmentVariables } from "../../utils"
|
|
15
15
|
import { getDefinitions, getDefinition } from "../../../integrations"
|
|
16
|
+
import _ from "lodash"
|
|
16
17
|
|
|
17
18
|
const ENV_VAR_PREFIX = "env."
|
|
18
19
|
|
|
@@ -41,7 +42,7 @@ async function enrichDatasourceWithValues(datasource: Datasource) {
|
|
|
41
42
|
{ onlyFound: true }
|
|
42
43
|
) as Datasource
|
|
43
44
|
const definition = await getDefinition(processed.source)
|
|
44
|
-
processed.config = checkDatasourceTypes(definition
|
|
45
|
+
processed.config = checkDatasourceTypes(definition!, processed.config)
|
|
45
46
|
return {
|
|
46
47
|
datasource: processed,
|
|
47
48
|
envVars: env as Record<string, string>,
|
|
@@ -147,6 +148,11 @@ export function mergeConfigs(update: Datasource, old: Datasource) {
|
|
|
147
148
|
}
|
|
148
149
|
}
|
|
149
150
|
}
|
|
151
|
+
|
|
152
|
+
if (old.config?.auth) {
|
|
153
|
+
update.config = _.merge(old.config, update.config)
|
|
154
|
+
}
|
|
155
|
+
|
|
150
156
|
// update back to actual passwords for everything else
|
|
151
157
|
for (let [key, value] of Object.entries(update.config)) {
|
|
152
158
|
if (value !== PASSWORD_REPLACEMENT) {
|
|
@@ -36,6 +36,6 @@ export async function processUploaded(plugin: FileType, source?: PluginSource) {
|
|
|
36
36
|
}
|
|
37
37
|
|
|
38
38
|
const doc = await pro.plugins.storePlugin(metadata, directory, source)
|
|
39
|
-
clientAppSocket
|
|
39
|
+
clientAppSocket?.emit("plugin-update", { name: doc.name, hash: doc.hash })
|
|
40
40
|
return doc
|
|
41
41
|
}
|
package/src/startup.ts
CHANGED
|
@@ -16,6 +16,7 @@ import * as bullboard from "./automations/bullboard"
|
|
|
16
16
|
import * as pro from "@budibase/pro"
|
|
17
17
|
import * as api from "./api"
|
|
18
18
|
import sdk from "./sdk"
|
|
19
|
+
import { initialise as initialiseWebsockets } from "./websockets"
|
|
19
20
|
|
|
20
21
|
let STARTUP_RAN = false
|
|
21
22
|
|
|
@@ -64,6 +65,7 @@ export async function startup(app?: any, server?: any) {
|
|
|
64
65
|
fileSystem.init()
|
|
65
66
|
await redis.init()
|
|
66
67
|
eventInit()
|
|
68
|
+
initialiseWebsockets(app, server)
|
|
67
69
|
|
|
68
70
|
// run migrations on startup if not done via http
|
|
69
71
|
// not recommended in a clustered environment
|
|
@@ -373,7 +373,7 @@ class TestConfiguration {
|
|
|
373
373
|
|
|
374
374
|
// HEADERS
|
|
375
375
|
|
|
376
|
-
defaultHeaders(extras = {}) {
|
|
376
|
+
defaultHeaders(extras = {}, prodApp = false) {
|
|
377
377
|
const tenantId = this.getTenantId()
|
|
378
378
|
const authObj: AuthToken = {
|
|
379
379
|
userId: this.defaultUserValues.globalUserId,
|
|
@@ -390,7 +390,9 @@ class TestConfiguration {
|
|
|
390
390
|
...extras,
|
|
391
391
|
}
|
|
392
392
|
|
|
393
|
-
if (
|
|
393
|
+
if (prodApp) {
|
|
394
|
+
headers[constants.Header.APP_ID] = this.prodAppId
|
|
395
|
+
} else if (this.appId) {
|
|
394
396
|
headers[constants.Header.APP_ID] = this.appId
|
|
395
397
|
}
|
|
396
398
|
return headers
|
|
@@ -199,6 +199,48 @@ export function loopAutomation(tableId: string, loopOpts?: any): Automation {
|
|
|
199
199
|
return automation as Automation
|
|
200
200
|
}
|
|
201
201
|
|
|
202
|
+
export function collectAutomation(tableId?: string): Automation {
|
|
203
|
+
const automation: any = {
|
|
204
|
+
name: "looping",
|
|
205
|
+
type: "automation",
|
|
206
|
+
definition: {
|
|
207
|
+
steps: [
|
|
208
|
+
{
|
|
209
|
+
id: "b",
|
|
210
|
+
type: "ACTION",
|
|
211
|
+
internal: true,
|
|
212
|
+
stepId: AutomationActionStepId.EXECUTE_SCRIPT,
|
|
213
|
+
inputs: {
|
|
214
|
+
code: "return [1,2,3]",
|
|
215
|
+
},
|
|
216
|
+
schema: BUILTIN_ACTION_DEFINITIONS.EXECUTE_SCRIPT.schema,
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
id: "c",
|
|
220
|
+
type: "ACTION",
|
|
221
|
+
internal: true,
|
|
222
|
+
stepId: AutomationActionStepId.COLLECT,
|
|
223
|
+
inputs: {
|
|
224
|
+
collection: "{{ literal steps.1.value }}",
|
|
225
|
+
},
|
|
226
|
+
schema: BUILTIN_ACTION_DEFINITIONS.SERVER_LOG.schema,
|
|
227
|
+
},
|
|
228
|
+
],
|
|
229
|
+
trigger: {
|
|
230
|
+
id: "a",
|
|
231
|
+
type: "TRIGGER",
|
|
232
|
+
event: "row:save",
|
|
233
|
+
stepId: AutomationTriggerStepId.ROW_SAVED,
|
|
234
|
+
inputs: {
|
|
235
|
+
tableId,
|
|
236
|
+
},
|
|
237
|
+
schema: TRIGGER_DEFINITIONS.ROW_SAVED.schema,
|
|
238
|
+
},
|
|
239
|
+
},
|
|
240
|
+
}
|
|
241
|
+
return automation as Automation
|
|
242
|
+
}
|
|
243
|
+
|
|
202
244
|
export function basicRow(tableId: string) {
|
|
203
245
|
return {
|
|
204
246
|
name: "Test Contact",
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
AutomationStatus,
|
|
20
20
|
AutomationMetadata,
|
|
21
21
|
AutomationJob,
|
|
22
|
+
AutomationData,
|
|
22
23
|
} from "@budibase/types"
|
|
23
24
|
import {
|
|
24
25
|
LoopStep,
|
|
@@ -30,6 +31,7 @@ import { WorkerCallback } from "./definitions"
|
|
|
30
31
|
import { context, logging } from "@budibase/backend-core"
|
|
31
32
|
import { processObject } from "@budibase/string-templates"
|
|
32
33
|
import { cloneDeep } from "lodash/fp"
|
|
34
|
+
import { performance } from "perf_hooks"
|
|
33
35
|
import * as sdkUtils from "../sdk/utils"
|
|
34
36
|
import env from "../environment"
|
|
35
37
|
const FILTER_STEP_ID = actions.BUILTIN_ACTION_DEFINITIONS.FILTER.stepId
|
|
@@ -37,15 +39,23 @@ const LOOP_STEP_ID = actions.BUILTIN_ACTION_DEFINITIONS.LOOP.stepId
|
|
|
37
39
|
const CRON_STEP_ID = triggerDefs.CRON.stepId
|
|
38
40
|
const STOPPED_STATUS = { success: true, status: AutomationStatus.STOPPED }
|
|
39
41
|
|
|
40
|
-
function getLoopIterations(loopStep: LoopStep
|
|
41
|
-
|
|
42
|
+
function getLoopIterations(loopStep: LoopStep) {
|
|
43
|
+
let binding = loopStep.inputs.binding
|
|
42
44
|
if (!binding) {
|
|
43
45
|
return 0
|
|
44
46
|
}
|
|
47
|
+
const isString = typeof binding === "string"
|
|
48
|
+
try {
|
|
49
|
+
if (isString) {
|
|
50
|
+
binding = JSON.parse(binding)
|
|
51
|
+
}
|
|
52
|
+
} catch (err) {
|
|
53
|
+
// ignore error - wasn't able to parse
|
|
54
|
+
}
|
|
45
55
|
if (Array.isArray(binding)) {
|
|
46
56
|
return binding.length
|
|
47
57
|
}
|
|
48
|
-
if (
|
|
58
|
+
if (isString) {
|
|
49
59
|
return automationUtils.stringSplit(binding).length
|
|
50
60
|
}
|
|
51
61
|
return 0
|
|
@@ -240,7 +250,9 @@ class Orchestrator {
|
|
|
240
250
|
let loopStepNumber: any = undefined
|
|
241
251
|
let loopSteps: LoopStep[] | undefined = []
|
|
242
252
|
let metadata
|
|
253
|
+
let timeoutFlag = false
|
|
243
254
|
let wasLoopStep = false
|
|
255
|
+
let timeout = this._job.data.event.timeout
|
|
244
256
|
// check if this is a recurring automation,
|
|
245
257
|
if (isProdAppID(this._appId) && isRecurring(automation)) {
|
|
246
258
|
metadata = await this.getMetadata()
|
|
@@ -249,8 +261,18 @@ class Orchestrator {
|
|
|
249
261
|
return
|
|
250
262
|
}
|
|
251
263
|
}
|
|
252
|
-
|
|
264
|
+
const start = performance.now()
|
|
253
265
|
for (let step of automation.definition.steps) {
|
|
266
|
+
if (timeoutFlag) {
|
|
267
|
+
break
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
if (timeout) {
|
|
271
|
+
setTimeout(() => {
|
|
272
|
+
timeoutFlag = true
|
|
273
|
+
}, timeout || 12000)
|
|
274
|
+
}
|
|
275
|
+
|
|
254
276
|
stepCount++
|
|
255
277
|
let input: any,
|
|
256
278
|
iterations = 1,
|
|
@@ -264,22 +286,17 @@ class Orchestrator {
|
|
|
264
286
|
|
|
265
287
|
if (loopStep) {
|
|
266
288
|
input = await processObject(loopStep.inputs, this._context)
|
|
267
|
-
iterations = getLoopIterations(loopStep as LoopStep
|
|
289
|
+
iterations = getLoopIterations(loopStep as LoopStep)
|
|
268
290
|
}
|
|
269
291
|
for (let index = 0; index < iterations; index++) {
|
|
270
292
|
let originalStepInput = cloneDeep(step.inputs)
|
|
271
293
|
// Handle if the user has set a max iteration count or if it reaches the max limit set by us
|
|
272
294
|
if (loopStep && input.binding) {
|
|
273
|
-
let newInput: any = await processObject(
|
|
274
|
-
loopStep.inputs,
|
|
275
|
-
cloneDeep(this._context)
|
|
276
|
-
)
|
|
277
|
-
|
|
278
295
|
let tempOutput = { items: loopSteps, iterations: iterationCount }
|
|
279
296
|
try {
|
|
280
|
-
|
|
297
|
+
loopStep.inputs.binding = automationUtils.typecastForLooping(
|
|
281
298
|
loopStep as LoopStep,
|
|
282
|
-
|
|
299
|
+
loopStep.inputs as LoopInput
|
|
283
300
|
)
|
|
284
301
|
} catch (err) {
|
|
285
302
|
this.updateContextAndOutput(loopStepNumber, step, tempOutput, {
|
|
@@ -290,13 +307,12 @@ class Orchestrator {
|
|
|
290
307
|
loopStep = undefined
|
|
291
308
|
break
|
|
292
309
|
}
|
|
293
|
-
|
|
294
310
|
let item = []
|
|
295
311
|
if (
|
|
296
312
|
typeof loopStep.inputs.binding === "string" &&
|
|
297
313
|
loopStep.inputs.option === "String"
|
|
298
314
|
) {
|
|
299
|
-
item = automationUtils.stringSplit(
|
|
315
|
+
item = automationUtils.stringSplit(loopStep.inputs.binding)
|
|
300
316
|
} else if (Array.isArray(loopStep.inputs.binding)) {
|
|
301
317
|
item = loopStep.inputs.binding
|
|
302
318
|
}
|
|
@@ -338,6 +354,7 @@ class Orchestrator {
|
|
|
338
354
|
}
|
|
339
355
|
}
|
|
340
356
|
}
|
|
357
|
+
|
|
341
358
|
if (
|
|
342
359
|
index === env.AUTOMATION_MAX_ITERATIONS ||
|
|
343
360
|
index === parseInt(loopStep.inputs.iterations)
|
|
@@ -466,8 +483,25 @@ class Orchestrator {
|
|
|
466
483
|
}
|
|
467
484
|
}
|
|
468
485
|
|
|
486
|
+
const end = performance.now()
|
|
487
|
+
const executionTime = end - start
|
|
488
|
+
|
|
489
|
+
console.info(`Execution time: ${executionTime} milliseconds`, {
|
|
490
|
+
_logKey: "automation",
|
|
491
|
+
executionTime,
|
|
492
|
+
})
|
|
493
|
+
|
|
469
494
|
// store the logs for the automation run
|
|
470
|
-
|
|
495
|
+
try {
|
|
496
|
+
await storeLog(this._automation, this.executionOutput)
|
|
497
|
+
} catch (e: any) {
|
|
498
|
+
if (e.status === 413 && e.request?.data) {
|
|
499
|
+
// if content is too large we shouldn't log it
|
|
500
|
+
delete e.request.data
|
|
501
|
+
e.request.data = { message: "removed due to large size" }
|
|
502
|
+
}
|
|
503
|
+
logging.logAlert("Error writing automation log", e)
|
|
504
|
+
}
|
|
471
505
|
if (isProdAppID(this._appId) && isRecurring(automation) && metadata) {
|
|
472
506
|
await this.updateMetadata(metadata)
|
|
473
507
|
}
|
|
@@ -475,22 +509,56 @@ class Orchestrator {
|
|
|
475
509
|
}
|
|
476
510
|
}
|
|
477
511
|
|
|
478
|
-
export function execute(job: Job
|
|
512
|
+
export function execute(job: Job<AutomationData>, callback: WorkerCallback) {
|
|
479
513
|
const appId = job.data.event.appId
|
|
514
|
+
const automationId = job.data.automation._id
|
|
480
515
|
if (!appId) {
|
|
481
516
|
throw new Error("Unable to execute, event doesn't contain app ID.")
|
|
482
517
|
}
|
|
518
|
+
if (!automationId) {
|
|
519
|
+
throw new Error("Unable to execute, event doesn't contain automation ID.")
|
|
520
|
+
}
|
|
521
|
+
return context.doInAutomationContext({
|
|
522
|
+
appId,
|
|
523
|
+
automationId,
|
|
524
|
+
task: async () => {
|
|
525
|
+
const envVars = await sdkUtils.getEnvironmentVariables()
|
|
526
|
+
// put into automation thread for whole context
|
|
527
|
+
await context.doInEnvironmentContext(envVars, async () => {
|
|
528
|
+
const automationOrchestrator = new Orchestrator(job)
|
|
529
|
+
try {
|
|
530
|
+
const response = await automationOrchestrator.execute()
|
|
531
|
+
callback(null, response)
|
|
532
|
+
} catch (err) {
|
|
533
|
+
callback(err)
|
|
534
|
+
}
|
|
535
|
+
})
|
|
536
|
+
},
|
|
537
|
+
})
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
export function executeSynchronously(job: Job) {
|
|
541
|
+
const appId = job.data.event.appId
|
|
542
|
+
if (!appId) {
|
|
543
|
+
throw new Error("Unable to execute, event doesn't contain app ID.")
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
const timeoutPromise = new Promise((resolve, reject) => {
|
|
547
|
+
setTimeout(() => {
|
|
548
|
+
reject(new Error("Timeout exceeded"))
|
|
549
|
+
}, job.data.event.timeout || 12000)
|
|
550
|
+
})
|
|
551
|
+
|
|
483
552
|
return context.doInAppContext(appId, async () => {
|
|
484
553
|
const envVars = await sdkUtils.getEnvironmentVariables()
|
|
485
554
|
// put into automation thread for whole context
|
|
486
|
-
|
|
555
|
+
return context.doInEnvironmentContext(envVars, async () => {
|
|
487
556
|
const automationOrchestrator = new Orchestrator(job)
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
}
|
|
557
|
+
const response = await Promise.race([
|
|
558
|
+
automationOrchestrator.execute(),
|
|
559
|
+
timeoutPromise,
|
|
560
|
+
])
|
|
561
|
+
return response
|
|
494
562
|
})
|
|
495
563
|
})
|
|
496
564
|
}
|
package/src/threads/index.ts
CHANGED
|
@@ -38,6 +38,9 @@ export class Thread {
|
|
|
38
38
|
this.count = opts.count ? opts.count : 1
|
|
39
39
|
this.disableThreading = this.shouldDisableThreading()
|
|
40
40
|
if (!this.disableThreading) {
|
|
41
|
+
console.debug(
|
|
42
|
+
`[${env.FORKED_PROCESS_NAME}] initialising worker farm type=${type}`
|
|
43
|
+
)
|
|
41
44
|
const workerOpts: any = {
|
|
42
45
|
autoStart: true,
|
|
43
46
|
maxConcurrentWorkers: this.count,
|
|
@@ -45,6 +48,7 @@ export class Thread {
|
|
|
45
48
|
env: {
|
|
46
49
|
...process.env,
|
|
47
50
|
FORKED_PROCESS: "1",
|
|
51
|
+
FORKED_PROCESS_NAME: type,
|
|
48
52
|
},
|
|
49
53
|
},
|
|
50
54
|
}
|
|
@@ -54,6 +58,10 @@ export class Thread {
|
|
|
54
58
|
}
|
|
55
59
|
this.workers = workerFarm(workerOpts, typeToFile(type), ["execute"])
|
|
56
60
|
Thread.workerRefs.push(this.workers)
|
|
61
|
+
} else {
|
|
62
|
+
console.debug(
|
|
63
|
+
`[${env.FORKED_PROCESS_NAME}] skipping worker farm type=${type}`
|
|
64
|
+
)
|
|
57
65
|
}
|
|
58
66
|
}
|
|
59
67
|
|
|
@@ -72,9 +80,7 @@ export class Thread {
|
|
|
72
80
|
function fire(worker: any) {
|
|
73
81
|
worker.execute(job, (err: any, response: any) => {
|
|
74
82
|
if (err && err.type === "TimeoutError") {
|
|
75
|
-
reject(
|
|
76
|
-
new Error(`Query response time exceeded ${timeout}ms timeout.`)
|
|
77
|
-
)
|
|
83
|
+
reject(new Error(`Thread timeout exceeded ${timeout}ms timeout.`))
|
|
78
84
|
} else if (err) {
|
|
79
85
|
reject(err)
|
|
80
86
|
} else {
|
package/src/threads/utils.ts
CHANGED
|
@@ -26,8 +26,10 @@ function makeVariableKey(queryId: string, variable: string) {
|
|
|
26
26
|
export function threadSetup() {
|
|
27
27
|
// don't run this if not threading
|
|
28
28
|
if (env.isTest() || env.DISABLE_THREADING || !env.isInThread()) {
|
|
29
|
+
console.debug(`[${env.FORKED_PROCESS_NAME}] thread setup skipped`)
|
|
29
30
|
return
|
|
30
31
|
}
|
|
32
|
+
console.debug(`[${env.FORKED_PROCESS_NAME}] thread setup running`)
|
|
31
33
|
db.init()
|
|
32
34
|
}
|
|
33
35
|
|
|
@@ -35,10 +35,20 @@ export const getComponentLibraryManifest = async (library: string) => {
|
|
|
35
35
|
const filename = "manifest.json"
|
|
36
36
|
|
|
37
37
|
if (env.isDev() || env.isTest()) {
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
38
|
+
const paths = [
|
|
39
|
+
join(TOP_LEVEL_PATH, "packages/client", filename),
|
|
40
|
+
join(process.cwd(), "client", filename),
|
|
41
|
+
]
|
|
42
|
+
for (let path of paths) {
|
|
43
|
+
if (fs.existsSync(path)) {
|
|
44
|
+
// always load from new so that updates are refreshed
|
|
45
|
+
delete require.cache[require.resolve(path)]
|
|
46
|
+
return require(path)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
throw new Error(
|
|
50
|
+
`Unable to find ${filename} in development environment (may need to build).`
|
|
51
|
+
)
|
|
42
52
|
}
|
|
43
53
|
|
|
44
54
|
if (!appId) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { join } from "path"
|
|
1
|
+
import path, { join } from "path"
|
|
2
2
|
import { ObjectStoreBuckets } from "../../constants"
|
|
3
3
|
import fs from "fs"
|
|
4
4
|
import { objectStore } from "@budibase/backend-core"
|
|
@@ -6,6 +6,10 @@ import { resolve } from "../centralPath"
|
|
|
6
6
|
import env from "../../environment"
|
|
7
7
|
import { TOP_LEVEL_PATH } from "./filesystem"
|
|
8
8
|
|
|
9
|
+
export function devClientLibPath() {
|
|
10
|
+
return require.resolve("@budibase/client")
|
|
11
|
+
}
|
|
12
|
+
|
|
9
13
|
/**
|
|
10
14
|
* Client library paths in the object store:
|
|
11
15
|
* Previously, the entire client library package was downloaded from NPM
|
|
@@ -89,9 +93,10 @@ export async function updateClientLibrary(appId: string) {
|
|
|
89
93
|
let manifest, client
|
|
90
94
|
|
|
91
95
|
if (env.isDev()) {
|
|
96
|
+
const clientPath = devClientLibPath()
|
|
92
97
|
// Load the symlinked version in dev which is always the newest
|
|
93
|
-
manifest =
|
|
94
|
-
client =
|
|
98
|
+
manifest = join(path.dirname(path.dirname(clientPath)), "manifest.json")
|
|
99
|
+
client = clientPath
|
|
95
100
|
} else {
|
|
96
101
|
// Load the bundled version in prod
|
|
97
102
|
manifest = resolve(TOP_LEVEL_PATH, "client", "manifest.json")
|
|
@@ -4,9 +4,11 @@ import { budibaseTempDir } from "../budibaseDir"
|
|
|
4
4
|
import { join } from "path"
|
|
5
5
|
import env from "../../environment"
|
|
6
6
|
import tar from "tar"
|
|
7
|
+
import environment from "../../environment"
|
|
7
8
|
const uuid = require("uuid/v4")
|
|
8
9
|
|
|
9
|
-
export const TOP_LEVEL_PATH =
|
|
10
|
+
export const TOP_LEVEL_PATH =
|
|
11
|
+
environment.TOP_LEVEL_PATH || join(__dirname, "..", "..", "..")
|
|
10
12
|
|
|
11
13
|
/**
|
|
12
14
|
* Upon first startup of instance there may not be everything we need in tmp directory, set it up.
|