From 68f68c1e2678b028d1ce78975751f5d06bd79e90 Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Wed, 3 Feb 2021 16:09:48 +0000 Subject: [PATCH 1/6] Attempting to fix the issue with 4001, this updates the cypress tests so that it is easier to change the port on which it runs as well as updating the electron usage of the app to use port 0 (an ephermeral port). --- packages/builder/cypress.json | 7 +++- .../cypress/integration/createApp.spec.js | 4 +- .../integration/createAutomation.spec.js | 2 +- .../cypress/integration/createBinding.spec.js | 2 +- .../integration/createComponents.spec.js | 2 +- .../cypress/integration/createTable.spec.js | 2 +- .../cypress/integration/createUser.spec.js | 2 +- .../cypress/integration/createView.spec.js | 2 +- .../cypress/integration/screens.spec.js | 2 +- packages/builder/cypress/setup.js | 2 + packages/builder/package.json | 4 +- .../automation/Shared/WebhookDisplay.svelte | 3 +- packages/server/.env.template | 5 +-- packages/server/package.json | 2 +- packages/server/src/app.js | 4 +- packages/server/src/electron.js | 42 +++++++++++-------- packages/server/src/events/index.js | 4 ++ 17 files changed, 53 insertions(+), 38 deletions(-) diff --git a/packages/builder/cypress.json b/packages/builder/cypress.json index a68cea053..d76078f50 100644 --- a/packages/builder/cypress.json +++ b/packages/builder/cypress.json @@ -1,5 +1,8 @@ { - "baseUrl": "http://localhost:4001/_builder/", + "baseUrl": "http://localhost:4005/_builder/", "video": true, - "projectId": "bmbemn" + "projectId": "bmbemn", + "env": { + "PORT": "4005" + } } diff --git a/packages/builder/cypress/integration/createApp.spec.js b/packages/builder/cypress/integration/createApp.spec.js index 5382aa04c..a32782867 100644 --- a/packages/builder/cypress/integration/createApp.spec.js +++ b/packages/builder/cypress/integration/createApp.spec.js @@ -2,7 +2,7 @@ context('Create an Application', () => { beforeEach(() => { cy.server() - cy.visit('localhost:4001/_builder') + cy.visit(`localhost:${Cypress.env("PORT")}/_builder`) }) // https://on.cypress.io/interacting-with-elements @@ -11,7 +11,7 @@ context('Create an Application', () => { // https://on.cypress.io/type cy.createApp('My Cool App', 'This is a description') - cy.visit('localhost:4001/_builder') + cy.visit(`localhost:${Cypress.env("PORT")}/_builder`) cy.contains('My Cool App').should('exist') }) diff --git a/packages/builder/cypress/integration/createAutomation.spec.js b/packages/builder/cypress/integration/createAutomation.spec.js index 92d1f907b..2ba99fa34 100644 --- a/packages/builder/cypress/integration/createAutomation.spec.js +++ b/packages/builder/cypress/integration/createAutomation.spec.js @@ -1,7 +1,7 @@ context("Create a automation", () => { before(() => { cy.server() - cy.visit("localhost:4001/_builder") + cy.visit(`localhost:${Cypress.env("PORT")}/_builder`) cy.createApp( "Automation Test App", diff --git a/packages/builder/cypress/integration/createBinding.spec.js b/packages/builder/cypress/integration/createBinding.spec.js index 971df3ed7..4074aca11 100644 --- a/packages/builder/cypress/integration/createBinding.spec.js +++ b/packages/builder/cypress/integration/createBinding.spec.js @@ -1,6 +1,6 @@ xcontext('Create a Binding', () => { before(() => { - cy.visit('localhost:4001/_builder') + cy.visit(`localhost:${Cypress.env("PORT")}/_builder`) cy.createApp('Binding App', 'Binding App Description') cy.navigateToFrontend() }) diff --git a/packages/builder/cypress/integration/createComponents.spec.js b/packages/builder/cypress/integration/createComponents.spec.js index 6931fdb86..b87e863e5 100644 --- a/packages/builder/cypress/integration/createComponents.spec.js +++ b/packages/builder/cypress/integration/createComponents.spec.js @@ -1,7 +1,7 @@ xcontext("Create Components", () => { before(() => { cy.server() - cy.visit("localhost:4001/_builder") + cy.visit(`localhost:${Cypress.env("PORT")}/_builder`) // https://on.cypress.io/type cy.createApp("Table App", "Table App Description") cy.createTable("dog", "name", "age") diff --git a/packages/builder/cypress/integration/createTable.spec.js b/packages/builder/cypress/integration/createTable.spec.js index 27560aaeb..d87cd0fd4 100644 --- a/packages/builder/cypress/integration/createTable.spec.js +++ b/packages/builder/cypress/integration/createTable.spec.js @@ -1,6 +1,6 @@ context("Create a Table", () => { before(() => { - cy.visit("localhost:4001/_builder") + cy.visit(`localhost:${Cypress.env("PORT")}/_builder`) cy.createApp("Table App", "Table App Description") }) diff --git a/packages/builder/cypress/integration/createUser.spec.js b/packages/builder/cypress/integration/createUser.spec.js index a5f9934dd..45a1ffcc6 100644 --- a/packages/builder/cypress/integration/createUser.spec.js +++ b/packages/builder/cypress/integration/createUser.spec.js @@ -2,7 +2,7 @@ context('Create a User', () => { before(() => { cy.server() - cy.visit('localhost:4001/_builder') + cy.visit(`localhost:${Cypress.env("PORT")}/_builder`) // https://on.cypress.io/type cy.createApp('User App', 'This app is used to test user creation') }) diff --git a/packages/builder/cypress/integration/createView.spec.js b/packages/builder/cypress/integration/createView.spec.js index 60bd8c15d..23927b55f 100644 --- a/packages/builder/cypress/integration/createView.spec.js +++ b/packages/builder/cypress/integration/createView.spec.js @@ -1,6 +1,6 @@ context("Create a View", () => { before(() => { - cy.visit("localhost:4001/_builder") + cy.visit(`localhost:${Cypress.env("PORT")}/_builder`) cy.createApp("View App", "View App Description") cy.createTable("data") cy.addColumn("data", "group", "Text") diff --git a/packages/builder/cypress/integration/screens.spec.js b/packages/builder/cypress/integration/screens.spec.js index 6df8af360..d219e7daa 100644 --- a/packages/builder/cypress/integration/screens.spec.js +++ b/packages/builder/cypress/integration/screens.spec.js @@ -2,7 +2,7 @@ context('Screen Tests', () => { before(() => { cy.server() - cy.visit('localhost:4001/_builder') + cy.visit(`localhost:${Cypress.env("PORT")}/_builder`) cy.createApp('Conor Cy App', 'Table App Description') cy.navigateToFrontend() }) diff --git a/packages/builder/cypress/setup.js b/packages/builder/cypress/setup.js index 7f20eff88..1b94100fb 100644 --- a/packages/builder/cypress/setup.js +++ b/packages/builder/cypress/setup.js @@ -7,6 +7,7 @@ const rimraf = require("rimraf") const { join, resolve } = require("path") // const run = require("../../cli/src/commands/run/runHandler") const initialiseBudibase = require("../../server/src/utilities/initialiseBudibase") +const cypressConfig = require("../cypress.json") const homedir = join(require("os").homedir(), ".budibase") @@ -15,6 +16,7 @@ rimraf.sync(homedir) process.env.BUDIBASE_API_KEY = "6BE826CB-6B30-4AEC-8777-2E90464633DE" process.env.NODE_ENV = "cypress" process.env.ENABLE_ANALYTICS = "false" +process.env.PORT = cypressConfig.env.PORT // Stop info logs polluting test outputs process.env.LOG_LEVEL = "error" diff --git a/packages/builder/package.json b/packages/builder/package.json index a43a251c9..f3e99a2ca 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -14,8 +14,8 @@ "cy:run": "cypress run", "cy:open": "cypress open", "cy:run:ci": "cypress run --browser electron --record --key f308590b-6070-41af-b970-794a3823d451", - "cy:test": "start-server-and-test cy:setup http://localhost:4001/_builder cy:run", - "cy:ci": "start-server-and-test cy:setup http://localhost:4001/_builder cy:run:ci" + "cy:test": "start-server-and-test cy:setup http://localhost:4005/_builder cy:run", + "cy:ci": "start-server-and-test cy:setup http://localhost:4005/_builder cy:run:ci" }, "jest": { "globals": { diff --git a/packages/builder/src/components/automation/Shared/WebhookDisplay.svelte b/packages/builder/src/components/automation/Shared/WebhookDisplay.svelte index 2edcbec3f..18fff8153 100644 --- a/packages/builder/src/components/automation/Shared/WebhookDisplay.svelte +++ b/packages/builder/src/components/automation/Shared/WebhookDisplay.svelte @@ -13,7 +13,8 @@ if (production) { return `${appUrl}/${uri}` } else { - return `http://localhost:4001/${uri}` + + return `${window.location.origin}/${uri}` } } diff --git a/packages/server/.env.template b/packages/server/.env.template index 1b1ff2e85..b2ff5be3f 100644 --- a/packages/server/.env.template +++ b/packages/server/.env.template @@ -8,13 +8,10 @@ CLIENT_ID={{clientId}} # used to create cookie hashes JWT_SECRET={{cookieKey1}} -# port to run http server on -PORT=4001 - # error level for koa-pino LOG_LEVEL=info DEPLOYMENT_CREDENTIALS_URL="https://dt4mpwwap8.execute-api.eu-west-1.amazonaws.com/prod/" DEPLOYMENT_DB_URL="https://couchdb.budi.live:5984" SENTRY_DSN=https://a34ae347621946bf8acded18e5b7d4b8@o420233.ingest.sentry.io/5338131 -ENABLE_ANALYTICS="true" \ No newline at end of file +ENABLE_ANALYTICS="true" diff --git a/packages/server/package.json b/packages/server/package.json index 16f2441cd..3ba670767 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -36,7 +36,7 @@ "test:integration": "jest routes --runInBand", "test:watch": "jest --watch", "run:docker": "node src/index", - "dev:builder": "nodemon src/index.js", + "dev:builder": "PORT=4001 nodemon src/index.js", "electron": "electron src/electron.js", "build:electron": "electron-builder --dir", "publish:electron": "electron-builder -mwl --publish always", diff --git a/packages/server/src/app.js b/packages/server/src/app.js index a5ef3132a..6bd1816ac 100644 --- a/packages/server/src/app.js +++ b/packages/server/src/app.js @@ -50,8 +50,10 @@ destroyable(server) server.on("close", () => console.log("Server Closed")) -module.exports = server.listen(env.PORT || 4001, async () => { +module.exports = server.listen(env.PORT || 0, async () => { console.log(`Budibase running on ${JSON.stringify(server.address())}`) + env._set("PORT", server.address().port) + eventEmitter.emitPort(env.PORT) automations.init() if (env.SELF_HOSTED) { await selfhost.init() diff --git a/packages/server/src/electron.js b/packages/server/src/electron.js index a6fa3f5e9..290c13e6a 100644 --- a/packages/server/src/electron.js +++ b/packages/server/src/electron.js @@ -7,6 +7,7 @@ const { existsSync } = require("fs-extra") const initialiseBudibase = require("./utilities/initialiseBudibase") const { budibaseAppsDir } = require("./utilities/budibaseDir") const { openNewGitHubIssue, debugInfo } = require("electron-util") +const eventEmitter = require("./events") const budibaseDir = budibaseAppsDir() const envFile = join(budibaseDir, ".env") @@ -17,7 +18,11 @@ async function startApp() { } // evict environment from cache, so it reloads when next asked delete require.cache[require.resolve("./environment")] + // store the port incase its going to get overridden + const port = process.env.PORT require("dotenv").config({ path: envFile }) + // overwrite the port - don't want to use dotenv for the port + require("./environment")._set("PORT", port) unhandled({ showDialog: true, @@ -34,9 +39,6 @@ async function startApp() { }, }) - const APP_URL = "http://localhost:4001/_builder" - const APP_TITLE = "Budibase Builder" - let win function handleRedirect(e, url) { @@ -46,22 +48,26 @@ async function startApp() { async function createWindow() { app.server = require("./app") - win = new BrowserWindow({ - width: 1920, - height: 1080, - icon: join(__dirname, "..", "build", "icons", "512x512.png"), - }) - win.setTitle(APP_TITLE) - win.loadURL(APP_URL) - if (isDev) { - win.webContents.openDevTools() - } else { - autoUpdater.checkForUpdatesAndNotify() - } + eventEmitter.on("internal:port", port => { + const APP_URL = `http://localhost:${port}/_builder` + const APP_TITLE = "Budibase Builder" + win = new BrowserWindow({ + width: 1920, + height: 1080, + icon: join(__dirname, "..", "build", "icons", "512x512.png"), + }) + win.setTitle(APP_TITLE) + win.loadURL(APP_URL) + if (isDev) { + win.webContents.openDevTools() + } else { + autoUpdater.checkForUpdatesAndNotify() + } - // open _blank in default browser - win.webContents.on("new-window", handleRedirect) - win.webContents.on("will-navigate", handleRedirect) + // open _blank in default browser + win.webContents.on("new-window", handleRedirect) + win.webContents.on("will-navigate", handleRedirect) + }) } app.whenReady().then(createWindow) diff --git a/packages/server/src/events/index.js b/packages/server/src/events/index.js index 990ec1e16..fe51b0780 100644 --- a/packages/server/src/events/index.js +++ b/packages/server/src/events/index.js @@ -19,6 +19,10 @@ class BudibaseEmitter extends EventEmitter { emitTable(eventName, appId, table = null) { tableEmission({ emitter: this, eventName, appId, table }) } + + emitPort(portNumber) { + this.emit("internal:port", portNumber) + } } const emitter = new BudibaseEmitter() From dbd172428e79b83131b9bc264becf7284710f29f Mon Sep 17 00:00:00 2001 From: mike12345567 Date: Tue, 23 Feb 2021 16:29:50 +0000 Subject: [PATCH 2/6] Adding a few fixes for bugs related to user table, user table views and some async functions that weren't awaiting promises. --- packages/builder/src/builderStore/store/frontend.js | 12 ++++++------ .../src/components/backend/DataTable/Table.svelte | 5 +++-- .../backend/DataTable/ViewDataTable.svelte | 1 + .../backend/DataTable/popovers/FilterPopover.svelte | 6 ++++++ .../design/AppPreview/ComponentSelectionList.svelte | 4 ++-- .../NavigationPanel/ComponentDropdownMenu.svelte | 4 ++-- packages/builder/src/constants/index.js | 2 +- 7 files changed, 21 insertions(+), 13 deletions(-) diff --git a/packages/builder/src/builderStore/store/frontend.js b/packages/builder/src/builderStore/store/frontend.js index 27427c6ef..d0d1f6979 100644 --- a/packages/builder/src/builderStore/store/frontend.js +++ b/packages/builder/src/builderStore/store/frontend.js @@ -289,7 +289,7 @@ export const getFrontendStore = () => { ...extras, } }, - create: (componentName, presetProps) => { + create: async (componentName, presetProps) => { const selected = get(selectedComponent) const asset = get(currentAsset) const state = get(store) @@ -345,7 +345,7 @@ export const getFrontendStore = () => { parentComponent._children.push(componentInstance) // Save components and update UI - store.actions.preview.saveSelected() + await store.actions.preview.saveSelected() store.update(state => { state.currentView = "component" state.selectedComponentId = componentInstance._id @@ -359,7 +359,7 @@ export const getFrontendStore = () => { return componentInstance }, - delete: component => { + delete: async component => { if (!component) { return } @@ -374,7 +374,7 @@ export const getFrontendStore = () => { ) store.actions.components.select(parent) } - store.actions.preview.saveSelected() + await store.actions.preview.saveSelected() }, copy: (component, cut = false) => { const selectedAsset = get(currentAsset) @@ -479,7 +479,7 @@ export const getFrontendStore = () => { selected._styles = { normal: {}, hover: {}, active: {} } await store.actions.preview.saveSelected() }, - updateProp: (name, value) => { + updateProp: async (name, value) => { let component = get(selectedComponent) if (!name || !component) { return @@ -489,7 +489,7 @@ export const getFrontendStore = () => { state.selectedComponentId = component._id return state }) - store.actions.preview.saveSelected() + await store.actions.preview.saveSelected() }, links: { save: async (url, title) => { diff --git a/packages/builder/src/components/backend/DataTable/Table.svelte b/packages/builder/src/components/backend/DataTable/Table.svelte index fa0482963..1878e63b0 100644 --- a/packages/builder/src/components/backend/DataTable/Table.svelte +++ b/packages/builder/src/components/backend/DataTable/Table.svelte @@ -15,7 +15,7 @@ import TableLoadingOverlay from "./TableLoadingOverlay" import TableHeader from "./TableHeader" import "@budibase/svelte-ag-grid/dist/index.css" - import { TableNames } from "constants" + import { TableNames, UNEDITABLE_USER_FIELDS } from "constants" export let schema = {} export let data = [] @@ -53,6 +53,7 @@ if (isUsersTable) { schema.email.displayFieldName = "Email" schema.roleId.displayFieldName = "Role" + schema.status.displayFieldName = "Status" } } @@ -83,7 +84,7 @@ if (!allowEditing) { return false } - return !(isUsersTable && ["email", "roleId"].includes(key)) + return !(isUsersTable && UNEDITABLE_USER_FIELDS.includes(key)) } for (let [key, value] of Object.entries(schema || {})) { diff --git a/packages/builder/src/components/backend/DataTable/ViewDataTable.svelte b/packages/builder/src/components/backend/DataTable/ViewDataTable.svelte index 4ac5ec80a..365f9aee9 100644 --- a/packages/builder/src/components/backend/DataTable/ViewDataTable.svelte +++ b/packages/builder/src/components/backend/DataTable/ViewDataTable.svelte @@ -53,6 +53,7 @@ diff --git a/packages/builder/src/components/backend/DataTable/popovers/FilterPopover.svelte b/packages/builder/src/components/backend/DataTable/popovers/FilterPopover.svelte index 871b1a699..7bbaf52f1 100644 --- a/packages/builder/src/components/backend/DataTable/popovers/FilterPopover.svelte +++ b/packages/builder/src/components/backend/DataTable/popovers/FilterPopover.svelte @@ -168,7 +168,9 @@ {/if}