@budibase/server 1.0.123 → 1.0.125
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/builder/assets/index.3d890df7.js +1299 -0
- package/builder/assets/index.89795487.css +6 -0
- package/builder/assets/{vendor.8e34a169.js → vendor.5240f480.js} +1 -1
- package/builder/index.html +3 -3
- package/coverage/clover.xml +695 -1678
- package/coverage/coverage-final.json +28 -43
- package/coverage/lcov-report/api/controllers/analytics.js.html +8 -3
- package/coverage/lcov-report/api/controllers/apikeys.js.html +9 -4
- package/coverage/lcov-report/api/controllers/auth.js.html +8 -3
- package/coverage/lcov-report/api/controllers/automation.js.html +8 -3
- package/coverage/lcov-report/api/controllers/backup.js.html +8 -3
- package/coverage/lcov-report/api/controllers/cloud.js.html +8 -3
- package/coverage/lcov-report/api/controllers/component.js.html +8 -3
- package/coverage/lcov-report/api/controllers/datasource.js.html +11 -6
- package/coverage/lcov-report/api/controllers/dev.js.html +8 -3
- package/coverage/lcov-report/api/controllers/index.html +16 -26
- package/coverage/lcov-report/api/controllers/integration.js.html +8 -3
- package/coverage/lcov-report/api/controllers/layout.js.html +8 -3
- package/coverage/lcov-report/api/controllers/metadata.js.html +8 -3
- package/coverage/lcov-report/api/controllers/migrations.js.html +8 -3
- package/coverage/lcov-report/api/controllers/permission.js.html +8 -3
- package/coverage/lcov-report/api/controllers/query/index.html +16 -26
- package/coverage/lcov-report/api/controllers/query/validation.js.html +8 -3
- package/coverage/lcov-report/api/controllers/role.js.html +10 -5
- package/coverage/lcov-report/api/controllers/routing.js.html +9 -4
- package/coverage/lcov-report/api/controllers/row/external.js.html +8 -3
- package/coverage/lcov-report/api/controllers/row/index.html +25 -35
- package/coverage/lcov-report/api/controllers/row/internal.js.html +32 -24
- package/coverage/lcov-report/api/controllers/row/internalSearch.js.html +21 -16
- package/coverage/lcov-report/api/controllers/row/staticFormula.js.html +24 -19
- package/coverage/lcov-report/api/controllers/row/utils.js.html +33 -19
- package/coverage/lcov-report/api/controllers/screen.js.html +9 -4
- package/coverage/lcov-report/api/controllers/script.js.html +8 -3
- package/coverage/lcov-report/api/controllers/table/bulkFormula.js.html +55 -50
- package/coverage/lcov-report/api/controllers/table/external.js.html +8 -3
- package/coverage/lcov-report/api/controllers/table/index.html +19 -44
- package/coverage/lcov-report/api/controllers/table/index.js.html +20 -15
- package/coverage/lcov-report/api/controllers/templates.js.html +8 -3
- package/coverage/lcov-report/api/controllers/user.js.html +8 -3
- package/coverage/lcov-report/api/controllers/view/exporters.js.html +8 -3
- package/coverage/lcov-report/api/controllers/view/index.html +8 -3
- package/coverage/lcov-report/api/controllers/view/index.js.html +10 -5
- package/coverage/lcov-report/api/controllers/view/utils.js.html +8 -3
- package/coverage/lcov-report/api/controllers/view/viewBuilder.js.html +8 -3
- package/coverage/lcov-report/api/controllers/webhook.js.html +10 -5
- package/coverage/lcov-report/api/index.html +18 -13
- package/coverage/lcov-report/api/index.js.html +28 -8
- package/coverage/lcov-report/api/routes/analytics.js.html +8 -3
- package/coverage/lcov-report/api/routes/apikeys.js.html +8 -3
- package/coverage/lcov-report/api/routes/auth.js.html +8 -3
- package/coverage/lcov-report/api/routes/automation.js.html +8 -3
- package/coverage/lcov-report/api/routes/backup.js.html +8 -3
- package/coverage/lcov-report/api/routes/cloud.js.html +8 -3
- package/coverage/lcov-report/api/routes/component.js.html +8 -3
- package/coverage/lcov-report/api/routes/datasource.js.html +8 -3
- package/coverage/lcov-report/api/routes/deploy.js.html +8 -3
- package/coverage/lcov-report/api/routes/dev.js.html +9 -4
- package/coverage/lcov-report/api/routes/index.html +13 -68
- package/coverage/lcov-report/api/routes/integration.js.html +8 -3
- package/coverage/lcov-report/api/routes/layout.js.html +8 -3
- package/coverage/lcov-report/api/routes/metadata.js.html +8 -3
- package/coverage/lcov-report/api/routes/migrations.js.html +8 -3
- package/coverage/lcov-report/api/routes/permission.js.html +8 -3
- package/coverage/lcov-report/api/routes/query.js.html +8 -3
- package/coverage/lcov-report/api/routes/role.js.html +8 -3
- package/coverage/lcov-report/api/routes/routing.js.html +8 -3
- package/coverage/lcov-report/api/routes/screen.js.html +8 -3
- package/coverage/lcov-report/api/routes/script.js.html +8 -3
- package/coverage/lcov-report/api/routes/table.js.html +8 -3
- package/coverage/lcov-report/api/routes/templates.js.html +8 -3
- package/coverage/lcov-report/api/routes/user.js.html +8 -3
- package/coverage/lcov-report/api/routes/utils/index.html +8 -3
- package/coverage/lcov-report/api/routes/utils/validators.js.html +8 -3
- package/coverage/lcov-report/api/routes/view.js.html +8 -3
- package/coverage/lcov-report/api/routes/webhook.js.html +8 -3
- package/coverage/lcov-report/automations/actions.js.html +21 -7
- package/coverage/lcov-report/automations/automationUtils.js.html +64 -23
- package/coverage/lcov-report/automations/bullboard.js.html +8 -3
- package/coverage/lcov-report/automations/index.html +27 -37
- package/coverage/lcov-report/automations/index.js.html +8 -3
- package/coverage/lcov-report/automations/steps/bash.js.html +8 -3
- package/coverage/lcov-report/automations/steps/delay.js.html +8 -3
- package/coverage/lcov-report/automations/steps/discord.js.html +8 -3
- package/coverage/lcov-report/automations/steps/executeQuery.js.html +8 -3
- package/coverage/lcov-report/automations/steps/executeScript.js.html +8 -3
- package/coverage/lcov-report/automations/steps/filter.js.html +8 -3
- package/coverage/lcov-report/automations/steps/index.html +31 -41
- package/coverage/lcov-report/automations/steps/integromat.js.html +8 -3
- package/coverage/lcov-report/{api/routes/static.js.html → automations/steps/loop.js.html} +70 -80
- package/coverage/lcov-report/automations/steps/outgoingWebhook.js.html +9 -4
- package/coverage/lcov-report/automations/steps/queryRows.js.html +9 -4
- package/coverage/lcov-report/automations/steps/sendSmtpEmail.js.html +8 -3
- package/coverage/lcov-report/automations/steps/serverLog.js.html +8 -3
- package/coverage/lcov-report/automations/steps/slack.js.html +8 -3
- package/coverage/lcov-report/automations/steps/updateRow.js.html +8 -3
- package/coverage/lcov-report/automations/steps/utils.js.html +14 -9
- package/coverage/lcov-report/automations/steps/zapier.js.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/app.js.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/cron.js.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/index.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/index.js.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/rowDeleted.js.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/rowSaved.js.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/rowUpdated.js.html +8 -3
- package/coverage/lcov-report/automations/triggerInfo/webhook.js.html +8 -3
- package/coverage/lcov-report/automations/triggers.js.html +16 -11
- package/coverage/lcov-report/block-navigation.js +8 -0
- package/coverage/lcov-report/constants/index.html +12 -7
- package/coverage/lcov-report/constants/index.js.html +55 -32
- package/coverage/lcov-report/constants/layouts.js.html +8 -3
- package/coverage/lcov-report/constants/screens.js.html +8 -3
- package/coverage/lcov-report/db/inMemoryView.js.html +8 -3
- package/coverage/lcov-report/db/index.html +8 -3
- package/coverage/lcov-report/db/index.js.html +9 -4
- package/coverage/lcov-report/db/linkedRows/LinkController.js.html +20 -15
- package/coverage/lcov-report/db/linkedRows/index.html +8 -3
- package/coverage/lcov-report/db/linkedRows/index.js.html +22 -17
- package/coverage/lcov-report/db/linkedRows/linkUtils.js.html +12 -7
- package/coverage/lcov-report/db/newid.js.html +11 -6
- package/coverage/lcov-report/db/utils.js.html +84 -79
- package/coverage/lcov-report/events/AutomationEmitter.js.html +14 -9
- package/coverage/lcov-report/events/index.html +8 -3
- package/coverage/lcov-report/events/index.js.html +9 -4
- package/coverage/lcov-report/events/utils.js.html +18 -13
- package/coverage/lcov-report/index.html +125 -120
- package/coverage/lcov-report/integrations/tests/TestConfiguration.js.html +8 -3
- package/coverage/lcov-report/integrations/tests/index.html +8 -3
- package/coverage/lcov-report/middleware/appInfo.js.html +8 -3
- package/coverage/lcov-report/middleware/builder.js.html +8 -3
- package/coverage/lcov-report/middleware/currentapp.js.html +65 -15
- package/coverage/lcov-report/middleware/index.html +25 -50
- package/coverage/lcov-report/middleware/joi-validator.js.html +9 -4
- package/coverage/lcov-report/middleware/publicApi.js.html +8 -3
- package/coverage/lcov-report/middleware/resourceId.js.html +8 -3
- package/coverage/lcov-report/middleware/selfhost.js.html +9 -4
- package/coverage/lcov-report/middleware/utils.js.html +8 -3
- package/coverage/lcov-report/sorter.js +26 -0
- package/coverage/lcov-report/threads/automation.js.html +581 -90
- package/coverage/lcov-report/threads/index.html +30 -40
- package/coverage/lcov-report/threads/query.js.html +9 -4
- package/coverage/lcov-report/threads/utils.js.html +17 -9
- package/coverage/lcov-report/utilities/bcrypt.js.html +8 -3
- package/coverage/lcov-report/utilities/budibaseDir.js.html +8 -3
- package/coverage/lcov-report/utilities/centralPath.js.html +8 -3
- package/coverage/lcov-report/utilities/csvParser.js.html +10 -5
- package/coverage/lcov-report/utilities/global.js.html +9 -4
- package/coverage/lcov-report/utilities/index.html +8 -3
- package/coverage/lcov-report/utilities/index.js.html +11 -6
- package/coverage/lcov-report/utilities/queue/inMemoryQueue.js.html +32 -9
- package/coverage/lcov-report/utilities/queue/index.html +12 -7
- package/coverage/lcov-report/utilities/routing/index.html +8 -3
- package/coverage/lcov-report/utilities/routing/index.js.html +8 -3
- package/coverage/lcov-report/utilities/rowProcessor/index.html +8 -3
- package/coverage/lcov-report/utilities/rowProcessor/index.js.html +48 -43
- package/coverage/lcov-report/utilities/rowProcessor/utils.js.html +18 -13
- package/coverage/lcov-report/utilities/scriptRunner.js.html +8 -3
- package/coverage/lcov-report/utilities/security.js.html +9 -4
- package/coverage/lcov-report/utilities/statusCodes.js.html +8 -3
- package/coverage/lcov-report/utilities/usageQuota/index.html +24 -34
- package/coverage/lcov-report/utilities/usageQuota/rows.js.html +44 -39
- package/coverage/lcov-report/utilities/usageQuota/usageQuoteReset.js.html +8 -3
- package/coverage/lcov-report/utilities/users.js.html +8 -3
- package/coverage/lcov-report/utilities/workerRequests.js.html +9 -4
- package/coverage/lcov.info +1144 -2875
- package/dist/api/controllers/application.js +145 -73
- package/dist/api/controllers/deploy/index.js +68 -36
- package/dist/api/controllers/public/applications.js +29 -9
- package/dist/api/controllers/public/queries.js +27 -7
- package/dist/api/controllers/public/rows.js +32 -12
- package/dist/api/controllers/public/tables.js +2 -2
- package/dist/api/controllers/public/users.js +8 -8
- package/dist/api/controllers/public/utils.js +1 -1
- package/dist/api/controllers/query/import/index.js +3 -3
- package/dist/api/controllers/query/index.js +57 -44
- package/dist/api/controllers/row/ExternalRequest.js +27 -27
- package/dist/api/controllers/row/index.js +83 -60
- package/dist/api/controllers/row/internal.js +2 -1
- package/dist/api/controllers/row/utils.js +2 -1
- package/dist/api/controllers/static/templates/BudibaseApp.svelte +3 -0
- package/dist/api/controllers/table/bulkFormula.js +2 -1
- package/dist/api/controllers/table/internal.js +41 -35
- package/dist/api/controllers/table/utils.js +271 -229
- package/dist/api/index.js +5 -0
- package/dist/api/routes/application.js +39 -13
- package/dist/api/routes/index.js +61 -56
- package/dist/api/routes/public/index.js +6 -9
- package/dist/api/routes/public/queries.js +1 -1
- package/dist/api/routes/public/rows.js +1 -1
- package/dist/api/routes/public/tables.js +3 -3
- package/dist/api/routes/public/users.js +1 -1
- package/dist/api/routes/row.js +43 -17
- package/dist/api/routes/static.js +40 -13
- package/dist/api/routes/tests/utilities/TestFunctions.js +75 -33
- package/dist/app.js +8 -4
- package/dist/automations/actions.js +3 -0
- package/dist/automations/automationUtils.js +10 -0
- package/dist/automations/steps/createRow.js +12 -12
- package/dist/automations/steps/deleteRow.js +13 -16
- package/dist/automations/steps/loop.js +51 -0
- package/dist/automations/tests/utilities/index.js +13 -11
- package/dist/automations/utils.js +187 -133
- package/dist/constants/index.js +5 -0
- package/dist/definitions/datasource.js +1 -0
- package/dist/environment.js +2 -3
- package/dist/index.js +4 -0
- package/dist/integrations/base/sql.js +2 -2
- package/dist/integrations/base/sqlTable.js +2 -2
- package/dist/integrations/googlesheets.js +1 -1
- package/dist/integrations/index.js +4 -0
- package/dist/integrations/microsoftSqlServer.js +8 -8
- package/dist/integrations/mysql.js +9 -9
- package/dist/integrations/oracle.js +7 -7
- package/dist/integrations/postgres.js +7 -7
- package/dist/integrations/queries/sql.js +2 -2
- package/dist/integrations/redis.js +158 -0
- package/dist/integrations/rest.js +1 -1
- package/dist/middleware/authorized.js +51 -51
- package/dist/middleware/currentapp.js +15 -1
- package/dist/migrations/functions/appUrls.js +1 -1
- package/dist/migrations/functions/developerQuota.js +49 -0
- package/dist/migrations/functions/publishedAppsQuota.js +47 -0
- package/dist/migrations/functions/quotas1.js +6 -2
- package/dist/migrations/functions/usageQuotas/index.js +0 -4
- package/dist/migrations/functions/usageQuotas/syncApps.js +4 -7
- package/dist/migrations/functions/usageQuotas/syncDevelopers.js +24 -0
- package/dist/migrations/functions/usageQuotas/syncPublishedApps.js +26 -0
- package/dist/migrations/functions/usageQuotas/syncRows.js +5 -8
- package/dist/migrations/index.js +17 -1
- package/dist/package.json +14 -8
- package/dist/threads/automation.js +149 -27
- package/dist/threads/index.js +36 -10
- package/dist/threads/utils.js +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/utilities/queue/inMemoryQueue.js +6 -1
- package/nodemon.json +1 -1
- package/package.json +15 -9
- package/scripts/dev/manage.js +2 -0
- package/src/api/controllers/{application.js → application.ts} +118 -51
- package/src/api/controllers/deploy/{index.js → index.ts} +53 -29
- package/src/api/controllers/public/applications.ts +2 -2
- package/src/api/controllers/public/queries.ts +1 -1
- package/src/api/controllers/public/rows.ts +1 -1
- package/src/api/controllers/query/{index.js → index.ts} +51 -48
- package/src/api/controllers/row/ExternalRequest.ts +1 -1
- package/src/api/controllers/row/{index.js → index.ts} +24 -17
- package/src/api/controllers/row/internal.js +2 -1
- package/src/api/controllers/row/utils.js +4 -1
- package/src/api/controllers/static/templates/BudibaseApp.svelte +3 -0
- package/src/api/controllers/table/bulkFormula.js +1 -1
- package/src/api/controllers/table/{internal.js → internal.ts} +30 -26
- package/src/api/controllers/table/{utils.js → utils.ts} +86 -69
- package/src/api/index.js +5 -0
- package/src/api/routes/{application.js → application.ts} +8 -14
- package/src/api/routes/index.ts +60 -0
- package/src/api/routes/public/index.ts +1 -4
- package/src/api/routes/{row.js → row.ts} +7 -15
- package/src/api/routes/{static.js → static.ts} +11 -11
- package/src/api/routes/tests/misc.spec.js +39 -37
- package/src/api/routes/tests/utilities/{TestFunctions.js → TestFunctions.ts} +57 -33
- package/src/app.ts +1 -2
- package/src/automations/actions.js +3 -0
- package/src/automations/automationUtils.js +12 -0
- package/src/automations/steps/{createRow.js → createRow.ts} +9 -15
- package/src/automations/steps/{deleteRow.js → deleteRow.ts} +10 -16
- package/src/automations/steps/loop.js +50 -0
- package/src/automations/tests/automation.spec.js +0 -1
- package/src/automations/tests/{createRow.spec.js → createRow.spec.ts} +4 -15
- package/src/automations/tests/{deleteRow.spec.js → deleteRow.spec.ts} +3 -5
- package/src/automations/tests/utilities/index.js +12 -10
- package/src/automations/{utils.js → utils.ts} +39 -28
- package/src/constants/index.js +6 -0
- package/src/definitions/common.ts +1 -0
- package/src/definitions/datasource.ts +1 -0
- package/src/environment.js +2 -3
- package/src/index.ts +3 -0
- package/src/integrations/index.ts +4 -0
- package/src/integrations/redis.ts +152 -0
- package/src/integrations/tests/redis.spec.js +60 -0
- package/src/middleware/{authorized.js → authorized.ts} +20 -14
- package/src/middleware/currentapp.js +16 -1
- package/src/middleware/tests/currentapp.spec.js +8 -4
- package/src/migrations/functions/developerQuota.ts +15 -0
- package/src/migrations/functions/publishedAppsQuota.ts +13 -0
- package/src/migrations/functions/tests/quotas1.spec.js +0 -2
- package/src/migrations/functions/usageQuotas/index.ts +0 -5
- package/src/migrations/functions/usageQuotas/syncApps.ts +3 -6
- package/src/migrations/functions/usageQuotas/syncDevelopers.ts +19 -0
- package/src/migrations/functions/usageQuotas/syncPublishedApps.ts +21 -0
- package/src/migrations/functions/usageQuotas/syncRows.ts +3 -6
- package/src/migrations/functions/usageQuotas/tests/syncApps.spec.ts +34 -0
- package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +40 -0
- package/src/migrations/index.ts +13 -1
- package/src/threads/automation.js +196 -34
- package/src/threads/{index.js → index.ts} +18 -14
- package/src/threads/utils.js +1 -0
- package/src/utilities/queue/inMemoryQueue.js +7 -1
- package/tsconfig.build.json +10 -0
- package/tsconfig.json +2 -2
- package/builder/assets/index.68a7f4e3.css +0 -6
- package/builder/assets/index.8d4a5b33.js +0 -1291
- package/coverage/lcov-report/api/controllers/application.js.html +0 -1436
- package/coverage/lcov-report/api/controllers/query/index.js.html +0 -713
- package/coverage/lcov-report/api/controllers/row/index.js.html +0 -524
- package/coverage/lcov-report/api/controllers/table/internal.js.html +0 -620
- package/coverage/lcov-report/api/controllers/table/utils.js.html +0 -1331
- package/coverage/lcov-report/api/routes/application.js.html +0 -179
- package/coverage/lcov-report/api/routes/index.js.html +0 -266
- package/coverage/lcov-report/api/routes/row.js.html +0 -908
- package/coverage/lcov-report/automations/steps/createRow.js.html +0 -380
- package/coverage/lcov-report/automations/steps/deleteRow.js.html +0 -347
- package/coverage/lcov-report/automations/utils.js.html +0 -665
- package/coverage/lcov-report/middleware/authorized.js.html +0 -458
- package/coverage/lcov-report/middleware/usageQuota.js.html +0 -572
- package/coverage/lcov-report/threads/index.js.html +0 -296
- package/coverage/lcov-report/utilities/usageQuota/index.js.html +0 -359
- package/dist/middleware/usageQuota.js +0 -154
- package/dist/tsconfig.tsbuildinfo +0 -1
- package/dist/utilities/usageQuota/index.js +0 -86
- package/src/api/routes/index.js +0 -62
- package/src/middleware/tests/usageQuota.spec.js +0 -120
- package/src/middleware/usageQuota.js +0 -164
- package/src/migrations/functions/usageQuotas/tests/syncApps.spec.js +0 -41
- package/src/migrations/functions/usageQuotas/tests/syncRows.spec.js +0 -45
- package/src/utilities/tests/usageQuota/usageQuota.spec.js +0 -72
- package/src/utilities/usageQuota/index.js +0 -93
|
@@ -43,53 +43,55 @@ describe("run misc tests", () => {
|
|
|
43
43
|
|
|
44
44
|
describe("test table utilities", () => {
|
|
45
45
|
it("should be able to import a CSV", async () => {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
constraints: {
|
|
46
|
+
return config.doInContext(null, async () => {
|
|
47
|
+
const table = await config.createTable({
|
|
48
|
+
name: "table",
|
|
49
|
+
type: "table",
|
|
50
|
+
key: "name",
|
|
51
|
+
schema: {
|
|
52
|
+
a: {
|
|
54
53
|
type: "string",
|
|
54
|
+
constraints: {
|
|
55
|
+
type: "string",
|
|
56
|
+
},
|
|
55
57
|
},
|
|
56
|
-
|
|
57
|
-
b: {
|
|
58
|
-
type: "string",
|
|
59
|
-
constraints: {
|
|
58
|
+
b: {
|
|
60
59
|
type: "string",
|
|
60
|
+
constraints: {
|
|
61
|
+
type: "string",
|
|
62
|
+
},
|
|
61
63
|
},
|
|
62
|
-
|
|
63
|
-
c: {
|
|
64
|
-
type: "string",
|
|
65
|
-
constraints: {
|
|
64
|
+
c: {
|
|
66
65
|
type: "string",
|
|
66
|
+
constraints: {
|
|
67
|
+
type: "string",
|
|
68
|
+
},
|
|
67
69
|
},
|
|
68
|
-
|
|
69
|
-
d: {
|
|
70
|
-
type: "string",
|
|
71
|
-
constraints: {
|
|
70
|
+
d: {
|
|
72
71
|
type: "string",
|
|
72
|
+
constraints: {
|
|
73
|
+
type: "string",
|
|
74
|
+
},
|
|
73
75
|
},
|
|
74
76
|
},
|
|
75
|
-
}
|
|
77
|
+
})
|
|
78
|
+
const dataImport = {
|
|
79
|
+
csvString: "a,b,c,d\n1,2,3,4",
|
|
80
|
+
schema: {},
|
|
81
|
+
}
|
|
82
|
+
for (let col of ["a", "b", "c", "d"]) {
|
|
83
|
+
dataImport.schema[col] = { type: "string" }
|
|
84
|
+
}
|
|
85
|
+
await tableUtils.handleDataImport(
|
|
86
|
+
{ userId: "test" },
|
|
87
|
+
table,
|
|
88
|
+
dataImport
|
|
89
|
+
)
|
|
90
|
+
const rows = await config.getRows()
|
|
91
|
+
expect(rows[0].a).toEqual("1")
|
|
92
|
+
expect(rows[0].b).toEqual("2")
|
|
93
|
+
expect(rows[0].c).toEqual("3")
|
|
76
94
|
})
|
|
77
|
-
const dataImport = {
|
|
78
|
-
csvString: "a,b,c,d\n1,2,3,4",
|
|
79
|
-
schema: {},
|
|
80
|
-
}
|
|
81
|
-
for (let col of ["a", "b", "c", "d"]) {
|
|
82
|
-
dataImport.schema[col] = { type: "string" }
|
|
83
|
-
}
|
|
84
|
-
await tableUtils.handleDataImport(
|
|
85
|
-
{ userId: "test" },
|
|
86
|
-
table,
|
|
87
|
-
dataImport
|
|
88
|
-
)
|
|
89
|
-
const rows = await config.getRows()
|
|
90
|
-
expect(rows[0].a).toEqual("1")
|
|
91
|
-
expect(rows[0].b).toEqual("2")
|
|
92
|
-
expect(rows[0].c).toEqual("3")
|
|
93
95
|
})
|
|
94
96
|
})
|
|
95
97
|
})
|
|
@@ -1,44 +1,54 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import * as rowController from "../../../controllers/row"
|
|
2
|
+
import * as appController from "../../../controllers/application"
|
|
3
|
+
import { AppStatus } from "../../../../db/utils"
|
|
4
|
+
import { BUILTIN_ROLE_IDS } from "@budibase/backend-core/roles"
|
|
5
|
+
import { doInTenant } from "@budibase/backend-core/tenancy"
|
|
6
|
+
import { TENANT_ID } from "../../../../tests/utilities/structures"
|
|
7
|
+
import { getAppDB, doInAppContext } from "@budibase/backend-core/context"
|
|
8
|
+
import * as env from "../../../../environment"
|
|
9
|
+
|
|
10
|
+
class Request {
|
|
11
|
+
appId: any
|
|
12
|
+
params: any
|
|
13
|
+
request: any
|
|
14
|
+
body: any
|
|
15
|
+
|
|
16
|
+
constructor(appId: any, params: any) {
|
|
17
|
+
this.appId = appId
|
|
18
|
+
this.params = params
|
|
19
|
+
this.request = {}
|
|
20
|
+
}
|
|
13
21
|
}
|
|
14
22
|
|
|
15
|
-
function runRequest(appId, controlFunc, request) {
|
|
23
|
+
function runRequest(appId: any, controlFunc: any, request?: any) {
|
|
16
24
|
return doInAppContext(appId, async () => {
|
|
17
25
|
return controlFunc(request)
|
|
18
26
|
})
|
|
19
27
|
}
|
|
20
28
|
|
|
21
|
-
|
|
29
|
+
export const getAllTableRows = async (config: any) => {
|
|
22
30
|
const req = new Request(config.appId, { tableId: config.table._id })
|
|
23
31
|
await runRequest(config.appId, rowController.fetch, req)
|
|
24
32
|
return req.body
|
|
25
33
|
}
|
|
26
34
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
35
|
+
export const clearAllApps = async (tenantId = TENANT_ID) => {
|
|
36
|
+
await doInTenant(tenantId, async () => {
|
|
37
|
+
const req: any = { query: { status: AppStatus.DEV }, user: { tenantId } }
|
|
38
|
+
await appController.fetch(req)
|
|
39
|
+
const apps = req.body
|
|
40
|
+
if (!apps || apps.length <= 0) {
|
|
41
|
+
return
|
|
42
|
+
}
|
|
43
|
+
for (let app of apps) {
|
|
44
|
+
const { appId } = app
|
|
45
|
+
const req = new Request(null, { appId })
|
|
46
|
+
await runRequest(appId, appController.destroy, req)
|
|
47
|
+
}
|
|
48
|
+
})
|
|
39
49
|
}
|
|
40
50
|
|
|
41
|
-
|
|
51
|
+
export const clearAllAutomations = async (config: any) => {
|
|
42
52
|
const automations = await config.getAllAutomations()
|
|
43
53
|
for (let auto of automations) {
|
|
44
54
|
await doInAppContext(config.appId, async () => {
|
|
@@ -47,7 +57,12 @@ exports.clearAllAutomations = async config => {
|
|
|
47
57
|
}
|
|
48
58
|
}
|
|
49
59
|
|
|
50
|
-
|
|
60
|
+
export const createRequest = (
|
|
61
|
+
request: any,
|
|
62
|
+
method: any,
|
|
63
|
+
url: any,
|
|
64
|
+
body: any
|
|
65
|
+
) => {
|
|
51
66
|
let req
|
|
52
67
|
|
|
53
68
|
if (method === "POST") req = request.post(url).send(body)
|
|
@@ -59,7 +74,12 @@ exports.createRequest = (request, method, url, body) => {
|
|
|
59
74
|
return req
|
|
60
75
|
}
|
|
61
76
|
|
|
62
|
-
|
|
77
|
+
export const checkBuilderEndpoint = async ({
|
|
78
|
+
config,
|
|
79
|
+
method,
|
|
80
|
+
url,
|
|
81
|
+
body,
|
|
82
|
+
}: any) => {
|
|
63
83
|
const headers = await config.login({
|
|
64
84
|
userId: "us_fail",
|
|
65
85
|
builder: false,
|
|
@@ -71,14 +91,14 @@ exports.checkBuilderEndpoint = async ({ config, method, url, body }) => {
|
|
|
71
91
|
.expect(403)
|
|
72
92
|
}
|
|
73
93
|
|
|
74
|
-
|
|
94
|
+
export const checkPermissionsEndpoint = async ({
|
|
75
95
|
config,
|
|
76
96
|
method,
|
|
77
97
|
url,
|
|
78
98
|
body,
|
|
79
99
|
passRole,
|
|
80
100
|
failRole,
|
|
81
|
-
}) => {
|
|
101
|
+
}: any) => {
|
|
82
102
|
const passHeader = await config.login({
|
|
83
103
|
roleId: passRole,
|
|
84
104
|
prodApp: true,
|
|
@@ -106,7 +126,11 @@ exports.checkPermissionsEndpoint = async ({
|
|
|
106
126
|
.expect(403)
|
|
107
127
|
}
|
|
108
128
|
|
|
109
|
-
|
|
129
|
+
export const getDB = () => {
|
|
130
|
+
return getAppDB()
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export const testAutomation = async (config: any, automation: any) => {
|
|
110
134
|
return runRequest(automation.appId, async () => {
|
|
111
135
|
return await config.request
|
|
112
136
|
.post(`/api/automations/${automation._id}/test`)
|
|
@@ -122,7 +146,7 @@ exports.testAutomation = async (config, automation) => {
|
|
|
122
146
|
})
|
|
123
147
|
}
|
|
124
148
|
|
|
125
|
-
|
|
149
|
+
export const runInProd = async (func: any) => {
|
|
126
150
|
const nodeEnv = env.NODE_ENV
|
|
127
151
|
const workerId = env.JEST_WORKER_ID
|
|
128
152
|
env._set("NODE_ENV", "PRODUCTION")
|
package/src/app.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
// need to load environment first
|
|
2
2
|
import { ExtendableContext } from "koa"
|
|
3
|
-
|
|
4
3
|
import * as env from "./environment"
|
|
5
4
|
import db from "./db"
|
|
6
5
|
db.init()
|
|
@@ -15,7 +14,7 @@ const automations = require("./automations/index")
|
|
|
15
14
|
const Sentry = require("@sentry/node")
|
|
16
15
|
const fileSystem = require("./utilities/fileSystem")
|
|
17
16
|
const bullboard = require("./automations/bullboard")
|
|
18
|
-
|
|
17
|
+
import redis from "./utilities/redis"
|
|
19
18
|
import * as migrations from "./migrations"
|
|
20
19
|
|
|
21
20
|
const app = new Koa()
|
|
@@ -13,6 +13,7 @@ const integromat = require("./steps/integromat")
|
|
|
13
13
|
let filter = require("./steps/filter")
|
|
14
14
|
let delay = require("./steps/delay")
|
|
15
15
|
let queryRow = require("./steps/queryRows")
|
|
16
|
+
let loop = require("./steps/loop")
|
|
16
17
|
const env = require("../environment")
|
|
17
18
|
|
|
18
19
|
const ACTION_IMPLS = {
|
|
@@ -27,6 +28,7 @@ const ACTION_IMPLS = {
|
|
|
27
28
|
DELAY: delay.run,
|
|
28
29
|
FILTER: filter.run,
|
|
29
30
|
QUERY_ROWS: queryRow.run,
|
|
31
|
+
LOOP: loop.run,
|
|
30
32
|
// these used to be lowercase step IDs, maintain for backwards compat
|
|
31
33
|
discord: discord.run,
|
|
32
34
|
slack: slack.run,
|
|
@@ -45,6 +47,7 @@ const ACTION_DEFINITIONS = {
|
|
|
45
47
|
DELAY: delay.definition,
|
|
46
48
|
FILTER: filter.definition,
|
|
47
49
|
QUERY_ROWS: queryRow.definition,
|
|
50
|
+
LOOP: loop.definition,
|
|
48
51
|
// these used to be lowercase step IDs, maintain for backwards compat
|
|
49
52
|
discord: discord.definition,
|
|
50
53
|
slack: slack.definition,
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const { getTable } = require("../api/controllers/table/utils")
|
|
2
|
+
const { findHBSBlocks } = require("@budibase/string-templates")
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* When values are input to the system generally they will be of type string as this is required for template strings.
|
|
@@ -74,3 +75,14 @@ exports.getError = err => {
|
|
|
74
75
|
}
|
|
75
76
|
return typeof err !== "string" ? err.toString() : err
|
|
76
77
|
}
|
|
78
|
+
|
|
79
|
+
exports.substituteLoopStep = (hbsString, substitute) => {
|
|
80
|
+
let blocks = findHBSBlocks(hbsString)
|
|
81
|
+
for (let block of blocks) {
|
|
82
|
+
let oldBlock = block
|
|
83
|
+
block = block.replace(/loop/, substitute)
|
|
84
|
+
hbsString = hbsString.replace(new RegExp(oldBlock, "g"), block)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return hbsString
|
|
88
|
+
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const { buildCtx } = require("./utils")
|
|
1
|
+
import { save } from "../../api/controllers/row"
|
|
2
|
+
import { cleanUpRow, getError } from "../automationUtils"
|
|
3
|
+
import { buildCtx } from "./utils"
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
export const definition = {
|
|
7
6
|
name: "Create Row",
|
|
8
7
|
tagline: "Create a {{inputs.enriched.table.name}} row",
|
|
9
8
|
icon: "TableRowAddBottom",
|
|
@@ -59,7 +58,7 @@ exports.definition = {
|
|
|
59
58
|
},
|
|
60
59
|
}
|
|
61
60
|
|
|
62
|
-
|
|
61
|
+
export async function run({ inputs, appId, emitter }: any) {
|
|
63
62
|
if (inputs.row == null || inputs.row.tableId == null) {
|
|
64
63
|
return {
|
|
65
64
|
success: false,
|
|
@@ -69,7 +68,7 @@ exports.run = async function ({ inputs, appId, emitter }) {
|
|
|
69
68
|
}
|
|
70
69
|
}
|
|
71
70
|
// have to clean up the row, remove the table from it
|
|
72
|
-
const ctx = buildCtx(appId, emitter, {
|
|
71
|
+
const ctx: any = buildCtx(appId, emitter, {
|
|
73
72
|
body: inputs.row,
|
|
74
73
|
params: {
|
|
75
74
|
tableId: inputs.row.tableId,
|
|
@@ -77,13 +76,8 @@ exports.run = async function ({ inputs, appId, emitter }) {
|
|
|
77
76
|
})
|
|
78
77
|
|
|
79
78
|
try {
|
|
80
|
-
inputs.row = await
|
|
81
|
-
|
|
82
|
-
inputs.row
|
|
83
|
-
)
|
|
84
|
-
await usage.update(usage.Properties.ROW, 1, { dryRun: true })
|
|
85
|
-
await rowController.save(ctx)
|
|
86
|
-
await usage.update(usage.Properties.ROW, 1)
|
|
79
|
+
inputs.row = await cleanUpRow(inputs.row.tableId, inputs.row)
|
|
80
|
+
await save(ctx)
|
|
87
81
|
return {
|
|
88
82
|
row: inputs.row,
|
|
89
83
|
response: ctx.body,
|
|
@@ -94,7 +88,7 @@ exports.run = async function ({ inputs, appId, emitter }) {
|
|
|
94
88
|
} catch (err) {
|
|
95
89
|
return {
|
|
96
90
|
success: false,
|
|
97
|
-
response:
|
|
91
|
+
response: getError(err),
|
|
98
92
|
}
|
|
99
93
|
}
|
|
100
94
|
}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const automationUtils = require("../automationUtils")
|
|
1
|
+
import { destroy } from "../../api/controllers/row"
|
|
2
|
+
import { buildCtx } from "./utils"
|
|
3
|
+
import { getError } from "../automationUtils"
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
export const definition = {
|
|
7
6
|
description: "Delete a row from your database",
|
|
8
7
|
icon: "TableRowRemoveCenter",
|
|
9
8
|
name: "Delete Row",
|
|
@@ -24,12 +23,8 @@ exports.definition = {
|
|
|
24
23
|
type: "string",
|
|
25
24
|
title: "Row ID",
|
|
26
25
|
},
|
|
27
|
-
revision: {
|
|
28
|
-
type: "string",
|
|
29
|
-
title: "Row Revision",
|
|
30
|
-
},
|
|
31
26
|
},
|
|
32
|
-
required: ["tableId", "id"
|
|
27
|
+
required: ["tableId", "id"],
|
|
33
28
|
},
|
|
34
29
|
outputs: {
|
|
35
30
|
properties: {
|
|
@@ -52,8 +47,8 @@ exports.definition = {
|
|
|
52
47
|
},
|
|
53
48
|
}
|
|
54
49
|
|
|
55
|
-
|
|
56
|
-
if (inputs.id == null
|
|
50
|
+
export async function run({ inputs, appId, emitter }: any) {
|
|
51
|
+
if (inputs.id == null) {
|
|
57
52
|
return {
|
|
58
53
|
success: false,
|
|
59
54
|
response: {
|
|
@@ -62,7 +57,7 @@ exports.run = async function ({ inputs, appId, emitter }) {
|
|
|
62
57
|
}
|
|
63
58
|
}
|
|
64
59
|
|
|
65
|
-
let ctx = buildCtx(appId, emitter, {
|
|
60
|
+
let ctx: any = buildCtx(appId, emitter, {
|
|
66
61
|
body: {
|
|
67
62
|
_id: inputs.id,
|
|
68
63
|
_rev: inputs.revision,
|
|
@@ -73,8 +68,7 @@ exports.run = async function ({ inputs, appId, emitter }) {
|
|
|
73
68
|
})
|
|
74
69
|
|
|
75
70
|
try {
|
|
76
|
-
await
|
|
77
|
-
await rowController.destroy(ctx)
|
|
71
|
+
await destroy(ctx)
|
|
78
72
|
return {
|
|
79
73
|
response: ctx.body,
|
|
80
74
|
row: ctx.row,
|
|
@@ -83,7 +77,7 @@ exports.run = async function ({ inputs, appId, emitter }) {
|
|
|
83
77
|
} catch (err) {
|
|
84
78
|
return {
|
|
85
79
|
success: false,
|
|
86
|
-
response:
|
|
80
|
+
response: getError(err),
|
|
87
81
|
}
|
|
88
82
|
}
|
|
89
83
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
exports.definition = {
|
|
2
|
+
name: "Looping",
|
|
3
|
+
icon: "Reuse",
|
|
4
|
+
tagline: "Loop the block",
|
|
5
|
+
description: "Loop",
|
|
6
|
+
stepId: "LOOP",
|
|
7
|
+
internal: true,
|
|
8
|
+
inputs: {},
|
|
9
|
+
schema: {
|
|
10
|
+
inputs: {
|
|
11
|
+
properties: {
|
|
12
|
+
option: {
|
|
13
|
+
customType: "loopOption",
|
|
14
|
+
title: "Input type",
|
|
15
|
+
},
|
|
16
|
+
binding: {
|
|
17
|
+
type: "string",
|
|
18
|
+
title: "Binding / Value",
|
|
19
|
+
},
|
|
20
|
+
iterations: {
|
|
21
|
+
type: "number",
|
|
22
|
+
title: "Max loop iterations",
|
|
23
|
+
},
|
|
24
|
+
failure: {
|
|
25
|
+
type: "string",
|
|
26
|
+
title: "Failure Condition",
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
required: ["type", "value", "iterations", "failure"],
|
|
30
|
+
},
|
|
31
|
+
outputs: {
|
|
32
|
+
properties: {
|
|
33
|
+
items: {
|
|
34
|
+
customType: "item",
|
|
35
|
+
description: "The item currently being executed",
|
|
36
|
+
},
|
|
37
|
+
success: {
|
|
38
|
+
type: "boolean",
|
|
39
|
+
description: "Whether the message loop was successfully",
|
|
40
|
+
},
|
|
41
|
+
iterations: {
|
|
42
|
+
type: "number",
|
|
43
|
+
descriptions: "The amount of times the block ran",
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
required: ["success", "items", "iterations"],
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
type: "LOGIC",
|
|
50
|
+
}
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const usageQuota = require("../../utilities/usageQuota")
|
|
4
|
-
const setup = require("./utilities")
|
|
1
|
+
import * as setup from "./utilities"
|
|
5
2
|
|
|
6
3
|
describe("test the create row action", () => {
|
|
7
|
-
let table
|
|
4
|
+
let table: any
|
|
5
|
+
let row: any
|
|
8
6
|
let config = setup.getConfig()
|
|
9
7
|
|
|
10
8
|
beforeEach(async () => {
|
|
@@ -36,20 +34,11 @@ describe("test the create row action", () => {
|
|
|
36
34
|
row: {
|
|
37
35
|
tableId: "invalid",
|
|
38
36
|
invalid: "invalid",
|
|
39
|
-
}
|
|
37
|
+
},
|
|
40
38
|
})
|
|
41
39
|
expect(res.success).toEqual(false)
|
|
42
40
|
})
|
|
43
41
|
|
|
44
|
-
it("check usage quota attempts", async () => {
|
|
45
|
-
await setup.runInProd(async () => {
|
|
46
|
-
await setup.runStep(setup.actions.CREATE_ROW.stepId, {
|
|
47
|
-
row
|
|
48
|
-
})
|
|
49
|
-
expect(usageQuota.update).toHaveBeenCalledWith("rows", 1)
|
|
50
|
-
})
|
|
51
|
-
})
|
|
52
|
-
|
|
53
42
|
it("should check invalid inputs return an error", async () => {
|
|
54
43
|
const res = await setup.runStep(setup.actions.CREATE_ROW.stepId, {})
|
|
55
44
|
expect(res.success).toEqual(false)
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
jest.mock("../../utilities/usageQuota")
|
|
2
|
-
|
|
3
|
-
const usageQuota = require("../../utilities/usageQuota")
|
|
4
1
|
const setup = require("./utilities")
|
|
5
2
|
|
|
6
3
|
describe("test the delete row action", () => {
|
|
7
|
-
let table
|
|
4
|
+
let table: any
|
|
5
|
+
let row: any
|
|
6
|
+
let inputs: any
|
|
8
7
|
let config = setup.getConfig()
|
|
9
8
|
|
|
10
9
|
beforeEach(async () => {
|
|
@@ -37,7 +36,6 @@ describe("test the delete row action", () => {
|
|
|
37
36
|
it("check usage quota attempts", async () => {
|
|
38
37
|
await setup.runInProd(async () => {
|
|
39
38
|
await setup.runStep(setup.actions.DELETE_ROW.stepId, inputs)
|
|
40
|
-
expect(usageQuota.update).toHaveBeenCalledWith("rows", -1)
|
|
41
39
|
})
|
|
42
40
|
})
|
|
43
41
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
const TestConfig = require("../../../tests/utilities/TestConfiguration")
|
|
2
|
+
const { TENANT_ID } = require("../../../tests/utilities/structures")
|
|
3
|
+
const { doInTenant } = require("@budibase/backend-core/tenancy")
|
|
2
4
|
const actions = require("../../actions")
|
|
3
5
|
const emitter = require("../../../events/index")
|
|
4
6
|
const env = require("../../../environment")
|
|
@@ -18,7 +20,6 @@ exports.afterAll = () => {
|
|
|
18
20
|
|
|
19
21
|
exports.runInProd = async fn => {
|
|
20
22
|
env._set("NODE_ENV", "production")
|
|
21
|
-
env._set("USE_QUOTAS", 1)
|
|
22
23
|
let error
|
|
23
24
|
try {
|
|
24
25
|
await fn()
|
|
@@ -26,21 +27,22 @@ exports.runInProd = async fn => {
|
|
|
26
27
|
error = err
|
|
27
28
|
}
|
|
28
29
|
env._set("NODE_ENV", "jest")
|
|
29
|
-
env._set("USE_QUOTAS", null)
|
|
30
30
|
if (error) {
|
|
31
31
|
throw error
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
exports.runStep = async function runStep(stepId, inputs) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
36
|
+
return doInTenant(TENANT_ID, async () => {
|
|
37
|
+
let step = await actions.getAction(stepId)
|
|
38
|
+
expect(step).toBeDefined()
|
|
39
|
+
return step({
|
|
40
|
+
inputs,
|
|
41
|
+
appId: config ? config.getAppId() : null,
|
|
42
|
+
// don't really need an API key, mocked out usage quota, not being tested here
|
|
43
|
+
apiKey: exports.apiKey,
|
|
44
|
+
emitter,
|
|
45
|
+
})
|
|
44
46
|
})
|
|
45
47
|
}
|
|
46
48
|
|