@budibase/server 0.0.32 → 0.0.999-alpha.30
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 +6 -0
- package/.yarnrc +1 -0
- package/Dockerfile +41 -0
- package/LICENSE +391 -377
- package/__mocks__/@elastic/elasticsearch.ts +24 -0
- package/__mocks__/@google-cloud/firestore.ts +36 -0
- package/__mocks__/@sendgrid/mail.ts +22 -0
- package/__mocks__/airtable.ts +8 -0
- package/__mocks__/arangojs.ts +24 -0
- package/__mocks__/aws-sdk.ts +80 -0
- package/__mocks__/mongodb.ts +39 -0
- package/__mocks__/mssql.ts +24 -0
- package/__mocks__/mysql2/promise.ts +17 -0
- package/__mocks__/mysql2.ts +14 -0
- package/__mocks__/node-fetch.ts +201 -0
- package/__mocks__/oracledb.ts +31 -0
- package/__mocks__/pg.ts +30 -0
- package/babel.config.js +3 -0
- package/build/entitlements.mac.plist +14 -0
- package/build/icon.icns +0 -0
- package/build/icon.png +0 -0
- package/build/icons/512x512.png +0 -0
- package/build/pouchdb.js +9 -0
- package/builder/assets/auth0-logo.6fa5973f.png +0 -0
- package/builder/assets/backups-default.8c011f1b.png +0 -0
- package/builder/assets/bb-emblem.05f7ae7a.svg +80 -0
- package/builder/assets/bb-space-man.5be51a45.svg +290 -0
- package/builder/assets/bb-spaceship.8f6e81e1.svg +227 -0
- package/builder/assets/bg.29e85dd5.png +0 -0
- package/builder/assets/blankScreenPreview.72634dd1.png +0 -0
- package/builder/assets/bulgaria.bd68393d.png +0 -0
- package/builder/assets/covanta.72c46c1e.png +0 -0
- package/builder/assets/discord.c14881e9.svg +10 -0
- package/builder/assets/google-logo.c16467b8.png +0 -0
- package/builder/assets/index.c0265b74.css +6 -0
- package/builder/assets/index.c977bf31.js +1776 -0
- package/builder/assets/integromat.42212f11.png +0 -0
- package/builder/assets/listScreenPreview.599c0aae.png +0 -0
- package/builder/assets/microsoft-logo.07033b2a.png +0 -0
- package/builder/assets/oidc-logo.cb2fff74.png +0 -0
- package/builder/assets/okta-logo.61437d3d.png +0 -0
- package/builder/assets/onelogin-logo.181cc193.png +0 -0
- package/builder/assets/oracle.66592424.png +0 -0
- package/builder/assets/remixicon.0ac8bc3c.ttf +0 -0
- package/builder/assets/remixicon.64bb3a0f.eot +0 -0
- package/builder/assets/remixicon.a10268fe.svg +6835 -0
- package/builder/assets/remixicon.c2dacfbc.woff +0 -0
- package/builder/assets/remixicon.e61f0d10.woff2 +0 -0
- package/builder/assets/schnellecke.cf1837a8.png +0 -0
- package/builder/assets/slack.1e1f7cfb.svg +33 -0
- package/builder/assets/zapier.3fbd8f5c.png +0 -0
- package/builder/index.html +10 -13
- package/dist/api/controllers/analytics.js +46 -0
- package/dist/api/controllers/apikeys.js +72 -0
- package/dist/api/controllers/application.js +575 -0
- package/dist/api/controllers/auth.js +80 -0
- package/dist/api/controllers/automation.js +303 -0
- package/dist/api/controllers/backup.js +37 -0
- package/dist/api/controllers/cloud.js +130 -0
- package/dist/api/controllers/component.js +59 -0
- package/dist/api/controllers/datasource.js +306 -0
- package/dist/api/controllers/deploy/Deployment.js +53 -0
- package/dist/api/controllers/deploy/index.js +198 -0
- package/dist/api/controllers/dev.js +146 -0
- package/dist/api/controllers/integration.js +28 -0
- package/dist/api/controllers/layout.js +49 -0
- package/dist/api/controllers/metadata.js +63 -0
- package/dist/api/controllers/migrations.js +29 -0
- package/dist/api/controllers/ops.js +40 -0
- package/dist/api/controllers/permission.js +162 -0
- package/dist/api/controllers/plugin/file.js +24 -0
- package/dist/api/controllers/plugin/github.js +69 -0
- package/dist/api/controllers/plugin/index.js +112 -0
- package/dist/api/controllers/plugin/npm.js +58 -0
- package/dist/api/controllers/plugin/uploaders.js +11 -0
- package/dist/api/controllers/plugin/url.js +24 -0
- package/dist/api/controllers/plugin/utils.js +27 -0
- package/dist/api/controllers/public/applications.js +146 -0
- package/dist/api/controllers/public/mapping/applications.js +29 -0
- package/dist/api/controllers/public/mapping/index.js +11 -0
- package/dist/api/controllers/public/mapping/queries.js +36 -0
- package/dist/api/controllers/public/mapping/rows.js +24 -0
- package/dist/api/controllers/public/mapping/tables.js +23 -0
- package/dist/api/controllers/public/mapping/types.js +2 -0
- package/dist/api/controllers/public/mapping/users.js +29 -0
- package/dist/api/controllers/public/metrics.js +113 -0
- package/dist/api/controllers/public/queries.js +58 -0
- package/dist/api/controllers/public/rows.js +120 -0
- package/dist/api/controllers/public/tables.js +95 -0
- package/dist/api/controllers/public/users.js +93 -0
- package/dist/api/controllers/public/utils.js +56 -0
- package/dist/api/controllers/query/import/index.js +87 -0
- package/dist/api/controllers/query/import/sources/base/index.js +75 -0
- package/dist/api/controllers/query/import/sources/base/openapi.js +42 -0
- package/dist/api/controllers/query/import/sources/curl.js +99 -0
- package/dist/api/controllers/query/import/sources/openapi2.js +145 -0
- package/dist/api/controllers/query/import/sources/openapi3.js +177 -0
- package/dist/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
- package/dist/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
- package/dist/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
- package/dist/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
- package/dist/api/controllers/query/index.js +299 -0
- package/dist/api/controllers/query/validation.js +53 -0
- package/dist/api/controllers/role.js +109 -0
- package/dist/api/controllers/routing.js +105 -0
- package/dist/api/controllers/row/ExternalRequest.js +676 -0
- package/dist/api/controllers/row/external.js +339 -0
- package/dist/api/controllers/row/index.js +203 -0
- package/dist/api/controllers/row/internal.js +502 -0
- package/dist/api/controllers/row/internalSearch.js +28 -0
- package/dist/api/controllers/row/staticFormula.js +165 -0
- package/dist/api/controllers/row/utils.js +183 -0
- package/dist/api/controllers/screen.js +110 -0
- package/dist/api/controllers/script.js +30 -0
- package/dist/api/controllers/static/index.js +268 -0
- package/dist/api/controllers/static/templates/BudibaseApp.svelte +135 -0
- package/dist/api/controllers/static/templates/app.hbs +13 -0
- package/dist/api/controllers/static/templates/preview.hbs +117 -0
- package/dist/api/controllers/table/bulkFormula.js +173 -0
- package/dist/api/controllers/table/external.js +279 -0
- package/dist/api/controllers/table/index.js +179 -0
- package/dist/api/controllers/table/internal.js +194 -0
- package/dist/api/controllers/table/utils.js +374 -0
- package/dist/api/controllers/templates.js +56 -0
- package/dist/api/controllers/user.js +124 -0
- package/dist/api/controllers/view/exporters.js +44 -0
- package/dist/api/controllers/view/index.js +193 -0
- package/dist/api/controllers/view/utils.js +177 -0
- package/dist/api/controllers/view/viewBuilder.js +158 -0
- package/dist/api/controllers/webhook.js +134 -0
- package/dist/api/index.js +56 -0
- package/dist/api/routes/analytics.js +34 -0
- package/dist/api/routes/apikeys.js +37 -0
- package/dist/api/routes/application.js +48 -0
- package/dist/api/routes/auth.js +33 -0
- package/dist/api/routes/automation.js +50 -0
- package/dist/api/routes/backup.js +35 -0
- package/dist/api/routes/cloud.js +39 -0
- package/dist/api/routes/component.js +35 -0
- package/dist/api/routes/datasource.js +43 -0
- package/dist/api/routes/deploy.js +37 -0
- package/dist/api/routes/dev.js +49 -0
- package/dist/api/routes/index.js +77 -0
- package/dist/api/routes/integration.js +37 -0
- package/dist/api/routes/layout.js +37 -0
- package/dist/api/routes/metadata.js +40 -0
- package/dist/api/routes/migrations.js +36 -0
- package/dist/api/routes/ops.js +52 -0
- package/dist/api/routes/permission.js +44 -0
- package/dist/api/routes/plugin.js +39 -0
- package/dist/api/routes/public/applications.js +174 -0
- package/dist/api/routes/public/index.js +131 -0
- package/dist/api/routes/public/metrics.js +30 -0
- package/dist/api/routes/public/middleware/mapper.js +97 -0
- package/dist/api/routes/public/queries.js +72 -0
- package/dist/api/routes/public/rows.js +158 -0
- package/dist/api/routes/public/tables.js +152 -0
- package/dist/api/routes/public/users.js +135 -0
- package/dist/api/routes/public/utils/Endpoint.js +36 -0
- package/dist/api/routes/query.js +47 -0
- package/dist/api/routes/role.js +40 -0
- package/dist/api/routes/routing.js +39 -0
- package/dist/api/routes/row.js +239 -0
- package/dist/api/routes/screen.js +39 -0
- package/dist/api/routes/script.js +35 -0
- package/dist/api/routes/static.js +80 -0
- package/dist/api/routes/table.js +163 -0
- package/dist/api/routes/templates.js +37 -0
- package/dist/api/routes/user.js +43 -0
- package/dist/api/routes/utils/validators.js +238 -0
- package/dist/api/routes/view.js +42 -0
- package/dist/api/routes/webhook.js +43 -0
- package/dist/app.js +132 -0
- package/dist/automations/actions.js +137 -0
- package/dist/automations/automationUtils.js +173 -0
- package/dist/automations/bullboard.js +71 -0
- package/dist/automations/index.js +43 -0
- package/dist/automations/logging/index.js +53 -0
- package/dist/automations/steps/bash.js +111 -0
- package/dist/automations/steps/createRow.js +108 -0
- package/dist/automations/steps/delay.js +53 -0
- package/dist/automations/steps/deleteRow.js +96 -0
- package/dist/automations/steps/discord.js +116 -0
- package/dist/automations/steps/executeQuery.js +134 -0
- package/dist/automations/steps/executeScript.js +106 -0
- package/dist/automations/steps/filter.js +112 -0
- package/dist/automations/steps/integromat.js +119 -0
- package/dist/automations/steps/loop.js +54 -0
- package/dist/automations/steps/outgoingWebhook.js +166 -0
- package/dist/automations/steps/queryRows.js +216 -0
- package/dist/automations/steps/sendSmtpEmail.js +115 -0
- package/dist/automations/steps/serverLog.js +65 -0
- package/dist/automations/steps/slack.js +98 -0
- package/dist/automations/steps/updateRow.js +144 -0
- package/dist/automations/steps/utils.js +56 -0
- package/dist/automations/steps/zapier.js +117 -0
- package/dist/automations/triggerInfo/app.js +36 -0
- package/dist/automations/triggerInfo/cron.js +35 -0
- package/dist/automations/triggerInfo/index.js +40 -0
- package/dist/automations/triggerInfo/rowDeleted.js +36 -0
- package/dist/automations/triggerInfo/rowSaved.js +44 -0
- package/dist/automations/triggerInfo/rowUpdated.js +44 -0
- package/dist/automations/triggerInfo/webhook.js +40 -0
- package/dist/automations/triggers.js +180 -0
- package/dist/automations/utils.js +264 -0
- package/dist/constants/definitions.js +2 -0
- package/dist/constants/index.js +181 -0
- package/dist/constants/layouts.js +148 -0
- package/dist/constants/screens.js +51 -0
- package/dist/db/defaultData/datasource_bb_default.js +574 -0
- package/dist/db/defaultData/employeeImport.js +155 -0
- package/dist/db/defaultData/expensesImport.js +117 -0
- package/dist/db/defaultData/inventoryImport.js +109 -0
- package/dist/db/defaultData/jobsImport.js +152 -0
- package/dist/db/dynamoClient.js +124 -0
- package/dist/db/inMemoryView.js +62 -0
- package/dist/db/index.js +43 -0
- package/dist/db/linkedRows/LinkController.js +392 -0
- package/dist/db/linkedRows/LinkDocument.js +33 -0
- package/dist/db/linkedRows/index.js +206 -0
- package/dist/db/linkedRows/linkUtils.js +131 -0
- package/dist/db/newid.js +7 -0
- package/dist/db/utils.js +247 -0
- package/dist/db/views/staticViews.js +144 -0
- package/dist/ddApm.js +11 -0
- package/dist/definitions/automations.js +8 -0
- package/dist/definitions/common.js +2 -0
- package/dist/definitions/datasource.js +7 -0
- package/dist/definitions/openapi.js +6 -0
- package/dist/environment.js +113 -0
- package/dist/events/AutomationEmitter.js +53 -0
- package/dist/events/BudibaseEmitter.js +25 -0
- package/dist/events/docUpdates/index.js +17 -0
- package/dist/events/docUpdates/processors.js +18 -0
- package/dist/events/docUpdates/syncUsers.js +49 -0
- package/dist/events/index.js +11 -0
- package/dist/events/utils.js +43 -0
- package/dist/index.js +16 -0
- package/dist/integrations/airtable.js +147 -0
- package/dist/integrations/arangodb.js +103 -0
- package/dist/integrations/base/query.js +32 -0
- package/dist/integrations/base/sql.js +600 -0
- package/dist/integrations/base/sqlTable.js +160 -0
- package/dist/integrations/base/types.js +2 -0
- package/dist/integrations/couchdb.js +125 -0
- package/dist/integrations/dynamodb.js +194 -0
- package/dist/integrations/elasticsearch.js +186 -0
- package/dist/integrations/firebase.js +174 -0
- package/dist/integrations/googlesheets.js +455 -0
- package/dist/integrations/index.js +135 -0
- package/dist/integrations/microsoftSqlServer.js +273 -0
- package/dist/integrations/mongodb.js +614 -0
- package/dist/integrations/mysql.js +256 -0
- package/dist/integrations/oracle.js +375 -0
- package/dist/integrations/postgres.js +300 -0
- package/dist/integrations/queries/sql.js +84 -0
- package/dist/integrations/redis.js +168 -0
- package/dist/integrations/rest.js +400 -0
- package/dist/integrations/s3.js +237 -0
- package/dist/integrations/snowflake.js +99 -0
- package/dist/integrations/utils.js +295 -0
- package/dist/middleware/appInfo.js +22 -0
- package/dist/middleware/authorized.js +112 -0
- package/dist/middleware/builder.js +93 -0
- package/dist/middleware/currentapp.js +103 -0
- package/dist/middleware/joi-validator.js +43 -0
- package/dist/middleware/publicApi.js +25 -0
- package/dist/middleware/resourceId.js +59 -0
- package/dist/middleware/selfhost.js +24 -0
- package/dist/middleware/utils.js +8 -0
- package/dist/migrations/functions/appUrls.js +42 -0
- package/dist/migrations/functions/backfill/app/automations.js +31 -0
- package/dist/migrations/functions/backfill/app/datasources.js +28 -0
- package/dist/migrations/functions/backfill/app/layouts.js +33 -0
- package/dist/migrations/functions/backfill/app/queries.js +50 -0
- package/dist/migrations/functions/backfill/app/roles.js +28 -0
- package/dist/migrations/functions/backfill/app/screens.js +28 -0
- package/dist/migrations/functions/backfill/app/tables.js +37 -0
- package/dist/migrations/functions/backfill/app.js +176 -0
- package/dist/migrations/functions/backfill/global/configs.js +67 -0
- package/dist/migrations/functions/backfill/global/quotas.js +60 -0
- package/dist/migrations/functions/backfill/global/users.js +50 -0
- package/dist/migrations/functions/backfill/global.js +205 -0
- package/dist/migrations/functions/backfill/index.js +32 -0
- package/dist/migrations/functions/backfill/installation.js +80 -0
- package/dist/migrations/functions/syncQuotas.js +50 -0
- package/dist/migrations/functions/tableSettings.js +130 -0
- package/dist/migrations/functions/usageQuotas/index.js +16 -0
- package/dist/migrations/functions/usageQuotas/syncApps.js +25 -0
- package/dist/migrations/functions/usageQuotas/syncPlugins.js +23 -0
- package/dist/migrations/functions/usageQuotas/syncRows.js +33 -0
- package/dist/migrations/functions/userEmailViewCasing.js +24 -0
- package/dist/migrations/index.js +111 -0
- package/dist/migrations/tests/helpers.js +72 -0
- package/dist/migrations/tests/structures.js +37 -0
- package/dist/package.json +180 -0
- package/dist/sdk/app/applications/index.js +28 -0
- package/dist/sdk/app/applications/sync.js +164 -0
- package/dist/sdk/app/applications/utils.js +21 -0
- package/dist/sdk/app/automations/index.js +29 -0
- package/dist/sdk/app/automations/webhook.js +54 -0
- package/dist/sdk/app/backups/constants.js +6 -0
- package/dist/sdk/app/backups/exports.js +184 -0
- package/dist/sdk/app/backups/imports.js +170 -0
- package/dist/sdk/app/backups/index.js +29 -0
- package/dist/sdk/app/backups/statistics.js +73 -0
- package/dist/sdk/app/datasources/datasources.js +166 -0
- package/dist/sdk/app/datasources/index.js +27 -0
- package/dist/sdk/app/queries/index.js +27 -0
- package/dist/sdk/app/queries/queries.js +60 -0
- package/dist/sdk/app/rows/attachments.js +61 -0
- package/dist/sdk/app/rows/index.js +28 -0
- package/dist/sdk/app/rows/rows.js +30 -0
- package/dist/sdk/app/tables/index.js +65 -0
- package/dist/sdk/index.js +27 -0
- package/dist/sdk/plugins/index.js +27 -0
- package/dist/sdk/plugins/plugins.js +53 -0
- package/dist/sdk/users/index.js +27 -0
- package/dist/sdk/users/utils.js +87 -0
- package/dist/sdk/utils/index.js +29 -0
- package/dist/startup.js +158 -0
- package/dist/threads/automation.js +449 -0
- package/dist/threads/definitions.js +2 -0
- package/dist/threads/index.js +137 -0
- package/dist/threads/query.js +265 -0
- package/dist/threads/utils.js +122 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -0
- package/dist/utilities/appDirectoryTemplate/package.json +10 -0
- package/dist/utilities/budibaseDir.js +5 -0
- package/dist/utilities/centralPath.js +27 -0
- package/dist/utilities/fileSystem/app.js +88 -0
- package/dist/utilities/fileSystem/clientLibrary.js +138 -0
- package/dist/utilities/fileSystem/filesystem.js +180 -0
- package/dist/utilities/fileSystem/index.js +21 -0
- package/dist/utilities/fileSystem/plugin.js +76 -0
- package/dist/utilities/fileSystem/processor.js +34 -0
- package/dist/utilities/fileSystem/template.js +47 -0
- package/dist/utilities/global.js +149 -0
- package/dist/utilities/index.js +143 -0
- package/dist/utilities/redis.js +117 -0
- package/dist/utilities/retry.js +30 -0
- package/dist/utilities/routing/index.js +39 -0
- package/dist/utilities/rowProcessor/index.js +284 -0
- package/dist/utilities/rowProcessor/map.js +99 -0
- package/dist/utilities/rowProcessor/utils.js +88 -0
- package/dist/utilities/schema.js +108 -0
- package/dist/utilities/scriptRunner.js +26 -0
- package/dist/utilities/security.js +57 -0
- package/dist/utilities/statusCodes.js +9 -0
- package/dist/utilities/usageQuota/rows.js +88 -0
- package/dist/utilities/usageQuota/usageQuoteReset.js +16 -0
- package/dist/utilities/users.js +57 -0
- package/dist/utilities/workerRequests.js +171 -0
- package/dist/watch.js +53 -0
- package/dist/websockets/client.js +14 -0
- package/dist/websockets/grid.js +60 -0
- package/dist/websockets/index.js +17 -0
- package/dist/websockets/websocket.js +78 -0
- package/docker_run.sh +7 -0
- package/jest-testcontainers-config.js +8 -0
- package/jest.config.ts +52 -0
- package/nodemon.json +10 -0
- package/package.json +166 -31
- package/pm2.config.js +9 -0
- package/scripts/account.js +8 -0
- package/scripts/dev/manage.js +119 -0
- package/scripts/docs/README.md +31 -0
- package/scripts/docs/generate.js +74 -0
- package/scripts/docs/toSwagger.js +320 -0
- package/scripts/exportAppTemplate.js +64 -0
- package/scripts/integrations/customer-categories/docker-compose.yml +28 -0
- package/scripts/integrations/customer-categories/init.sql +41 -0
- package/scripts/integrations/customer-categories/reset.sh +3 -0
- package/scripts/integrations/mssql/data/Dockerfile +9 -0
- package/scripts/integrations/mssql/data/entrypoint.sh +25 -0
- package/scripts/integrations/mssql/data/setup.sql +80 -0
- package/scripts/integrations/mssql/docker-compose.yaml +12 -0
- package/scripts/integrations/mssql/reset.sh +3 -0
- package/scripts/integrations/mysql/docker-compose.yaml +21 -0
- package/scripts/integrations/mysql/init.sql +32 -0
- package/scripts/integrations/mysql/reset.sh +3 -0
- package/scripts/integrations/oracle/docker-compose.yml +19 -0
- package/scripts/integrations/oracle/instantclient/linux/arm64/basiclite-19.10.zip +0 -0
- package/scripts/integrations/oracle/instantclient/linux/arm64/install.sh +23 -0
- package/scripts/integrations/oracle/instantclient/linux/install.sh +10 -0
- package/scripts/integrations/oracle/instantclient/linux/x86-64/basiclite-21.4.zip +0 -0
- package/scripts/integrations/oracle/instantclient/linux/x86-64/install.sh +23 -0
- package/scripts/integrations/oracle/oracle.md +90 -0
- package/scripts/integrations/pg-json/docker-compose.yml +28 -0
- package/scripts/integrations/pg-json/init.sql +22 -0
- package/scripts/integrations/pg-json/reset.sh +3 -0
- package/scripts/integrations/postgres/docker-compose.yml +28 -0
- package/scripts/integrations/postgres/emp-skill.sql +46 -0
- package/scripts/integrations/postgres/emp-territory.sql +32 -0
- package/scripts/integrations/postgres/init.sql +57 -0
- package/scripts/integrations/postgres/reset.sh +3 -0
- package/scripts/integrations/service-vehicles/docker-compose.yml +28 -0
- package/scripts/integrations/service-vehicles/init.sql +52 -0
- package/scripts/integrations/service-vehicles/reset.sh +3 -0
- package/scripts/load/create-many-apps.js +24 -0
- package/scripts/load/create-many-rows.js +30 -0
- package/scripts/load/utils.js +66 -0
- package/scripts/localdomain.js +52 -0
- package/scripts/multiTenancy.js +8 -0
- package/scripts/selfhost.js +8 -0
- package/scripts/test.sh +14 -0
- package/scripts/watchtower-hooks/post-check.sh +1 -0
- package/scripts/watchtower-hooks/post-update.sh +1 -0
- package/scripts/watchtower-hooks/pre-check.sh +1 -0
- package/scripts/watchtower-hooks/pre-update.sh +1 -0
- package/specs/generate.ts +92 -0
- package/specs/openapi.json +2782 -0
- package/specs/openapi.yaml +2111 -0
- package/specs/parameters.ts +59 -0
- package/specs/resources/application.ts +137 -0
- package/specs/resources/index.ts +26 -0
- package/specs/resources/metrics.ts +81 -0
- package/specs/resources/misc.ts +128 -0
- package/specs/resources/query.ts +217 -0
- package/specs/resources/row.ts +124 -0
- package/specs/resources/table.ts +197 -0
- package/specs/resources/user.ts +132 -0
- package/specs/resources/utils/Resource.ts +39 -0
- package/specs/resources/utils/index.ts +11 -0
- package/specs/security.ts +7 -0
- package/src/api/controllers/analytics.ts +35 -0
- package/src/api/controllers/apikeys.ts +54 -0
- package/src/api/controllers/application.ts +633 -0
- package/src/api/controllers/auth.ts +72 -0
- package/src/api/controllers/automation.ts +302 -0
- package/src/api/controllers/backup.ts +21 -0
- package/src/api/controllers/cloud.ts +119 -0
- package/src/api/controllers/component.ts +58 -0
- package/src/api/controllers/datasource.ts +351 -0
- package/src/api/controllers/deploy/Deployment.ts +59 -0
- package/src/api/controllers/deploy/index.ts +203 -0
- package/src/api/controllers/dev.ts +129 -0
- package/src/api/controllers/integration.ts +13 -0
- package/src/api/controllers/layout.ts +47 -0
- package/src/api/controllers/metadata.ts +42 -0
- package/src/api/controllers/migrations.ts +14 -0
- package/src/api/controllers/ops.ts +32 -0
- package/src/api/controllers/permission.ts +178 -0
- package/src/api/controllers/plugin/file.ts +15 -0
- package/src/api/controllers/plugin/github.ts +75 -0
- package/src/api/controllers/plugin/index.ts +101 -0
- package/src/api/controllers/plugin/npm.ts +56 -0
- package/src/api/controllers/plugin/uploaders.ts +4 -0
- package/src/api/controllers/plugin/url.ts +12 -0
- package/src/api/controllers/plugin/utils.ts +17 -0
- package/src/api/controllers/public/applications.ts +100 -0
- package/src/api/controllers/public/mapping/applications.ts +32 -0
- package/src/api/controllers/public/mapping/index.ts +13 -0
- package/src/api/controllers/public/mapping/queries.ts +39 -0
- package/src/api/controllers/public/mapping/rows.ts +31 -0
- package/src/api/controllers/public/mapping/tables.ts +26 -0
- package/src/api/controllers/public/mapping/types.ts +21 -0
- package/src/api/controllers/public/mapping/users.ts +32 -0
- package/src/api/controllers/public/metrics.ts +251 -0
- package/src/api/controllers/public/queries.ts +20 -0
- package/src/api/controllers/public/rows.ts +81 -0
- package/src/api/controllers/public/tables.ts +56 -0
- package/src/api/controllers/public/users.ts +80 -0
- package/src/api/controllers/public/utils.ts +45 -0
- package/src/api/controllers/query/import/index.ts +96 -0
- package/src/api/controllers/query/import/sources/base/index.ts +98 -0
- package/src/api/controllers/query/import/sources/base/openapi.ts +24 -0
- package/src/api/controllers/query/import/sources/curl.ts +106 -0
- package/src/api/controllers/query/import/sources/openapi2.ts +167 -0
- package/src/api/controllers/query/import/sources/openapi3.ts +209 -0
- package/src/api/controllers/query/import/sources/tests/curl/curl.spec.js +103 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/delete.txt +1 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/empty-body.txt +2 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/get.txt +1 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/headers.txt +3 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/patch.txt +2 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/path.txt +1 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/post.txt +2 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/put.txt +2 -0
- package/src/api/controllers/query/import/sources/tests/curl/data/query.txt +1 -0
- package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.json +253 -0
- package/src/api/controllers/query/import/sources/tests/openapi2/data/crud/crud.yaml +160 -0
- package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.json +1054 -0
- package/src/api/controllers/query/import/sources/tests/openapi2/data/petstore/petstore.yaml +711 -0
- package/src/api/controllers/query/import/sources/tests/openapi2/openapi2.spec.js +238 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.json +253 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/crud/crud.yaml +153 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.json +1225 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/data/petstore/petstore.yaml +804 -0
- package/src/api/controllers/query/import/sources/tests/openapi3/openapi3.spec.js +240 -0
- package/src/api/controllers/query/import/tests/index.spec.js +162 -0
- package/src/api/controllers/query/index.ts +307 -0
- package/src/api/controllers/query/validation.ts +50 -0
- package/src/api/controllers/role.ts +104 -0
- package/src/api/controllers/routing.ts +95 -0
- package/src/api/controllers/row/ExternalRequest.ts +821 -0
- package/src/api/controllers/row/external.ts +304 -0
- package/src/api/controllers/row/index.ts +162 -0
- package/src/api/controllers/row/internal.ts +500 -0
- package/src/api/controllers/row/internalSearch.ts +18 -0
- package/src/api/controllers/row/staticFormula.ts +170 -0
- package/src/api/controllers/row/utils.ts +156 -0
- package/src/api/controllers/screen.ts +126 -0
- package/src/api/controllers/script.ts +12 -0
- package/src/api/controllers/static/index.ts +241 -0
- package/src/api/controllers/static/templates/BudibaseApp.svelte +135 -0
- package/src/api/controllers/static/templates/app.hbs +13 -0
- package/src/api/controllers/static/templates/preview.hbs +117 -0
- package/src/api/controllers/table/bulkFormula.ts +188 -0
- package/src/api/controllers/table/external.ts +364 -0
- package/src/api/controllers/table/index.ts +143 -0
- package/src/api/controllers/table/internal.ts +191 -0
- package/src/api/controllers/table/tests/utils.spec.ts +97 -0
- package/src/api/controllers/table/utils.ts +422 -0
- package/src/api/controllers/templates.ts +43 -0
- package/src/api/controllers/user.ts +97 -0
- package/src/api/controllers/view/exporters.ts +43 -0
- package/src/api/controllers/view/index.ts +192 -0
- package/src/api/controllers/view/tests/__snapshots__/viewBuilder.spec.js.snap +147 -0
- package/src/api/controllers/view/tests/viewBuilder.spec.js +65 -0
- package/src/api/controllers/view/utils.ts +165 -0
- package/src/api/controllers/view/viewBuilder.ts +203 -0
- package/src/api/controllers/webhook.ts +100 -0
- package/src/api/index.ts +63 -0
- package/src/api/routes/analytics.ts +9 -0
- package/src/api/routes/apikeys.ts +12 -0
- package/src/api/routes/application.ts +57 -0
- package/src/api/routes/auth.ts +8 -0
- package/src/api/routes/automation.ts +87 -0
- package/src/api/routes/backup.ts +14 -0
- package/src/api/routes/cloud.ts +18 -0
- package/src/api/routes/component.ts +14 -0
- package/src/api/routes/datasource.ts +60 -0
- package/src/api/routes/deploy.ts +20 -0
- package/src/api/routes/dev.ts +38 -0
- package/src/api/routes/index.ts +73 -0
- package/src/api/routes/integration.ts +16 -0
- package/src/api/routes/layout.ts +16 -0
- package/src/api/routes/metadata.ts +38 -0
- package/src/api/routes/migrations.ts +14 -0
- package/src/api/routes/ops.ts +30 -0
- package/src/api/routes/permission.ts +41 -0
- package/src/api/routes/plugin.ts +22 -0
- package/src/api/routes/public/applications.ts +195 -0
- package/src/api/routes/public/index.ts +145 -0
- package/src/api/routes/public/metrics.ts +28 -0
- package/src/api/routes/public/middleware/mapper.ts +85 -0
- package/src/api/routes/public/queries.ts +76 -0
- package/src/api/routes/public/rows.ts +171 -0
- package/src/api/routes/public/tables.ts +167 -0
- package/src/api/routes/public/tests/compare.spec.ts +185 -0
- package/src/api/routes/public/tests/metrics.spec.js +34 -0
- package/src/api/routes/public/tests/users.spec.js +38 -0
- package/src/api/routes/public/tests/utils.ts +45 -0
- package/src/api/routes/public/users.ts +142 -0
- package/src/api/routes/public/utils/Endpoint.ts +51 -0
- package/src/api/routes/query.ts +61 -0
- package/src/api/routes/role.ts +24 -0
- package/src/api/routes/routing.ts +14 -0
- package/src/api/routes/row.ts +266 -0
- package/src/api/routes/screen.ts +23 -0
- package/src/api/routes/script.ts +10 -0
- package/src/api/routes/static.ts +65 -0
- package/src/api/routes/table.ts +170 -0
- package/src/api/routes/templates.ts +16 -0
- package/src/api/routes/tests/__snapshots__/datasource.spec.ts.snap +93 -0
- package/src/api/routes/tests/__snapshots__/view.spec.js.snap +38 -0
- package/src/api/routes/tests/analytics.spec.js +62 -0
- package/src/api/routes/tests/apikeys.spec.js +59 -0
- package/src/api/routes/tests/appSync.spec.ts +31 -0
- package/src/api/routes/tests/application.spec.ts +327 -0
- package/src/api/routes/tests/auth.spec.js +24 -0
- package/src/api/routes/tests/automation.spec.js +349 -0
- package/src/api/routes/tests/backup.spec.ts +45 -0
- package/src/api/routes/tests/cloud.spec.ts +54 -0
- package/src/api/routes/tests/component.spec.js +32 -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/data/export.txt +1 -0
- package/src/api/routes/tests/data/old-app.txt +3 -0
- package/src/api/routes/tests/datasource.spec.ts +238 -0
- package/src/api/routes/tests/dev.spec.js +40 -0
- package/src/api/routes/tests/environmentVariables.spec.ts +144 -0
- package/src/api/routes/tests/integration.spec.js +52 -0
- package/src/api/routes/tests/internalSearch.spec.js +197 -0
- package/src/api/routes/tests/layout.spec.js +59 -0
- package/src/api/routes/tests/metadata.spec.js +65 -0
- package/src/api/routes/tests/misc.spec.js +91 -0
- package/src/api/routes/tests/permissions.spec.js +133 -0
- package/src/api/routes/tests/plugin.spec.ts +179 -0
- package/src/api/routes/tests/query.seq.spec.js +538 -0
- package/src/api/routes/tests/role.spec.js +131 -0
- package/src/api/routes/tests/routing.spec.js +116 -0
- package/src/api/routes/tests/row.spec.js +573 -0
- package/src/api/routes/tests/screen.spec.js +103 -0
- package/src/api/routes/tests/static.spec.js +140 -0
- package/src/api/routes/tests/table.spec.js +302 -0
- package/src/api/routes/tests/templates.spec.js +24 -0
- package/src/api/routes/tests/user.spec.js +208 -0
- package/src/api/routes/tests/utilities/TestFunctions.ts +177 -0
- package/src/api/routes/tests/utilities/index.ts +96 -0
- package/src/api/routes/tests/view.spec.js +419 -0
- package/src/api/routes/tests/webhook.spec.js +134 -0
- package/src/api/routes/user.ts +46 -0
- package/src/api/routes/utils/validators.ts +240 -0
- package/src/api/routes/view.ts +34 -0
- package/src/api/routes/webhook.ts +27 -0
- package/src/app.ts +114 -0
- package/src/automations/actions.ts +109 -0
- package/src/automations/automationUtils.ts +163 -0
- package/src/automations/bullboard.ts +38 -0
- package/src/automations/index.ts +26 -0
- package/src/automations/logging/index.ts +38 -0
- package/src/automations/steps/bash.ts +81 -0
- package/src/automations/steps/createRow.ts +102 -0
- package/src/automations/steps/delay.ts +46 -0
- package/src/automations/steps/deleteRow.ts +91 -0
- package/src/automations/steps/discord.ts +106 -0
- package/src/automations/steps/executeQuery.ts +98 -0
- package/src/automations/steps/executeScript.ts +83 -0
- package/src/automations/steps/filter.ts +105 -0
- package/src/automations/steps/integromat.ts +110 -0
- package/src/automations/steps/loop.ts +58 -0
- package/src/automations/steps/outgoingWebhook.ts +141 -0
- package/src/automations/steps/queryRows.ts +196 -0
- package/src/automations/steps/sendSmtpEmail.ts +92 -0
- package/src/automations/steps/serverLog.ts +59 -0
- package/src/automations/steps/slack.ts +87 -0
- package/src/automations/steps/updateRow.ts +121 -0
- package/src/automations/steps/utils.ts +46 -0
- package/src/automations/steps/zapier.ts +108 -0
- package/src/automations/tests/automation.spec.ts +99 -0
- package/src/automations/tests/bash.spec.js +34 -0
- package/src/automations/tests/createRow.spec.ts +46 -0
- package/src/automations/tests/delay.spec.js +16 -0
- package/src/automations/tests/deleteRow.spec.ts +55 -0
- package/src/automations/tests/discord.spec.js +27 -0
- package/src/automations/tests/executeQuery.spec.js +48 -0
- package/src/automations/tests/executeScript.spec.js +48 -0
- package/src/automations/tests/filter.spec.js +49 -0
- package/src/automations/tests/loop.spec.ts +45 -0
- package/src/automations/tests/outgoingWebhook.spec.js +39 -0
- package/src/automations/tests/queryRows.spec.js +117 -0
- package/src/automations/tests/sendSmtpEmail.spec.js +71 -0
- package/src/automations/tests/serverLog.spec.js +22 -0
- package/src/automations/tests/updateRow.spec.js +44 -0
- package/src/automations/tests/utilities/index.ts +60 -0
- package/src/automations/tests/zapier.spec.js +27 -0
- package/src/automations/triggerInfo/app.ts +40 -0
- package/src/automations/triggerInfo/cron.ts +39 -0
- package/src/automations/triggerInfo/index.ts +15 -0
- package/src/automations/triggerInfo/rowDeleted.ts +40 -0
- package/src/automations/triggerInfo/rowSaved.ts +48 -0
- package/src/automations/triggerInfo/rowUpdated.ts +48 -0
- package/src/automations/triggerInfo/webhook.ts +44 -0
- package/src/automations/triggers.ts +156 -0
- package/src/automations/unitTests/automationUtils.spec.ts +133 -0
- package/src/automations/utils.ts +267 -0
- package/src/constants/definitions.ts +42 -0
- package/src/constants/index.ts +183 -0
- package/src/constants/layouts.ts +147 -0
- package/src/constants/screens.ts +48 -0
- package/src/db/defaultData/datasource_bb_default.ts +654 -0
- package/src/db/defaultData/employeeImport.ts +152 -0
- package/src/db/defaultData/expensesImport.ts +114 -0
- package/src/db/defaultData/inventoryImport.ts +106 -0
- package/src/db/defaultData/jobsImport.ts +158 -0
- package/src/db/dynamoClient.ts +147 -0
- package/src/db/inMemoryView.ts +55 -0
- package/src/db/index.ts +16 -0
- package/src/db/linkedRows/LinkController.ts +445 -0
- package/src/db/linkedRows/LinkDocument.ts +60 -0
- package/src/db/linkedRows/index.ts +217 -0
- package/src/db/linkedRows/linkUtils.ts +125 -0
- package/src/db/newid.ts +5 -0
- package/src/db/tests/linkController.spec.js +236 -0
- package/src/db/tests/linkTests.spec.js +65 -0
- package/src/db/utils.ts +272 -0
- package/src/db/views/staticViews.ts +132 -0
- package/src/ddApm.ts +7 -0
- package/src/definitions/automations.ts +33 -0
- package/src/definitions/common.ts +54 -0
- package/src/definitions/datasource.ts +9 -0
- package/src/definitions/openapi.ts +1233 -0
- package/src/environment.ts +125 -0
- package/src/events/AutomationEmitter.ts +58 -0
- package/src/events/BudibaseEmitter.ts +29 -0
- package/src/events/docUpdates/index.ts +1 -0
- package/src/events/docUpdates/processors.ts +14 -0
- package/src/events/docUpdates/syncUsers.ts +35 -0
- package/src/events/index.ts +6 -0
- package/src/events/utils.ts +78 -0
- package/src/index.ts +16 -0
- package/src/integration-test/postgres.spec.ts +1026 -0
- package/src/integrations/airtable.ts +148 -0
- package/src/integrations/arangodb.ts +110 -0
- package/src/integrations/base/query.ts +18 -0
- package/src/integrations/base/sql.ts +651 -0
- package/src/integrations/base/sqlTable.ts +202 -0
- package/src/integrations/base/types.ts +134 -0
- package/src/integrations/couchdb.ts +133 -0
- package/src/integrations/dynamodb.ts +220 -0
- package/src/integrations/elasticsearch.ts +187 -0
- package/src/integrations/firebase.ts +187 -0
- package/src/integrations/googlesheets.ts +511 -0
- package/src/integrations/index.ts +125 -0
- package/src/integrations/microsoftSqlServer.ts +312 -0
- package/src/integrations/mongodb.ts +638 -0
- package/src/integrations/mysql.ts +300 -0
- package/src/integrations/oracle.ts +435 -0
- package/src/integrations/postgres.ts +336 -0
- package/src/integrations/queries/sql.ts +81 -0
- package/src/integrations/redis.ts +163 -0
- package/src/integrations/rest.ts +436 -0
- package/src/integrations/s3.ts +260 -0
- package/src/integrations/snowflake.ts +97 -0
- package/src/integrations/tests/TestConfiguration.js +0 -0
- package/src/integrations/tests/airtable.spec.ts +75 -0
- package/src/integrations/tests/arangodb.spec.ts +38 -0
- package/src/integrations/tests/couchdb.spec.ts +86 -0
- package/src/integrations/tests/dynamodb.spec.ts +155 -0
- package/src/integrations/tests/elasticsearch.spec.ts +82 -0
- package/src/integrations/tests/firebase.spec.ts +97 -0
- package/src/integrations/tests/googlesheets.spec.ts +126 -0
- package/src/integrations/tests/microsoftSqlServer.spec.ts +56 -0
- package/src/integrations/tests/mongo.spec.ts +334 -0
- package/src/integrations/tests/mysql.spec.ts +133 -0
- package/src/integrations/tests/oracle.spec.ts +96 -0
- package/src/integrations/tests/postgres.spec.ts +81 -0
- package/src/integrations/tests/redis.spec.ts +88 -0
- package/src/integrations/tests/rest.spec.ts +595 -0
- package/src/integrations/tests/s3.spec.ts +112 -0
- package/src/integrations/tests/sql.spec.ts +639 -0
- package/src/integrations/utils.ts +330 -0
- package/src/middleware/appInfo.ts +20 -0
- package/src/middleware/authorized.ts +131 -0
- package/src/middleware/builder.ts +97 -0
- package/src/middleware/currentapp.ts +112 -0
- package/src/middleware/joi-validator.ts +40 -0
- package/src/middleware/publicApi.ts +21 -0
- package/src/middleware/resourceId.ts +66 -0
- package/src/middleware/selfhost.ts +12 -0
- package/src/middleware/tests/authorized.spec.js +163 -0
- package/src/middleware/tests/currentapp.spec.js +207 -0
- package/src/middleware/tests/resourceId.spec.js +105 -0
- package/src/middleware/tests/selfhost.spec.js +43 -0
- package/src/middleware/utils.ts +9 -0
- package/src/migrations/functions/appUrls.ts +27 -0
- package/src/migrations/functions/backfill/app/automations.ts +26 -0
- package/src/migrations/functions/backfill/app/datasources.ts +22 -0
- package/src/migrations/functions/backfill/app/layouts.ts +29 -0
- package/src/migrations/functions/backfill/app/queries.ts +47 -0
- package/src/migrations/functions/backfill/app/roles.ts +22 -0
- package/src/migrations/functions/backfill/app/screens.ts +22 -0
- package/src/migrations/functions/backfill/app/tables.ts +27 -0
- package/src/migrations/functions/backfill/app.ts +149 -0
- package/src/migrations/functions/backfill/global/configs.ts +73 -0
- package/src/migrations/functions/backfill/global/quotas.ts +60 -0
- package/src/migrations/functions/backfill/global/users.ts +49 -0
- package/src/migrations/functions/backfill/global.ts +213 -0
- package/src/migrations/functions/backfill/index.ts +7 -0
- package/src/migrations/functions/backfill/installation.ts +50 -0
- package/src/migrations/functions/syncQuotas.ts +15 -0
- package/src/migrations/functions/tableSettings.ts +145 -0
- package/src/migrations/functions/tests/appUrls.spec.js +26 -0
- package/src/migrations/functions/tests/syncQuotas.spec.js +26 -0
- package/src/migrations/functions/tests/tableSettings.spec.ts +144 -0
- package/src/migrations/functions/tests/userEmailViewCasing.spec.js +34 -0
- package/src/migrations/functions/usageQuotas/index.ts +3 -0
- package/src/migrations/functions/usageQuotas/syncApps.ts +14 -0
- package/src/migrations/functions/usageQuotas/syncPlugins.ts +10 -0
- package/src/migrations/functions/usageQuotas/syncRows.ts +27 -0
- package/src/migrations/functions/usageQuotas/tests/syncApps.spec.ts +35 -0
- package/src/migrations/functions/usageQuotas/tests/syncRows.spec.ts +53 -0
- package/src/migrations/functions/userEmailViewCasing.ts +13 -0
- package/src/migrations/index.ts +115 -0
- package/src/migrations/tests/helpers.ts +40 -0
- package/src/migrations/tests/index.spec.ts +142 -0
- package/src/migrations/tests/structures.ts +67 -0
- package/src/sdk/app/applications/index.ts +7 -0
- package/src/sdk/app/applications/sync.ts +168 -0
- package/src/sdk/app/applications/tests/sync.spec.ts +137 -0
- package/src/sdk/app/applications/utils.ts +17 -0
- package/src/sdk/app/automations/index.ts +5 -0
- package/src/sdk/app/automations/webhook.ts +43 -0
- package/src/sdk/app/backups/constants.ts +3 -0
- package/src/sdk/app/backups/exports.ts +195 -0
- package/src/sdk/app/backups/imports.ts +185 -0
- package/src/sdk/app/backups/index.ts +9 -0
- package/src/sdk/app/backups/statistics.ts +69 -0
- package/src/sdk/app/datasources/datasources.ts +162 -0
- package/src/sdk/app/datasources/index.ts +5 -0
- package/src/sdk/app/queries/index.ts +5 -0
- package/src/sdk/app/queries/queries.ts +50 -0
- package/src/sdk/app/rows/attachments.ts +60 -0
- package/src/sdk/app/rows/index.ts +7 -0
- package/src/sdk/app/rows/rows.ts +18 -0
- package/src/sdk/app/tables/index.ts +63 -0
- package/src/sdk/index.ts +24 -0
- package/src/sdk/plugins/index.ts +5 -0
- package/src/sdk/plugins/plugins.ts +41 -0
- package/src/sdk/tests/attachments.spec.ts +76 -0
- package/src/sdk/users/index.ts +5 -0
- package/src/sdk/users/tests/utils.spec.ts +128 -0
- package/src/sdk/users/utils.ts +93 -0
- package/src/sdk/utils/index.ts +16 -0
- package/src/startup.ts +138 -0
- package/src/tests/jestEnv.ts +11 -0
- package/src/tests/jestSetup.ts +22 -0
- package/src/tests/utilities/TestConfiguration.ts +768 -0
- package/src/tests/utilities/controllers.ts +14 -0
- package/src/tests/utilities/index.ts +11 -0
- package/src/tests/utilities/structures.ts +289 -0
- package/src/threads/automation.ts +502 -0
- package/src/threads/definitions.ts +21 -0
- package/src/threads/index.ts +111 -0
- package/src/threads/query.ts +305 -0
- package/src/threads/utils.ts +96 -0
- package/src/utilities/appDirectoryTemplate/package.json +10 -0
- package/src/utilities/budibaseDir.ts +3 -0
- package/src/utilities/centralPath.ts +22 -0
- package/src/utilities/fileSystem/app.ts +79 -0
- package/src/utilities/fileSystem/clientLibrary.ts +154 -0
- package/src/utilities/fileSystem/filesystem.ts +168 -0
- package/src/utilities/fileSystem/index.ts +5 -0
- package/src/utilities/fileSystem/plugin.ts +73 -0
- package/src/utilities/fileSystem/processor.ts +19 -0
- package/src/utilities/fileSystem/template.ts +36 -0
- package/src/utilities/global.ts +153 -0
- package/src/utilities/index.ts +134 -0
- package/src/utilities/redis.ts +88 -0
- package/src/utilities/retry.ts +18 -0
- package/src/utilities/routing/index.ts +32 -0
- package/src/utilities/rowProcessor/index.ts +279 -0
- package/src/utilities/rowProcessor/map.ts +96 -0
- package/src/utilities/rowProcessor/tests/utils.spec.ts +57 -0
- package/src/utilities/rowProcessor/utils.ts +96 -0
- package/src/utilities/schema.ts +141 -0
- package/src/utilities/scriptRunner.ts +28 -0
- package/src/utilities/security.ts +65 -0
- package/{utilities/statusCodes.js → src/utilities/statusCodes.ts} +1 -1
- package/src/utilities/tests/test.csv +4 -0
- package/src/utilities/usageQuota/rows.ts +80 -0
- package/src/utilities/usageQuota/usageQuoteReset.ts +18 -0
- package/src/utilities/users.ts +49 -0
- package/src/utilities/workerRequests.ts +188 -0
- package/src/watch.ts +37 -0
- package/src/websockets/client.ts +11 -0
- package/src/websockets/grid.ts +55 -0
- package/src/websockets/index.ts +14 -0
- package/src/websockets/websocket.ts +83 -0
- package/tsconfig.build.json +28 -0
- package/tsconfig.json +22 -0
- package/app.js +0 -20
- package/appPackages/_master/access_levels.json +0 -175
- package/appPackages/_master/appDefinition.json +0 -527
- package/appPackages/_master/main.js +0 -125
- package/appPackages/_master/node_modules/.yarn-integrity +0 -20
- package/appPackages/_master/node_modules/@budibase/materialdesign-components/README.md +0 -33
- package/appPackages/_master/node_modules/@budibase/materialdesign-components/components.json +0 -249
- package/appPackages/_master/node_modules/@budibase/materialdesign-components/dist/index.js +0 -11282
- package/appPackages/_master/node_modules/@budibase/materialdesign-components/dist/index.js.map +0 -1
- package/appPackages/_master/node_modules/@budibase/materialdesign-components/package.json +0 -50
- package/appPackages/_master/node_modules/@budibase/standard-components/README.md +0 -33
- package/appPackages/_master/node_modules/@budibase/standard-components/components.json +0 -239
- package/appPackages/_master/node_modules/@budibase/standard-components/dist/generators.js +0 -198
- package/appPackages/_master/node_modules/@budibase/standard-components/dist/index.js +0 -3460
- package/appPackages/_master/node_modules/@budibase/standard-components/dist/index.js.map +0 -1
- package/appPackages/_master/node_modules/@budibase/standard-components/package.json +0 -38
- package/appPackages/_master/package-lock.json +0 -247
- package/appPackages/_master/package.json +0 -14
- package/appPackages/_master/pages/main/page.json +0 -199
- package/appPackages/_master/pages/main/screens/Apps List.json +0 -131
- package/appPackages/_master/pages/main/screens/Manage App.json +0 -292
- package/appPackages/_master/pages/main/screens/New App.json +0 -410
- package/appPackages/_master/pages/main/screens/New Instance.json +0 -227
- package/appPackages/_master/pages/unauthenticated/page.json +0 -83
- package/appPackages/_master/plugins.js +0 -3
- package/appPackages/_master/public/_shared/budibase-logo.png +0 -0
- package/appPackages/_master/public/main/budibase-client.js +0 -25115
- package/appPackages/_master/public/main/budibase-client.js.map +0 -1
- package/appPackages/_master/public/main/index.html +0 -48
- package/appPackages/_master/public/main/index.js +0 -3397
- package/appPackages/_master/public/main/index.js.map +0 -1
- package/appPackages/_master/public/unauthenticated/budibase-client.js +0 -25115
- package/appPackages/_master/public/unauthenticated/budibase-client.js.map +0 -1
- package/appPackages/_master/public/unauthenticated/index.html +0 -40
- package/appPackages/_master/public/unauthenticated/index.js +0 -3397
- package/appPackages/_master/public/unauthenticated/index.js.map +0 -1
- package/appPackages/_master/yarn.lock +0 -13
- package/builder/__app.html +0 -22
- package/builder/assets/budibase-emblem-white.svg +0 -29
- package/builder/assets/budibase-logo-only.png +0 -0
- package/builder/assets/budibase-logo-white.png +0 -0
- package/builder/assets/budibase-logo.png +0 -0
- package/builder/assets/javascript-logo.svg +0 -1
- package/builder/assets/roboto-v20-latin-ext_latin-300.woff +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-300.woff2 +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-500.woff +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-500.woff2 +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-700.woff +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-700.woff2 +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-900.woff +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-900.woff2 +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-regular.woff +0 -0
- package/builder/assets/roboto-v20-latin-ext_latin-regular.woff2 +0 -0
- package/builder/budibase-client.esm.mjs +0 -24948
- package/builder/budibase.css +0 -120
- package/builder/bundle.css +0 -70
- package/builder/bundle.css.map +0 -146
- package/builder/bundle.js +0 -99294
- package/builder/bundle.js.map +0 -1
- package/builder/codemirror.css +0 -349
- package/builder/favicon.png +0 -0
- package/builder/flatpickr.css +0 -784
- package/builder/fonts.css +0 -47
- package/builder/global.css +0 -111
- package/builder/monokai.css +0 -41
- package/builder/uikit.min.css +0 -1
- package/config.contributors.js +0 -13
- package/config.dev.js +0 -13
- package/config.sample.js +0 -33
- package/index.js +0 -24
- package/initialise/buildAppContext.js +0 -11
- package/initialise/createInstanceDb.js +0 -37
- package/initialise/createMasterDb.js +0 -34
- package/initialise/initialiseBudibase.js +0 -1
- package/initialise/initialiseRuntimePackages.js +0 -42
- package/middleware/routeHandlers/aggregatesPost.js +0 -12
- package/middleware/routeHandlers/appDefault.js +0 -21
- package/middleware/routeHandlers/authenticate.js +0 -15
- package/middleware/routeHandlers/changeMyPassword.js +0 -9
- package/middleware/routeHandlers/createTemporaryAccess.js +0 -17
- package/middleware/routeHandlers/createUser.js +0 -10
- package/middleware/routeHandlers/deleteRecord.js +0 -9
- package/middleware/routeHandlers/disableUser.js +0 -11
- package/middleware/routeHandlers/enableUser.js +0 -6
- package/middleware/routeHandlers/executeAction.js +0 -9
- package/middleware/routeHandlers/getAccessLevels.js +0 -6
- package/middleware/routeHandlers/getRecord.js +0 -15
- package/middleware/routeHandlers/getUsers.js +0 -6
- package/middleware/routeHandlers/helpers.js +0 -15
- package/middleware/routeHandlers/index.js +0 -45
- package/middleware/routeHandlers/listRecordsGet.js +0 -8
- package/middleware/routeHandlers/listRecordsPost.js +0 -12
- package/middleware/routeHandlers/lookupField.js +0 -14
- package/middleware/routeHandlers/postFiles.js +0 -13
- package/middleware/routeHandlers/saveAppHierarchy.js +0 -6
- package/middleware/routeHandlers/saveRecord.js +0 -6
- package/middleware/routeHandlers/setPasswordFromTemporaryCode.js +0 -20
- package/middleware/routeHandlers/upgradeData.js +0 -11
- package/middleware/routers.js +0 -330
- package/middleware/session.js +0 -24
- package/utilities/budibaseApi.js +0 -84
- package/utilities/builder/buildPage.js +0 -164
- package/utilities/builder/componentLibraryInfo.js +0 -77
- package/utilities/builder/convertCssToFiles.js +0 -43
- package/utilities/builder/deleteCodeMeta.js +0 -9
- package/utilities/builder/getPages.js +0 -20
- package/utilities/builder/index.js +0 -165
- package/utilities/builder/index.template.html +0 -44
- package/utilities/builder/listScreens.js +0 -48
- package/utilities/builder/publicPath.js +0 -3
- package/utilities/builder/saveBackend.js +0 -28
- package/utilities/constructHierarchy.js +0 -8
- package/utilities/createAppPackage.js +0 -101
- package/utilities/databaseManager.js +0 -4
- package/utilities/datastore.js +0 -2
- package/utilities/exceptions.js +0 -16
- package/utilities/injectedPlugins/createUser.js +0 -19
- package/utilities/injectedPlugins/disableUser.js +0 -3
- package/utilities/injectedPlugins/enableUser.js +0 -3
- package/utilities/injectedPlugins/index.js +0 -76
- package/utilities/masterAppInternal.js +0 -384
- package/utilities/runtimePackages.js +0 -34
- package/utilities/targzAppPackage.js +0 -119
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import LinkController from "./LinkController"
|
|
2
|
+
import {
|
|
3
|
+
IncludeDocs,
|
|
4
|
+
getLinkDocuments,
|
|
5
|
+
createLinkView,
|
|
6
|
+
getUniqueByProp,
|
|
7
|
+
getRelatedTableForField,
|
|
8
|
+
getLinkedTableIDs,
|
|
9
|
+
getLinkedTable,
|
|
10
|
+
} from "./linkUtils"
|
|
11
|
+
import { flatten } from "lodash"
|
|
12
|
+
import { FieldTypes } from "../../constants"
|
|
13
|
+
import { getMultiIDParams, USER_METDATA_PREFIX } from "../utils"
|
|
14
|
+
import { partition } from "lodash"
|
|
15
|
+
import { getGlobalUsersFromMetadata } from "../../utilities/global"
|
|
16
|
+
import { processFormulas } from "../../utilities/rowProcessor"
|
|
17
|
+
import { context } from "@budibase/backend-core"
|
|
18
|
+
import { Table, Row, LinkDocumentValue } from "@budibase/types"
|
|
19
|
+
|
|
20
|
+
export { IncludeDocs, getLinkDocuments, createLinkView } from "./linkUtils"
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* This functionality makes sure that when rows with links are created, updated or deleted they are processed
|
|
24
|
+
* correctly - making sure that no stale links are left around and that all links have been made successfully.
|
|
25
|
+
*/
|
|
26
|
+
|
|
27
|
+
export const EventType = {
|
|
28
|
+
ROW_SAVE: "row:save",
|
|
29
|
+
ROW_UPDATE: "row:update",
|
|
30
|
+
ROW_DELETE: "row:delete",
|
|
31
|
+
TABLE_SAVE: "table:save",
|
|
32
|
+
TABLE_UPDATED: "table:updated",
|
|
33
|
+
TABLE_DELETE: "table:delete",
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function clearRelationshipFields(table: Table, rows: Row[]) {
|
|
37
|
+
for (let [key, field] of Object.entries(table.schema)) {
|
|
38
|
+
if (field.type === FieldTypes.LINK) {
|
|
39
|
+
rows = rows.map(row => {
|
|
40
|
+
delete row[key]
|
|
41
|
+
return row
|
|
42
|
+
})
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return rows
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async function getLinksForRows(rows: Row[]) {
|
|
49
|
+
const tableIds = [...new Set(rows.map(el => el.tableId))]
|
|
50
|
+
// start by getting all the link values for performance reasons
|
|
51
|
+
const promises = tableIds.map(tableId =>
|
|
52
|
+
getLinkDocuments({
|
|
53
|
+
tableId: tableId,
|
|
54
|
+
includeDocs: IncludeDocs.EXCLUDE,
|
|
55
|
+
})
|
|
56
|
+
)
|
|
57
|
+
const responses = flatten(
|
|
58
|
+
(await Promise.all(promises)) as LinkDocumentValue[][]
|
|
59
|
+
)
|
|
60
|
+
// have to get unique as the previous table query can
|
|
61
|
+
// return duplicates, could be querying for both tables in a relation
|
|
62
|
+
return getUniqueByProp(
|
|
63
|
+
responses
|
|
64
|
+
.filter(el => el != null)
|
|
65
|
+
// create a unique ID which we can use for getting only unique ones
|
|
66
|
+
.map(el => ({ ...el, unique: el.id + el.thisId + el.fieldName })),
|
|
67
|
+
"unique"
|
|
68
|
+
)
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async function getFullLinkedDocs(links: LinkDocumentValue[]) {
|
|
72
|
+
// create DBs
|
|
73
|
+
const db = context.getAppDB()
|
|
74
|
+
const linkedRowIds = links.map(link => link.id)
|
|
75
|
+
const uniqueRowIds = [...new Set(linkedRowIds)]
|
|
76
|
+
let dbRows = (await db.allDocs(getMultiIDParams(uniqueRowIds))).rows.map(
|
|
77
|
+
row => row.doc
|
|
78
|
+
)
|
|
79
|
+
// convert the unique db rows back to a full list of linked rows
|
|
80
|
+
const linked = linkedRowIds
|
|
81
|
+
.map(id => dbRows.find(row => row && row._id === id))
|
|
82
|
+
.filter(row => row != null)
|
|
83
|
+
// need to handle users as specific cases
|
|
84
|
+
let [users, other] = partition(linked, linkRow =>
|
|
85
|
+
linkRow._id.startsWith(USER_METDATA_PREFIX)
|
|
86
|
+
)
|
|
87
|
+
users = await getGlobalUsersFromMetadata(users)
|
|
88
|
+
return [...other, ...users]
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Update link documents for a row or table - this is to be called by the API controller when a change is occurring.
|
|
93
|
+
* @param {string} args.eventType states what type of change which is occurring, means this can be expanded upon in the
|
|
94
|
+
* future quite easily (all updates go through one function).
|
|
95
|
+
* @param {string} args.tableId The ID of the of the table which is being changed.
|
|
96
|
+
* @param {object|undefined} args.row The row which is changing, e.g. created, updated or deleted.
|
|
97
|
+
* @param {object|undefined} args.table If the table has already been retrieved this can be used to reduce database gets.
|
|
98
|
+
* @param {object|undefined} args.oldTable If the table is being updated then the old table can be provided for differencing.
|
|
99
|
+
* @returns {Promise<object>} When the update is complete this will respond successfully. Returns the row for
|
|
100
|
+
* row operations and the table for table operations.
|
|
101
|
+
*/
|
|
102
|
+
export async function updateLinks(args: {
|
|
103
|
+
tableId?: string
|
|
104
|
+
eventType: string
|
|
105
|
+
row?: Row
|
|
106
|
+
table?: Table
|
|
107
|
+
oldTable?: Table
|
|
108
|
+
}) {
|
|
109
|
+
const { eventType, row, tableId, table, oldTable } = args
|
|
110
|
+
const baseReturnObj = row == null ? table : row
|
|
111
|
+
// make sure table ID is set
|
|
112
|
+
if (tableId == null && table != null) {
|
|
113
|
+
args.tableId = table._id!
|
|
114
|
+
}
|
|
115
|
+
let linkController = new LinkController(args)
|
|
116
|
+
try {
|
|
117
|
+
if (
|
|
118
|
+
!(await linkController.doesTableHaveLinkedFields(table)) &&
|
|
119
|
+
(oldTable == null ||
|
|
120
|
+
!(await linkController.doesTableHaveLinkedFields(oldTable)))
|
|
121
|
+
) {
|
|
122
|
+
return baseReturnObj
|
|
123
|
+
}
|
|
124
|
+
} catch (err) {
|
|
125
|
+
return baseReturnObj
|
|
126
|
+
}
|
|
127
|
+
switch (eventType) {
|
|
128
|
+
case EventType.ROW_SAVE:
|
|
129
|
+
case EventType.ROW_UPDATE:
|
|
130
|
+
return await linkController.rowSaved()
|
|
131
|
+
case EventType.ROW_DELETE:
|
|
132
|
+
return await linkController.rowDeleted()
|
|
133
|
+
case EventType.TABLE_SAVE:
|
|
134
|
+
return await linkController.tableSaved()
|
|
135
|
+
case EventType.TABLE_UPDATED:
|
|
136
|
+
return await linkController.tableUpdated()
|
|
137
|
+
case EventType.TABLE_DELETE:
|
|
138
|
+
return await linkController.tableDeleted()
|
|
139
|
+
default:
|
|
140
|
+
throw "Type of event is not known, linked row handler requires update."
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Given a table and a list of rows this will retrieve all of the attached docs and enrich them into the row.
|
|
146
|
+
* This is required for formula fields, this may only be utilised internally (for now).
|
|
147
|
+
* @param {object} table The table from which the rows originated.
|
|
148
|
+
* @param {array<object>} rows The rows which are to be enriched.
|
|
149
|
+
* @return {Promise<*>} returns the rows with all of the enriched relationships on it.
|
|
150
|
+
*/
|
|
151
|
+
export async function attachFullLinkedDocs(table: Table, rows: Row[]) {
|
|
152
|
+
const linkedTableIds = getLinkedTableIDs(table)
|
|
153
|
+
if (linkedTableIds.length === 0) {
|
|
154
|
+
return rows
|
|
155
|
+
}
|
|
156
|
+
// get all the links
|
|
157
|
+
const links = (await getLinksForRows(rows)).filter(link =>
|
|
158
|
+
rows.some(row => row._id === link.thisId)
|
|
159
|
+
)
|
|
160
|
+
// clear any existing links that could be dupe'd
|
|
161
|
+
rows = clearRelationshipFields(table, rows)
|
|
162
|
+
// now get the docs and combine into the rows
|
|
163
|
+
let linked = await getFullLinkedDocs(links)
|
|
164
|
+
const linkedTables: Table[] = []
|
|
165
|
+
for (let row of rows) {
|
|
166
|
+
for (let link of links.filter(link => link.thisId === row._id)) {
|
|
167
|
+
if (row[link.fieldName] == null) {
|
|
168
|
+
row[link.fieldName] = []
|
|
169
|
+
}
|
|
170
|
+
const linkedRow = linked.find(row => row._id === link.id)
|
|
171
|
+
if (linkedRow) {
|
|
172
|
+
const linkedTableId =
|
|
173
|
+
linkedRow.tableId || getRelatedTableForField(table, link.fieldName)
|
|
174
|
+
const linkedTable = await getLinkedTable(linkedTableId, linkedTables)
|
|
175
|
+
if (linkedTable) {
|
|
176
|
+
row[link.fieldName].push(processFormulas(linkedTable, linkedRow))
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return rows
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* This function will take the given enriched rows and squash the links to only contain the primary display field.
|
|
186
|
+
* @param {object} table The table from which the rows originated.
|
|
187
|
+
* @param {array<object>} enriched The pre-enriched rows (full docs) which are to be squashed.
|
|
188
|
+
* @returns {Promise<Array>} The rows after having their links squashed to only contain the ID and primary display.
|
|
189
|
+
*/
|
|
190
|
+
export async function squashLinksToPrimaryDisplay(
|
|
191
|
+
table: Table,
|
|
192
|
+
enriched: Row[]
|
|
193
|
+
) {
|
|
194
|
+
// will populate this as we find them
|
|
195
|
+
const linkedTables = [table]
|
|
196
|
+
for (let row of enriched) {
|
|
197
|
+
// this only fetches the table if its not already in array
|
|
198
|
+
const rowTable = await getLinkedTable(row.tableId!, linkedTables)
|
|
199
|
+
for (let [column, schema] of Object.entries(rowTable?.schema || {})) {
|
|
200
|
+
if (schema.type !== FieldTypes.LINK || !Array.isArray(row[column])) {
|
|
201
|
+
continue
|
|
202
|
+
}
|
|
203
|
+
const newLinks = []
|
|
204
|
+
for (let link of row[column]) {
|
|
205
|
+
const linkTblId = link.tableId || getRelatedTableForField(table, column)
|
|
206
|
+
const linkedTable = await getLinkedTable(linkTblId, linkedTables)
|
|
207
|
+
const obj: any = { _id: link._id }
|
|
208
|
+
if (linkedTable?.primaryDisplay && link[linkedTable.primaryDisplay]) {
|
|
209
|
+
obj.primaryDisplay = link[linkedTable.primaryDisplay]
|
|
210
|
+
}
|
|
211
|
+
newLinks.push(obj)
|
|
212
|
+
}
|
|
213
|
+
row[column] = newLinks
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return enriched
|
|
217
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { ViewName, getQueryIndex } from "../utils"
|
|
2
|
+
import { FieldTypes } from "../../constants"
|
|
3
|
+
import { createLinkView } from "../views/staticViews"
|
|
4
|
+
import { context, logging } from "@budibase/backend-core"
|
|
5
|
+
import {
|
|
6
|
+
FieldSchema,
|
|
7
|
+
LinkDocument,
|
|
8
|
+
LinkDocumentValue,
|
|
9
|
+
Table,
|
|
10
|
+
} from "@budibase/types"
|
|
11
|
+
export { createLinkView } from "../views/staticViews"
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Only needed so that boolean parameters are being used for includeDocs
|
|
15
|
+
* @type {{EXCLUDE: boolean, INCLUDE: boolean}}
|
|
16
|
+
*/
|
|
17
|
+
export const IncludeDocs = {
|
|
18
|
+
INCLUDE: true,
|
|
19
|
+
EXCLUDE: false,
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Gets the linking documents, not the linked documents themselves.
|
|
24
|
+
* @param {string} args.tableId The table which we are searching for linked rows against.
|
|
25
|
+
* @param {string|null} args.fieldName The name of column/field which is being altered, only looking for
|
|
26
|
+
* linking documents that are related to it. If this is not specified then the table level will be assumed.
|
|
27
|
+
* @param {string|null} args.rowId The ID of the row which we want to find linking documents for -
|
|
28
|
+
* if this is not specified then it will assume table or field level depending on whether the
|
|
29
|
+
* field name has been specified.
|
|
30
|
+
* @param {boolean|null} args.includeDocs whether to include docs in the response call, this is considerably slower so only
|
|
31
|
+
* use this if actually interested in the docs themselves.
|
|
32
|
+
* @returns {Promise<object[]>} This will return an array of the linking documents that were found
|
|
33
|
+
* (if any).
|
|
34
|
+
*/
|
|
35
|
+
export async function getLinkDocuments(args: {
|
|
36
|
+
tableId?: string
|
|
37
|
+
rowId?: string
|
|
38
|
+
includeDocs?: any
|
|
39
|
+
}): Promise<LinkDocumentValue[] | LinkDocument[]> {
|
|
40
|
+
const { tableId, rowId, includeDocs } = args
|
|
41
|
+
const db = context.getAppDB()
|
|
42
|
+
let params: any
|
|
43
|
+
if (rowId != null) {
|
|
44
|
+
params = { key: [tableId, rowId] }
|
|
45
|
+
}
|
|
46
|
+
// only table is known
|
|
47
|
+
else {
|
|
48
|
+
params = { startKey: [tableId], endKey: [tableId, {}] }
|
|
49
|
+
}
|
|
50
|
+
params.include_docs = !!includeDocs
|
|
51
|
+
try {
|
|
52
|
+
let linkRows = (await db.query(getQueryIndex(ViewName.LINK), params)).rows
|
|
53
|
+
// filter to get unique entries
|
|
54
|
+
const foundIds: string[] = []
|
|
55
|
+
linkRows = linkRows.filter(link => {
|
|
56
|
+
// make sure anything unique is the correct key
|
|
57
|
+
if (
|
|
58
|
+
(tableId && link.key[0] !== tableId) ||
|
|
59
|
+
(rowId && link.key[1] !== rowId)
|
|
60
|
+
) {
|
|
61
|
+
return false
|
|
62
|
+
}
|
|
63
|
+
const unique = foundIds.indexOf(link.id) === -1
|
|
64
|
+
if (unique) {
|
|
65
|
+
foundIds.push(link.id)
|
|
66
|
+
}
|
|
67
|
+
return unique
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
if (includeDocs) {
|
|
71
|
+
return linkRows.map(row => row.doc) as LinkDocument[]
|
|
72
|
+
} else {
|
|
73
|
+
return linkRows.map(row => row.value) as LinkDocumentValue[]
|
|
74
|
+
}
|
|
75
|
+
} catch (err: any) {
|
|
76
|
+
// check if the view doesn't exist, it should for all new instances
|
|
77
|
+
if (err != null && err.name === "not_found") {
|
|
78
|
+
await createLinkView()
|
|
79
|
+
return getLinkDocuments(arguments[0])
|
|
80
|
+
} else {
|
|
81
|
+
/* istanbul ignore next */
|
|
82
|
+
logging.logAlert("Failed to get link documents", err)
|
|
83
|
+
throw err
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export function getUniqueByProp(array: any[], prop: string) {
|
|
89
|
+
return array.filter((obj, pos, arr) => {
|
|
90
|
+
return arr.map(mapObj => mapObj[prop]).indexOf(obj[prop]) === pos
|
|
91
|
+
})
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function getLinkedTableIDs(table: Table) {
|
|
95
|
+
return Object.values(table.schema)
|
|
96
|
+
.filter((column: FieldSchema) => column.type === FieldTypes.LINK)
|
|
97
|
+
.map(column => column.tableId)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export async function getLinkedTable(id: string, tables: Table[]) {
|
|
101
|
+
const db = context.getAppDB()
|
|
102
|
+
let linkedTable = tables.find(table => table._id === id)
|
|
103
|
+
if (linkedTable) {
|
|
104
|
+
return linkedTable
|
|
105
|
+
}
|
|
106
|
+
linkedTable = await db.get(id)
|
|
107
|
+
if (linkedTable) {
|
|
108
|
+
tables.push(linkedTable)
|
|
109
|
+
}
|
|
110
|
+
return linkedTable
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export function getRelatedTableForField(table: Table, fieldName: string) {
|
|
114
|
+
// look to see if its on the table, straight in the schema
|
|
115
|
+
const field = table.schema[fieldName]
|
|
116
|
+
if (field != null) {
|
|
117
|
+
return field.tableId
|
|
118
|
+
}
|
|
119
|
+
for (let column of Object.values(table.schema)) {
|
|
120
|
+
if (column.type === FieldTypes.LINK && column.fieldName === fieldName) {
|
|
121
|
+
return column.tableId
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
return null
|
|
125
|
+
}
|
package/src/db/newid.ts
ADDED
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
const TestConfig = require("../../tests/utilities/TestConfiguration")
|
|
2
|
+
const { basicRow, basicLinkedRow, basicTable } = require("../../tests/utilities/structures")
|
|
3
|
+
const LinkController = require("../linkedRows/LinkController").default
|
|
4
|
+
const { context } = require("@budibase/backend-core")
|
|
5
|
+
const { RelationshipTypes } = require("../../constants")
|
|
6
|
+
const { cloneDeep } = require("lodash/fp")
|
|
7
|
+
|
|
8
|
+
describe("test the link controller", () => {
|
|
9
|
+
let config = new TestConfig(false)
|
|
10
|
+
let table1, table2, appId
|
|
11
|
+
|
|
12
|
+
beforeAll(async () => {
|
|
13
|
+
const app = await config.init()
|
|
14
|
+
appId = app.appId
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
beforeEach(async () => {
|
|
18
|
+
const { _id } = await config.createTable()
|
|
19
|
+
table2 = await config.createLinkedTable(RelationshipTypes.MANY_TO_MANY, ["link", "link2"])
|
|
20
|
+
// update table after creating link
|
|
21
|
+
table1 = await config.getTable(_id)
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
afterAll(config.end)
|
|
25
|
+
|
|
26
|
+
async function createLinkController(table, row = null, oldTable = null) {
|
|
27
|
+
return context.doInAppContext(appId, () => {
|
|
28
|
+
const linkConfig = {
|
|
29
|
+
tableId: table._id,
|
|
30
|
+
table,
|
|
31
|
+
}
|
|
32
|
+
if (row) {
|
|
33
|
+
linkConfig.row = row
|
|
34
|
+
}
|
|
35
|
+
if (oldTable) {
|
|
36
|
+
linkConfig.oldTable = oldTable
|
|
37
|
+
}
|
|
38
|
+
return new LinkController(linkConfig)
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
async function createLinkedRow(linkField = "link", t1 = table1, t2 = table2) {
|
|
43
|
+
const row = await config.createRow(basicRow(t2._id))
|
|
44
|
+
const { _id } = await config.createRow(basicLinkedRow(t1._id, row._id, linkField))
|
|
45
|
+
return config.getRow(t1._id, _id)
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
it("should be able to confirm if two table schemas are equal", async () => {
|
|
49
|
+
const controller = await createLinkController(table1)
|
|
50
|
+
let equal = controller.areLinkSchemasEqual(table2.schema.link, table2.schema.link)
|
|
51
|
+
expect(equal).toEqual(true)
|
|
52
|
+
equal = controller.areLinkSchemasEqual(table1.schema.link, table2.schema.link)
|
|
53
|
+
expect(equal).toEqual(false)
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
it("should be able to check the relationship types across two fields", async () => {
|
|
57
|
+
const controller = await createLinkController(table1)
|
|
58
|
+
// empty case
|
|
59
|
+
let output = controller.handleRelationshipType({}, {})
|
|
60
|
+
expect(output.linkedField.relationshipType).toEqual(RelationshipTypes.MANY_TO_MANY)
|
|
61
|
+
expect(output.linkerField.relationshipType).toEqual(RelationshipTypes.MANY_TO_MANY)
|
|
62
|
+
output = controller.handleRelationshipType({ relationshipType: RelationshipTypes.MANY_TO_MANY }, {})
|
|
63
|
+
expect(output.linkedField.relationshipType).toEqual(RelationshipTypes.MANY_TO_MANY)
|
|
64
|
+
expect(output.linkerField.relationshipType).toEqual(RelationshipTypes.MANY_TO_MANY)
|
|
65
|
+
output = controller.handleRelationshipType({ relationshipType: RelationshipTypes.MANY_TO_ONE }, {})
|
|
66
|
+
expect(output.linkedField.relationshipType).toEqual(RelationshipTypes.ONE_TO_MANY)
|
|
67
|
+
expect(output.linkerField.relationshipType).toEqual(RelationshipTypes.MANY_TO_ONE)
|
|
68
|
+
output = controller.handleRelationshipType({ relationshipType: RelationshipTypes.ONE_TO_MANY }, {})
|
|
69
|
+
expect(output.linkedField.relationshipType).toEqual(RelationshipTypes.MANY_TO_ONE)
|
|
70
|
+
expect(output.linkerField.relationshipType).toEqual(RelationshipTypes.ONE_TO_MANY)
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
it("should be able to delete a row", async () => {
|
|
74
|
+
const row = await createLinkedRow()
|
|
75
|
+
const controller = await createLinkController(table1, row)
|
|
76
|
+
await context.doInAppContext(appId, async () => {
|
|
77
|
+
// get initial count
|
|
78
|
+
const beforeLinks = await controller.getRowLinkDocs(row._id)
|
|
79
|
+
await controller.rowDeleted()
|
|
80
|
+
let afterLinks = await controller.getRowLinkDocs(row._id)
|
|
81
|
+
expect(beforeLinks.length).toEqual(1)
|
|
82
|
+
expect(afterLinks.length).toEqual(0)
|
|
83
|
+
})
|
|
84
|
+
})
|
|
85
|
+
|
|
86
|
+
it("shouldn't throw an error when deleting a row with no links", async () => {
|
|
87
|
+
const row = await config.createRow(basicRow(table1._id))
|
|
88
|
+
const controller = await createLinkController(table1, row)
|
|
89
|
+
await context.doInAppContext(appId, async () => {
|
|
90
|
+
let error
|
|
91
|
+
try {
|
|
92
|
+
await controller.rowDeleted()
|
|
93
|
+
} catch (err) {
|
|
94
|
+
error = err
|
|
95
|
+
}
|
|
96
|
+
expect(error).toBeUndefined()
|
|
97
|
+
})
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
it("should throw an error when validating a table which is invalid", async () => {
|
|
101
|
+
const controller = await createLinkController(table1)
|
|
102
|
+
const copyTable = {
|
|
103
|
+
...table1
|
|
104
|
+
}
|
|
105
|
+
copyTable.schema.otherTableLink = {
|
|
106
|
+
type: "link",
|
|
107
|
+
fieldName: "link",
|
|
108
|
+
tableId: table2._id,
|
|
109
|
+
}
|
|
110
|
+
let error
|
|
111
|
+
try {
|
|
112
|
+
controller.validateTable(copyTable)
|
|
113
|
+
} catch (err) {
|
|
114
|
+
error = err
|
|
115
|
+
}
|
|
116
|
+
expect(error).toBeDefined()
|
|
117
|
+
expect(error.message).toEqual("Cannot re-use the linked column name for a linked table.")
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
it("should be able to remove a link when saving/updating the row", async () => {
|
|
121
|
+
const row = await createLinkedRow()
|
|
122
|
+
// remove the link from the row
|
|
123
|
+
row.link = []
|
|
124
|
+
const controller = await createLinkController(table1, row)
|
|
125
|
+
await context.doInAppContext(appId, async () => {
|
|
126
|
+
await controller.rowSaved()
|
|
127
|
+
let links = await controller.getRowLinkDocs(row._id)
|
|
128
|
+
expect(links.length).toEqual(0)
|
|
129
|
+
})
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
it("should be able to delete a table and have links deleted", async () => {
|
|
133
|
+
await createLinkedRow()
|
|
134
|
+
const controller = await createLinkController(table1)
|
|
135
|
+
await context.doInAppContext(appId, async () => {
|
|
136
|
+
let before = await controller.getTableLinkDocs()
|
|
137
|
+
await controller.tableDeleted()
|
|
138
|
+
let after = await controller.getTableLinkDocs()
|
|
139
|
+
expect(before.length).toEqual(1)
|
|
140
|
+
expect(after.length).toEqual(0)
|
|
141
|
+
})
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
it("should be able to remove a linked field from a table", async () => {
|
|
145
|
+
await createLinkedRow()
|
|
146
|
+
await createLinkedRow("link2")
|
|
147
|
+
const controller = await createLinkController(table1, null, table1)
|
|
148
|
+
await context.doInAppContext(appId, async () => {
|
|
149
|
+
let before = await controller.getTableLinkDocs()
|
|
150
|
+
await controller.removeFieldFromTable("link")
|
|
151
|
+
let after = await controller.getTableLinkDocs()
|
|
152
|
+
expect(before.length).toEqual(2)
|
|
153
|
+
// shouldn't delete the other field
|
|
154
|
+
expect(after.length).toEqual(1)
|
|
155
|
+
})
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
it("should throw an error when overwriting a link column", async () => {
|
|
159
|
+
const update = cloneDeep(table1)
|
|
160
|
+
update.schema.link.relationshipType = RelationshipTypes.MANY_TO_ONE
|
|
161
|
+
let error
|
|
162
|
+
try {
|
|
163
|
+
const controller = await createLinkController(update)
|
|
164
|
+
await controller.tableSaved()
|
|
165
|
+
} catch (err) {
|
|
166
|
+
error = err
|
|
167
|
+
}
|
|
168
|
+
expect(error).toBeDefined()
|
|
169
|
+
})
|
|
170
|
+
|
|
171
|
+
it("should be able to remove a field view table update", async () => {
|
|
172
|
+
await createLinkedRow()
|
|
173
|
+
await createLinkedRow()
|
|
174
|
+
const newTable = cloneDeep(table1)
|
|
175
|
+
delete newTable.schema.link
|
|
176
|
+
const controller = await createLinkController(newTable, null, table1)
|
|
177
|
+
await context.doInAppContext(appId, async () => {
|
|
178
|
+
await controller.tableUpdated()
|
|
179
|
+
const links = await controller.getTableLinkDocs()
|
|
180
|
+
expect(links.length).toEqual(0)
|
|
181
|
+
})
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
it("shouldn't allow one to many having many relationships against it", async () => {
|
|
185
|
+
const firstTable = await config.createTable()
|
|
186
|
+
const { _id } = await config.createLinkedTable(RelationshipTypes.MANY_TO_ONE, ["link"])
|
|
187
|
+
const linkTable = await config.getTable(_id)
|
|
188
|
+
// an initial row to link around
|
|
189
|
+
const row = await createLinkedRow("link", linkTable, firstTable)
|
|
190
|
+
let error
|
|
191
|
+
try {
|
|
192
|
+
// create another row to initiate the error
|
|
193
|
+
await config.createRow(basicLinkedRow(row.tableId, row.link[0]))
|
|
194
|
+
} catch (err) {
|
|
195
|
+
error = err
|
|
196
|
+
}
|
|
197
|
+
expect(error).toBeDefined()
|
|
198
|
+
})
|
|
199
|
+
|
|
200
|
+
it("should not error if a link being created doesn't exist", async () => {
|
|
201
|
+
let error
|
|
202
|
+
try {
|
|
203
|
+
await config.createRow(basicLinkedRow(table1._id, "invalid"))
|
|
204
|
+
} catch (err) {
|
|
205
|
+
error = err
|
|
206
|
+
}
|
|
207
|
+
expect(error).toBeUndefined()
|
|
208
|
+
})
|
|
209
|
+
|
|
210
|
+
it("make sure auto column goes onto other row too", async () => {
|
|
211
|
+
const table = await config.createTable()
|
|
212
|
+
const tableCfg = basicTable()
|
|
213
|
+
tableCfg.schema.link = {
|
|
214
|
+
type: "link",
|
|
215
|
+
fieldName: "link",
|
|
216
|
+
tableId: table._id,
|
|
217
|
+
name: "link",
|
|
218
|
+
autocolumn: true,
|
|
219
|
+
}
|
|
220
|
+
await config.createTable(tableCfg)
|
|
221
|
+
const afterTable = await config.getTable(table._id)
|
|
222
|
+
expect(afterTable.schema.link.autocolumn).toBe(true)
|
|
223
|
+
})
|
|
224
|
+
|
|
225
|
+
it("should be able to link to self", async () => {
|
|
226
|
+
const table = await config.createTable()
|
|
227
|
+
table.schema.link = {
|
|
228
|
+
type: "link",
|
|
229
|
+
fieldName: "link",
|
|
230
|
+
tableId: table._id,
|
|
231
|
+
name: "link",
|
|
232
|
+
autocolumn: true,
|
|
233
|
+
}
|
|
234
|
+
await config.updateTable(table)
|
|
235
|
+
})
|
|
236
|
+
})
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
const TestConfig = require("../../tests/utilities/TestConfiguration")
|
|
2
|
+
const { basicTable } = require("../../tests/utilities/structures")
|
|
3
|
+
const linkUtils = require("../linkedRows/linkUtils")
|
|
4
|
+
const { context } = require("@budibase/backend-core")
|
|
5
|
+
|
|
6
|
+
describe("test link functionality", () => {
|
|
7
|
+
const config = new TestConfig(false)
|
|
8
|
+
let appId
|
|
9
|
+
|
|
10
|
+
describe("getLinkedTable", () => {
|
|
11
|
+
let table
|
|
12
|
+
beforeAll(async () => {
|
|
13
|
+
const app = await config.init()
|
|
14
|
+
appId = app.appId
|
|
15
|
+
table = await config.createTable()
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it("should be able to retrieve a linked table from a list", async () => {
|
|
19
|
+
await context.doInAppContext(appId, async () => {
|
|
20
|
+
const retrieved = await linkUtils.getLinkedTable(table._id, [table])
|
|
21
|
+
expect(retrieved._id).toBe(table._id)
|
|
22
|
+
})
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
it("should be able to retrieve a table from DB and update list", async () => {
|
|
26
|
+
const tables = []
|
|
27
|
+
await context.doInAppContext(appId, async () => {
|
|
28
|
+
const retrieved = await linkUtils.getLinkedTable(table._id, tables)
|
|
29
|
+
expect(retrieved._id).toBe(table._id)
|
|
30
|
+
expect(tables[0]).toBeDefined()
|
|
31
|
+
})
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
describe("getRelatedTableForField", () => {
|
|
36
|
+
let link = basicTable()
|
|
37
|
+
link.schema.link = {
|
|
38
|
+
fieldName: "otherLink",
|
|
39
|
+
tableId: "tableID",
|
|
40
|
+
type: "link",
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
it("should get the field from the table directly", () => {
|
|
44
|
+
expect(linkUtils.getRelatedTableForField(link, "link")).toBe("tableID")
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it("should get the field from the link", () => {
|
|
48
|
+
expect(linkUtils.getRelatedTableForField(link, "otherLink")).toBe("tableID")
|
|
49
|
+
})
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
describe("getLinkDocuments", () => {
|
|
53
|
+
it("should create the link view when it doesn't exist", async () => {
|
|
54
|
+
// create the DB and a very basic app design DB
|
|
55
|
+
await context.doInAppContext(appId, async () => {
|
|
56
|
+
const output = await linkUtils.getLinkDocuments({
|
|
57
|
+
tableId: "test",
|
|
58
|
+
rowId: "test",
|
|
59
|
+
includeDocs: false,
|
|
60
|
+
})
|
|
61
|
+
expect(Array.isArray(output)).toBe(true)
|
|
62
|
+
})
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
})
|