From a2e8f2461a95ad57e2d6dfd53553ca8e65483780 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Thu, 14 May 2020 21:18:36 +0100 Subject: [PATCH 01/11] =?UTF-8?q?Making=20budibase=20downloadable,=20confi?= =?UTF-8?q?guring=20CI=20to=20build=20executable=20bina=E2=80=A6=20(#233)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Making budibase downloadable, configuring CI to build executable bina… --- .github/workflows/budibase_ci.yml | 21 +- packages/server/.DS_Store | Bin 8196 -> 0 bytes packages/server/build/.DS_Store | Bin 6148 -> 0 bytes packages/server/build/icon.png | Bin 0 -> 25714 bytes packages/server/package.json | 24 +- packages/server/src/api/controllers/static.js | 2 +- packages/server/src/electron.js | 39 ++- packages/server/yarn.lock | 222 +++++++++++++++++- 8 files changed, 294 insertions(+), 14 deletions(-) delete mode 100644 packages/server/.DS_Store delete mode 100644 packages/server/build/.DS_Store create mode 100644 packages/server/build/icon.png diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml index ed19f2c372..28afa0e509 100644 --- a/.github/workflows/budibase_ci.yml +++ b/.github/workflows/budibase_ci.yml @@ -21,16 +21,33 @@ jobs: steps: - uses: actions/checkout@v2 + - name: Use Node.js ${{ matrix.node-version }} uses: actions/setup-node@v1 with: node-version: ${{ matrix.node-version }} - run: yarn - - run: yarn lint + # - run: yarn lint - run: yarn bootstrap - run: yarn build - - run: yarn test + # - run: yarn test env: CI: true name: Budibase CI + - name: Build/release Electron app + uses: samuelmeuli/action-electron-builder@v1 + with: + # GitHub token, automatically provided to the action + # (No need to define this secret in the repo settings) + github_token: ${{ secrets.github_token }} + + # If the commit is tagged with a version (e.g. "v1.0.0"), + # release the app after building + package_root: packages/server + # mac_certs: ${{ secrets.mac_certs }} + # mac_certs_password: ${{ secrets.mac_certs_password }} + # windows_certs: ${{ secrets.windows_certs }} + # windows_certs_password: ${{ secrets.windows_certs_password }} + # snapcraft_token: ${{ secrets.snapcraft_token }} + release: ${{ startsWith(github.ref, 'refs/tags/v') }} diff --git a/packages/server/.DS_Store b/packages/server/.DS_Store deleted file mode 100644 index d7a28e72849dd43cde1e817c47cf654031acdf6f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8196 zcmeHM%Wl&^6ur}?t=%9L5E4aVVTlDSDpb^zF4$OUgH)*kL@K)A5$xJ(U5p($PE%A> zijdf{MzG}}egpUjK7k)#4d>1b!Ew?pLNHU!oXPmyJL7XR<6M`BM57m6BU&IL3ze}} zMKhuBb*^J&N{^fc3fNP+#3T9p4P3eMLl$W^ zD_I@7O8e9;aX*&0Gvrf`B8n*(Wr`OkGyQ(Iqu(EV_d9Xa&6k$GimB8ky(wU_o=xtI644KHigF1Df|^u2653i7?JFlol&L73dmHoZK|?lXBSO=A#L-}CQ9 zVZU8Fx0WWk7bRgP{V5+0wxc9S`;D}h1YOD3&Sn3Om+!%kb;-@79%Nf~yS8w2R9{(H zbn5lx<3;Cab#)2-p`_ zSrVtoE=Jj6?zf~AQZ_0paj;$$f;B|}`6UhqsmQ5-6H%A)ah~{A@HOO_0P%xPi&hFx z6+wwncPOWfQc5Q66LG#20t*31;4!4biG1EI#gNU>CT-9fHR%?$s5v2URv~cn^c4OB z{PD{A*uNQtqc*%EQM5UQ^`vq|ZCG=!C#_36p7(Ldt^@x&^aSlLW|OA`>o7VWe^JF@ zVU0HY=klb8B!=a)MXqqv;+eb?Ryf8Cm~+A$!!NK42~9By7zM@@m{ubToc}jZe*Zsa zX9kP{MuC4v0a00Rtv7H#zkZpPZ;f+p2lX*37v>EVN)t3P9S6#E960=kA^HxeY~yMi TD8vYgc@ZFGFpW{*k1FsJfh}jq diff --git a/packages/server/build/.DS_Store b/packages/server/build/.DS_Store deleted file mode 100644 index 0199b6c9be444d90d836dfcd40070403cbad1986..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHKF-`+P474Fd5KYRITT&rW)2yOUQ1gK(p+Snc0?}WUckwfru`NV&NrOa##*#g| zUe9fAigRpczIuPYGh3M198RL( zA9maQu*E5V+CBW{GYl)46p#W^Knh3!De!v**n45~>qJEzE~gjR{~c921d&c~XH%^%^le>BzUL>xE-t(#_*$Jg08-3*#95kXXgK7l6F!+3j8Yte71gCukcFMTPH8aUfbXsIBP!OG^~Sy m5bYQk?HC)j<7E_OUE><(y>LtnI`TmW>dydmkx7BSR^ST;$s0ZZ diff --git a/packages/server/build/icon.png b/packages/server/build/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..dd06244d96015a783846ba2c07c6fb5501dd7161 GIT binary patch literal 25714 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 R{`(LJ4ph@nqe;yf_CIoPr&9m` literal 0 HcmV?d00001 diff --git a/packages/server/package.json b/packages/server/package.json index 994408b851..fdd9add4b9 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -2,7 +2,24 @@ "name": "@budibase/server", "version": "0.0.32", "description": "Budibase Web Server", - "main": "src/index.js", + "main": "src/electron.js", + "repository": { + "type": "git", + "url": "https://github.com/Budibase/budibase.git" + }, + "build": { + "appId": "com.budibase.builder", + "productName": "Budibase Builder", + "mac": { + "category": "public.app-category.developer-tools" + }, + "linux": { + "target": [ + "AppImage" + ], + "category": "Development" + } + }, "scripts": { "test": "jest", "test:integration": "jest routes --runInBand", @@ -11,6 +28,9 @@ "budi": "node ../cli/bin/budi", "dev:builder": "nodemon ../cli/bin/budi run", "electron": "electron src/electron.js", + "build:electron": "electron-builder", + "publish:electron": "electron-builder -mwl --publish always", + "postinstall": "electron-builder install-app-deps", "lint": "eslint --fix src/" }, "keywords": [ @@ -25,6 +45,8 @@ "ajv": "^6.12.2", "bcryptjs": "^2.4.3", "dotenv": "^8.2.0", + "electron-is-dev": "^1.2.0", + "electron-updater": "^4.3.1", "fs-extra": "^8.1.0", "jsonwebtoken": "^8.5.1", "koa": "^2.7.0", diff --git a/packages/server/src/api/controllers/static.js b/packages/server/src/api/controllers/static.js index 3badf1940a..ba3a0cb211 100644 --- a/packages/server/src/api/controllers/static.js +++ b/packages/server/src/api/controllers/static.js @@ -6,7 +6,7 @@ const { } = require("../../utilities/budibaseDir") exports.serveBuilder = async function(ctx) { - let builderPath = resolve(process.cwd(), "builder") + let builderPath = resolve(__dirname, "../../../builder") await send(ctx, ctx.file, { root: ctx.devPath || builderPath }) } diff --git a/packages/server/src/electron.js b/packages/server/src/electron.js index 68350795db..321b67fbda 100644 --- a/packages/server/src/electron.js +++ b/packages/server/src/electron.js @@ -1,15 +1,40 @@ -const { app, BrowserWindow } = require('electron'); -const { join } = require("path") -const { homedir } = require("os") +const { app, BrowserWindow } = require("electron"); +const { join } = require("path"); +const { homedir } = require("os"); +const isDev = require("electron-is-dev"); +const { autoUpdater } = require("electron-updater"); -require("dotenv").config({ path: join(homedir(), ".budibase", ".env") }) -const DEV_URL = "http://localhost:4001"; +require("dotenv").config({ path: join(homedir(), ".budibase", ".env") }); + + +const APP_URL = "http://localhost:4001"; +const APP_TITLE = "Budibase Builder"; function createWindow() { app.server = require("./app"); let win = new BrowserWindow({ width: 1920, height: 1080 }); - win.loadURL(DEV_URL); + win.setTitle(APP_TITLE); + win.loadURL(APP_URL); + if (isDev) { + win.webContents.openDevTools(); + } else { + autoUpdater.checkForUpdatesAndNotify(); + } } -app.whenReady().then(createWindow) \ No newline at end of file +app.whenReady().then(createWindow) + + +// Quit when all windows are closed. +app.on("window-all-closed", () => { + // On macOS it is common for applications and their menu bar + // to stay active until the user quits explicitly with Cmd + Q + if (process.platform !== "darwin") app.quit(); +}); + +app.on("activate", () => { + // On macOS it's common to re-create a window in the app when the + // dock icon is clicked and there are no other windows open. + if (win === null) createWindow(); +}); \ No newline at end of file diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index 369224cd8b..4857f07231 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -194,6 +194,20 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@budibase/client@^0.0.32": + version "0.0.32" + resolved "https://registry.yarnpkg.com/@budibase/client/-/client-0.0.32.tgz#76d9f147563a0bf939eae7f32ce75b2a527ba496" + integrity sha512-jmCCLn0CUoQbL6h623S5IqK6+GYLqX3WzUTZInSb1SCBOM3pI0eLP5HwTR6s7r42SfD0v9jTWRdyTnHiElNj8A== + dependencies: + "@nx-js/compiler-util" "^2.0.0" + bcryptjs "^2.4.3" + deep-equal "^2.0.1" + lodash "^4.17.15" + lunr "^2.3.5" + regexparam "^1.3.0" + shortid "^2.2.8" + svelte "^3.9.2" + "@budibase/core@^0.0.32": version "0.0.32" resolved "https://registry.yarnpkg.com/@budibase/core/-/core-0.0.32.tgz#c5d9ab869c5e9596a1ac337aaf041e795b1cc7fa" @@ -509,6 +523,13 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.38.tgz#58841a382f231ad005dbb935c36d44aa1118a26b" integrity sha512-75eLjX0pFuTcUXnnWmALMzzkYorjND0ezNEycaKesbUBg9eGZp4GHPuDmkRc4mQQvIpe29zrzATNRA6hkYqwmA== +"@types/semver@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.2.0.tgz#0d72066965e910531e1db4621c15d0ca36b8d83b" + integrity sha512-TbB0A8ACUWZt3Y6bQPstW9QNbhNeebdgLX4T/ZfkrswAfUzRiXrgd9seol+X379Wa589Pu4UEx9Uok0D4RjRCQ== + dependencies: + "@types/node" "*" + "@types/stack-utils@^1.0.1": version "1.0.1" resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e" @@ -791,6 +812,11 @@ array-equal@^1.0.0: resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM= +array-filter@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-1.0.0.tgz#baf79e62e6ef4c2a4c0b831232daffec251f9d83" + integrity sha1-uveeYubvTCpMC4MSMtr/7CUfnYM= + array-unique@^0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" @@ -858,6 +884,13 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +available-typed-arrays@^1.0.0, available-typed-arrays@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.2.tgz#6b098ca9d8039079ee3f77f7b783c4480ba513f5" + integrity sha512-XWX3OX8Onv97LMk/ftVyBibpGwY5a8SmuxZPzeOxqmuEqUCOM9ZE+uIaD1VNJ5QnvU2UQusvmKbuM1FR8QWGfQ== + dependencies: + array-filter "^1.0.0" + aws-sign2@~0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" @@ -1558,6 +1591,26 @@ decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" +deep-equal@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.3.tgz#cad1c15277ad78a5c01c49c2dee0f54de8a6a7b0" + integrity sha512-Spqdl4H+ky45I9ByyJtXteOm9CaIrPmnIPmOhrkKGNYWeDgCvJ8jNYVCTjChxW4FqGuZnLHADc8EKRMX6+CgvA== + dependencies: + es-abstract "^1.17.5" + es-get-iterator "^1.1.0" + is-arguments "^1.0.4" + is-date-object "^1.0.2" + is-regex "^1.0.5" + isarray "^2.0.5" + object-is "^1.1.2" + object-keys "^1.1.1" + object.assign "^4.1.0" + regexp.prototype.flags "^1.3.0" + side-channel "^1.0.2" + which-boxed-primitive "^1.0.1" + which-collection "^1.0.1" + which-typed-array "^1.1.2" + deep-equal@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" @@ -1776,6 +1829,11 @@ electron-builder@^22.6.0: update-notifier "^4.1.0" yargs "^15.3.1" +electron-is-dev@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-1.2.0.tgz#2e5cea0a1b3ccf1c86f577cee77363ef55deb05e" + integrity sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw== + electron-publish@22.6.0: version "22.6.0" resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-22.6.0.tgz#11dca595cfe3c0fdbc364c28dbb8838a1c6ec799" @@ -1790,6 +1848,19 @@ electron-publish@22.6.0: lazy-val "^1.0.4" mime "^2.4.4" +electron-updater@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.1.tgz#9d485b6262bc56fcf7ee62b1dc1b3b105a3e96a7" + integrity sha512-UDC5AHCgeiHJYDYWZG/rsl1vdAFKqI/Lm7whN57LKAk8EfhTewhcEHzheRcncLgikMcQL8gFo1KeX51tf5a5Wg== + dependencies: + "@types/semver" "^7.1.0" + builder-util-runtime "8.7.0" + fs-extra "^9.0.0" + js-yaml "^3.13.1" + lazy-val "^1.0.4" + lodash.isequal "^4.5.0" + semver "^7.1.3" + electron@^8.2.5: version "8.2.5" resolved "https://registry.yarnpkg.com/electron/-/electron-8.2.5.tgz#ae3cb23d5517b2189fd35298e487198d65d1a291" @@ -1862,7 +1933,7 @@ error-inject@^1.0.0: resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37" integrity sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc= -es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: +es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.4, es-abstract@^1.17.5: version "1.17.5" resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz#d8c9d1d66c8981fb9200e2251d799eee92774ae9" integrity sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg== @@ -1879,6 +1950,19 @@ es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5: string.prototype.trimleft "^2.1.1" string.prototype.trimright "^2.1.1" +es-get-iterator@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.0.tgz#bb98ad9d6d63b31aacdc8f89d5d0ee57bcb5b4c8" + integrity sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ== + dependencies: + es-abstract "^1.17.4" + has-symbols "^1.0.1" + is-arguments "^1.0.4" + is-map "^2.0.1" + is-set "^2.0.1" + is-string "^1.0.5" + isarray "^2.0.5" + es-to-primitive@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" @@ -2847,11 +2931,21 @@ is-accessor-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" +is-arguments@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz#3faf966c7cba0ff437fb31f6250082fcf0448cf3" + integrity sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA== + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= +is-bigint@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.0.tgz#73da8c33208d00f130e9b5e15d23eac9215601c4" + integrity sha512-t5mGUXC/xRheCK431ylNiSkGGpBp8bHENBcENTkDT6ppwPzEVxNGZRvgvmOEfbWkFhA7D2GEuE2mmQTr78sl2g== + is-binary-path@~2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" @@ -2859,6 +2953,11 @@ is-binary-path@~2.1.0: dependencies: binary-extensions "^2.0.0" +is-boolean-object@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.1.tgz#10edc0900dd127697a92f6f9807c7617d68ac48e" + integrity sha512-TqZuVwa/sppcrhUCAYkGBk7w0yxfQQnxq28fjkO53tnK9FQXmdwz2JS5+GjsWQ6RByES1K40nI+yDic5c9/aAQ== + is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -2895,7 +2994,7 @@ is-data-descriptor@^1.0.0: dependencies: kind-of "^6.0.0" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== @@ -2970,11 +3069,21 @@ is-installed-globally@^0.3.1: global-dirs "^2.0.1" is-path-inside "^3.0.1" +is-map@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.1.tgz#520dafc4307bb8ebc33b813de5ce7c9400d644a1" + integrity sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw== + is-npm@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d" integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig== +is-number-object@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw== + is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -3011,11 +3120,21 @@ is-regex@^1.0.5: dependencies: has "^1.0.3" +is-set@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.1.tgz#d1604afdab1724986d30091575f54945da7e5f43" + integrity sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA== + is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= +is-string@^1.0.4, is-string@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== + is-symbol@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -3032,11 +3151,31 @@ is-type-of@^1.0.0: is-class-hotfix "~0.0.6" isstream "~0.1.2" +is-typed-array@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.3.tgz#a4ff5a5e672e1a55f99c7f54e59597af5c1df04d" + integrity sha512-BSYUBOK/HJibQ30wWkWold5txYwMUXQct9YHAQJr8fSwvZoiglcqB0pd7vEN23+Tsi9IUEjztdOSzl4qLVYGTQ== + dependencies: + available-typed-arrays "^1.0.0" + es-abstract "^1.17.4" + foreach "^2.0.5" + has-symbols "^1.0.1" + is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakset@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.1.tgz#e9a0af88dbd751589f5e50d80f4c98b780884f83" + integrity sha512-pi4vhbhVHGLxohUw7PhGsueT4vRGFoXhP7+RGN0jKIv9+8PWYCQTqtADngrxOm2g46hoH0+g8uZZBzMrvVGDmw== + is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" @@ -3062,6 +3201,11 @@ isarray@1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + isbinaryfile@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.6.tgz#edcb62b224e2b4710830b67498c8e4e5a4d2610b" @@ -4007,6 +4151,11 @@ lodash.isboolean@^3.0.3: resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY= +lodash.isequal@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= + lodash.isinteger@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" @@ -4421,6 +4570,14 @@ object-inspect@^1.7.0: resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz#f4f6bd181ad77f006b5ece60bd0b6f398ff74a67" integrity sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw== +object-is@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz#c5d2e87ff9e119f78b7a088441519e2eec1573b6" + integrity sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.5" + object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.6, object-keys@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" @@ -4971,6 +5128,19 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" +regexp.prototype.flags@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz#7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75" + integrity sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.0-next.1" + +regexparam@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/regexparam/-/regexparam-1.3.0.tgz#2fe42c93e32a40eff6235d635e0ffa344b92965f" + integrity sha512-6IQpFBv6e5vz1QAqI+V4k8P2e/3gRrqfCJ9FI+O1FLQTO+Uz6RXZEZOPmTJ6hlGj7gkERzY5BRCv09whKP96/g== + regexpp@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" @@ -5233,7 +5403,7 @@ semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.1.2, semver@^7.3.2: +semver@^7.1.2, semver@^7.1.3, semver@^7.3.2: version "7.3.2" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== @@ -5299,6 +5469,14 @@ shortid@^2.2.8: dependencies: nanoid "^2.1.0" +side-channel@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.2.tgz#df5d1abadb4e4bf4af1cd8852bf132d2f7876947" + integrity sha512-7rL9YlPHg7Ancea1S96Pa8/QWb4BtXL/TZvS6B8XFetGBeuhAsfmUspK6DokBeZ64+Kj9TCNRD/30pVz1BvQNA== + dependencies: + es-abstract "^1.17.0-next.1" + object-inspect "^1.7.0" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" @@ -5682,6 +5860,11 @@ supports-color@^7.1.0: dependencies: has-flag "^4.0.0" +svelte@^3.9.2: + version "3.22.2" + resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.22.2.tgz#06585244191bf7a112af2a0025610f33d77c3715" + integrity sha512-DxumO0+vvHA6NSc2jtVty08I8lFI43q8P2zX6JxZL8J1kqK5NVjad6TRM/twhnWXC+QScnwkZ15O6X1aTsEKTA== + symbol-tree@^3.2.2: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" @@ -6157,11 +6340,44 @@ whatwg-url@^7.0.0: tr46 "^1.0.1" webidl-conversions "^4.0.2" +which-boxed-primitive@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.1.tgz#cbe8f838ebe91ba2471bb69e9edbda67ab5a5ec1" + integrity sha512-7BT4TwISdDGBgaemWU0N0OU7FeAEJ9Oo2P1PHRm/FCWoEi2VLWC9b6xvxAA3C/NMpxg3HXVgi0sMmGbNUbNepQ== + dependencies: + is-bigint "^1.0.0" + is-boolean-object "^1.0.0" + is-number-object "^1.0.3" + is-string "^1.0.4" + is-symbol "^1.0.2" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= +which-typed-array@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.2.tgz#e5f98e56bda93e3dac196b01d47c1156679c00b2" + integrity sha512-KT6okrd1tE6JdZAy3o2VhMoYPh3+J6EMZLyrxBQsZflI1QCZIxMrIYLkosd8Twf+YfknVIHmYQPgJt238p8dnQ== + dependencies: + available-typed-arrays "^1.0.2" + es-abstract "^1.17.5" + foreach "^2.0.5" + function-bind "^1.1.1" + has-symbols "^1.0.1" + is-typed-array "^1.1.3" + which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" From dbcd85843f8de0d2ad069cd08f4f9a5685ef53b4 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Thu, 14 May 2020 21:24:34 +0100 Subject: [PATCH 02/11] add builds for windows and mac --- .github/workflows/budibase_ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml index 28afa0e509..d7260747c3 100644 --- a/.github/workflows/budibase_ci.yml +++ b/.github/workflows/budibase_ci.yml @@ -12,11 +12,11 @@ on: jobs: build: - - runs-on: ubuntu-latest + runs-on: ${{ matrix.os }} strategy: matrix: + os: [macos-latest, ubuntu-latest, windows-latest] node-version: [10.x] steps: From 8038bb541aab5c8b041707225dfb487046a19a23 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Thu, 14 May 2020 21:48:02 +0100 Subject: [PATCH 03/11] Release ci (#234) * adding budibase release workflow * avoid NPM release step --- .github/workflows/budibase_ci.yml | 26 +++------------ .github/workflows/release.yml | 53 +++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 22 deletions(-) create mode 100644 .github/workflows/release.yml diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml index d7260747c3..21d735fcbc 100644 --- a/.github/workflows/budibase_ci.yml +++ b/.github/workflows/budibase_ci.yml @@ -12,11 +12,10 @@ on: jobs: build: - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest strategy: matrix: - os: [macos-latest, ubuntu-latest, windows-latest] node-version: [10.x] steps: @@ -27,27 +26,10 @@ jobs: with: node-version: ${{ matrix.node-version }} - run: yarn - # - run: yarn lint + - run: yarn lint - run: yarn bootstrap - run: yarn build - # - run: yarn test + - run: yarn test env: CI: true - name: Budibase CI - - - name: Build/release Electron app - uses: samuelmeuli/action-electron-builder@v1 - with: - # GitHub token, automatically provided to the action - # (No need to define this secret in the repo settings) - github_token: ${{ secrets.github_token }} - - # If the commit is tagged with a version (e.g. "v1.0.0"), - # release the app after building - package_root: packages/server - # mac_certs: ${{ secrets.mac_certs }} - # mac_certs_password: ${{ secrets.mac_certs_password }} - # windows_certs: ${{ secrets.windows_certs }} - # windows_certs_password: ${{ secrets.windows_certs_password }} - # snapcraft_token: ${{ secrets.snapcraft_token }} - release: ${{ startsWith(github.ref, 'refs/tags/v') }} + name: Budibase CI \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000000..35f9ad1224 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,53 @@ +name: Budibase Release + +on: + release: + types: [created] + +jobs: + build: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + node-version: [10.x] + + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: yarn + # - run: yarn lint + - run: yarn bootstrap + - run: yarn build + # - run: yarn test + + # publish-npm: + # needs: build + # runs-on: ubuntu-latest + # steps: + # - uses: actions/checkout@v2 + # - uses: actions/setup-node@v1 + # with: + # node-version: ${{ matrix.node-version }} + # - run: npm publish + # env: + # NODE_AUTH_TOKEN: ${{secrets.npm_token}} + + - name: Build/release Electron app + uses: samuelmeuli/action-electron-builder@v1 + with: + # GitHub token, automatically provided to the action + # (No need to define this secret in the repo settings) + github_token: ${{ secrets.github_token }} + + # release the app after building + package_root: packages/server + release: true + # mac_certs: ${{ secrets.mac_certs }} + # mac_certs_password: ${{ secrets.mac_certs_password }} + # windows_certs: ${{ secrets.windows_certs }} + # windows_certs_password: ${{ secrets.windows_certs_password }} + # snapcraft_token: ${{ secrets.snapcraft_token }} From 1f19f420efaf85a5f0a3072ff241e53e3ef18051 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Thu, 14 May 2020 22:03:32 +0100 Subject: [PATCH 04/11] Update release.yml --- .github/workflows/release.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 35f9ad1224..8af0f5d71d 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -6,11 +6,10 @@ on: jobs: build: - runs-on: ${{ matrix.os }} + runs-on: ubuntu-latest strategy: matrix: - os: [macos-latest, ubuntu-latest, windows-latest] node-version: [10.x] steps: @@ -36,6 +35,12 @@ jobs: # env: # NODE_AUTH_TOKEN: ${{secrets.npm_token}} + publish-electron: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + steps: - name: Build/release Electron app uses: samuelmeuli/action-electron-builder@v1 with: @@ -45,7 +50,7 @@ jobs: # release the app after building package_root: packages/server - release: true + release: true # mac_certs: ${{ secrets.mac_certs }} # mac_certs_password: ${{ secrets.mac_certs_password }} # windows_certs: ${{ secrets.windows_certs }} From a5697712ac92bbb4189770a6f4459b7f17410b3e Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Thu, 14 May 2020 22:06:43 +0100 Subject: [PATCH 05/11] Update release.yml --- .github/workflows/release.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 8af0f5d71d..77c00f20b9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,6 +36,7 @@ jobs: # NODE_AUTH_TOKEN: ${{secrets.npm_token}} publish-electron: + needs: [build] runs-on: ${{ matrix.os }} strategy: matrix: From d391aa4c8a290ba5d0156b26d889775d331f0a33 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Thu, 14 May 2020 22:27:38 +0100 Subject: [PATCH 06/11] Update release.yml --- .github/workflows/release.yml | 65 +++++++++++++++-------------------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 77c00f20b9..f2167ed9dc 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -5,13 +5,15 @@ on: types: [created] jobs: - build: - runs-on: ubuntu-latest - + release: + runs-on: ${{ matrix.os }} + + # Platforms to build on/for strategy: matrix: + os: [macos-latest, ubuntu-latest, windows-latest] node-version: [10.x] - + steps: - uses: actions/checkout@v2 - uses: actions/setup-node@v1 @@ -22,38 +24,27 @@ jobs: - run: yarn bootstrap - run: yarn build # - run: yarn test + +# - name: Publish NPM +# run: npm publish +# env: +# NODE_AUTH_TOKEN: ${{secrets.npm_token}} + # - run: npm publish + # env: + # NODE_AUTH_TOKEN: ${{secrets.npm_token}} - # publish-npm: - # needs: build - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v2 - # - uses: actions/setup-node@v1 - # with: - # node-version: ${{ matrix.node-version }} - # - run: npm publish - # env: - # NODE_AUTH_TOKEN: ${{secrets.npm_token}} + - name: Build/release Electron app + uses: samuelmeuli/action-electron-builder@v1 + with: + # GitHub token, automatically provided to the action + # (No need to define this secret in the repo settings) + github_token: ${{ secrets.github_token }} - publish-electron: - needs: [build] - runs-on: ${{ matrix.os }} - strategy: - matrix: - os: [macos-latest, ubuntu-latest, windows-latest] - steps: - - name: Build/release Electron app - uses: samuelmeuli/action-electron-builder@v1 - with: - # GitHub token, automatically provided to the action - # (No need to define this secret in the repo settings) - github_token: ${{ secrets.github_token }} - - # release the app after building - package_root: packages/server - release: true - # mac_certs: ${{ secrets.mac_certs }} - # mac_certs_password: ${{ secrets.mac_certs_password }} - # windows_certs: ${{ secrets.windows_certs }} - # windows_certs_password: ${{ secrets.windows_certs_password }} - # snapcraft_token: ${{ secrets.snapcraft_token }} + # release the app after building + package_root: packages/server + release: true + # mac_certs: ${{ secrets.mac_certs }} + # mac_certs_password: ${{ secrets.mac_certs_password }} + # windows_certs: ${{ secrets.windows_certs }} + # windows_certs_password: ${{ secrets.windows_certs_password }} + # snapcraft_token: ${{ secrets.snapcraft_token }} From 77c0509e890849ed51394547824af775c8b0eeaa Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Fri, 15 May 2020 14:39:27 +0100 Subject: [PATCH 07/11] Update release.yml --- .github/workflows/release.yml | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index f2167ed9dc..415dbc11e8 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,8 +1,13 @@ name: Budibase Release -on: - release: - types: [created] +on: + # Trigger the workflow on push, + # but only for the release branch + push: + branches: + - master + tags: + - 'v*' jobs: release: @@ -36,13 +41,13 @@ jobs: - name: Build/release Electron app uses: samuelmeuli/action-electron-builder@v1 with: + skip_build: true + package_root: packages/server # GitHub token, automatically provided to the action # (No need to define this secret in the repo settings) github_token: ${{ secrets.github_token }} - # release the app after building - package_root: packages/server - release: true + release: ${{ startsWith(github.ref, 'refs/tags/v') }} # mac_certs: ${{ secrets.mac_certs }} # mac_certs_password: ${{ secrets.mac_certs_password }} # windows_certs: ${{ secrets.windows_certs }} From 03c5aaa0cbaf687bf8b5a5415f6f80aedd7fbbbe Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Fri, 15 May 2020 16:06:53 +0100 Subject: [PATCH 08/11] notarization and mac code signing through github CI --- .github/workflows/release.yml | 31 +++++----- packages/server/build/entitlements.mac.plist | 12 ++++ packages/server/package.json | 5 +- packages/server/src/electron.js | 2 +- packages/server/yarn.lock | 60 ++++++++++++++++++++ 5 files changed, 94 insertions(+), 16 deletions(-) create mode 100644 packages/server/build/entitlements.mac.plist diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 415dbc11e8..e1081904a0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -29,27 +29,30 @@ jobs: - run: yarn bootstrap - run: yarn build # - run: yarn test - -# - name: Publish NPM -# run: npm publish -# env: -# NODE_AUTH_TOKEN: ${{secrets.npm_token}} - # - run: npm publish - # env: - # NODE_AUTH_TOKEN: ${{secrets.npm_token}} + + - name: Prepare for app notarization (macOS) + if: startsWith(matrix.os, 'macos') + # Import Apple API key for app notarization on macOS + run: | + mkdir -p ~/private_keys/ + echo '${{ secrets.api_key }}' > ~/private_keys/AuthKey_${{ secrets.api_key_id }}.p8 + - name: Build/release Electron app uses: samuelmeuli/action-electron-builder@v1 with: - skip_build: true package_root: packages/server + # GitHub token, automatically provided to the action # (No need to define this secret in the repo settings) github_token: ${{ secrets.github_token }} + + mac_certs: ${{ secrets.mac_certs }} + mac_certs_password: ${{ secrets.mac_certs_password }} + # release the app after building release: ${{ startsWith(github.ref, 'refs/tags/v') }} - # mac_certs: ${{ secrets.mac_certs }} - # mac_certs_password: ${{ secrets.mac_certs_password }} - # windows_certs: ${{ secrets.windows_certs }} - # windows_certs_password: ${{ secrets.windows_certs_password }} - # snapcraft_token: ${{ secrets.snapcraft_token }} + env: + # macOS notarization API key + API_KEY_ID: ${{ secrets.api_key_id }} + API_KEY_ISSUER_ID: ${{ secrets.api_key_issuer_id }} diff --git a/packages/server/build/entitlements.mac.plist b/packages/server/build/entitlements.mac.plist new file mode 100644 index 0000000000..5e2a11dfe2 --- /dev/null +++ b/packages/server/build/entitlements.mac.plist @@ -0,0 +1,12 @@ + + + + + com.apple.security.cs.allow-jit + + com.apple.security.cs.allow-unsigned-executable-memory + + com.apple.security.cs.allow-dyld-environment-variables + + + \ No newline at end of file diff --git a/packages/server/package.json b/packages/server/package.json index fdd9add4b9..c0c8027b36 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -10,8 +10,10 @@ "build": { "appId": "com.budibase.builder", "productName": "Budibase Builder", + "afterSign": "electron-builder-notarize", "mac": { - "category": "public.app-category.developer-tools" + "category": "public.app-category.developer-tools", + "hardenedRuntime": true }, "linux": { "target": [ @@ -69,6 +71,7 @@ "@jest/test-sequencer": "^24.8.0", "electron": "^8.2.5", "electron-builder": "^22.6.0", + "electron-builder-notarize": "^1.1.2", "eslint": "^6.8.0", "jest": "^24.8.0", "nodemon": "^2.0.2", diff --git a/packages/server/src/electron.js b/packages/server/src/electron.js index 321b67fbda..cc06ceeca8 100644 --- a/packages/server/src/electron.js +++ b/packages/server/src/electron.js @@ -8,7 +8,7 @@ const { autoUpdater } = require("electron-updater"); require("dotenv").config({ path: join(homedir(), ".budibase", ".env") }); -const APP_URL = "http://localhost:4001"; +const APP_URL = "http://localhost:4001/_builder"; const APP_TITLE = "Budibase Builder"; function createWindow() { diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index 4857f07231..ed03ba367c 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -523,6 +523,11 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.38.tgz#58841a382f231ad005dbb935c36d44aa1118a26b" integrity sha512-75eLjX0pFuTcUXnnWmALMzzkYorjND0ezNEycaKesbUBg9eGZp4GHPuDmkRc4mQQvIpe29zrzATNRA6hkYqwmA== +"@types/normalize-package-data@^2.4.0": + version "2.4.0" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e" + integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA== + "@types/semver@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.2.0.tgz#0d72066965e910531e1db4621c15d0ca36b8d83b" @@ -1809,6 +1814,14 @@ ejs@^3.1.2: dependencies: jake "^10.6.1" +electron-builder-notarize@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/electron-builder-notarize/-/electron-builder-notarize-1.1.2.tgz#29939591c6edf133aadc8450d975e9ce94a15da3" + integrity sha512-IiuG+Wwky4EwekhJ9T5t9m00sFL9EGUrkyr4wqivXxrvtWIGAh2WCUwO6e47l3W8nE/4ng0v+VNJhZEIlCu1xg== + dependencies: + electron-notarize "^0.2.0" + read-pkg-up "^7.0.0" + electron-builder@^22.6.0: version "22.6.0" resolved "https://registry.yarnpkg.com/electron-builder/-/electron-builder-22.6.0.tgz#3ac81634e27026892d66f3a52568e65a7d28d26a" @@ -1834,6 +1847,14 @@ electron-is-dev@^1.2.0: resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-1.2.0.tgz#2e5cea0a1b3ccf1c86f577cee77363ef55deb05e" integrity sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw== +electron-notarize@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/electron-notarize/-/electron-notarize-0.2.1.tgz#759e8006decae19134f82996ed910db26d9192cc" + integrity sha512-oZ6/NhKeXmEKNROiFmRNfytqu3cxqC95sjooG7kBXQVEUSQkZnbiAhxVh5jXngL881G197pbwpeVPJyM7Ikmxw== + dependencies: + debug "^4.1.1" + fs-extra "^8.1.0" + electron-publish@22.6.0: version "22.6.0" resolved "https://registry.yarnpkg.com/electron-publish/-/electron-publish-22.6.0.tgz#11dca595cfe3c0fdbc364c28dbb8838a1c6ec799" @@ -4116,6 +4137,11 @@ lie@3.0.4: inline-process-browser "^1.0.0" unreachable-branch-transform "^0.3.0" +lines-and-columns@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" + integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= + load-json-file@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" @@ -4736,6 +4762,16 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" +parse-json@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz#73e5114c986d143efa3712d4ea24db9a4266f60f" + integrity sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + lines-and-columns "^1.1.6" + parse5@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/parse5/-/parse5-4.0.0.tgz#6d78656e3da8d78b4ec0b906f7c08ef1dfe3f608" @@ -5030,6 +5066,15 @@ read-pkg-up@^4.0.0: find-up "^3.0.0" read-pkg "^3.0.0" +read-pkg-up@^7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507" + integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + read-pkg@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" @@ -5039,6 +5084,16 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + readable-stream@1.0.33: version "1.0.33" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.33.tgz#3a360dd66c1b1d7fd4705389860eda1d0f61126c" @@ -6100,6 +6155,11 @@ type-fest@^0.11.0: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1" integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ== +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + type-fest@^0.8.0, type-fest@^0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" From 3e0381b52459dd834439613bad980c8bb96f7355 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Fri, 15 May 2020 18:13:18 +0100 Subject: [PATCH 09/11] electron script --- packages/server/package.json | 2 +- packages/server/src/electron.js | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/server/package.json b/packages/server/package.json index c0c8027b36..86a9858032 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -30,7 +30,7 @@ "budi": "node ../cli/bin/budi", "dev:builder": "nodemon ../cli/bin/budi run", "electron": "electron src/electron.js", - "build:electron": "electron-builder", + "build:electron": "electron-builder --dir", "publish:electron": "electron-builder -mwl --publish always", "postinstall": "electron-builder install-app-deps", "lint": "eslint --fix src/" diff --git a/packages/server/src/electron.js b/packages/server/src/electron.js index cc06ceeca8..964c29eb4c 100644 --- a/packages/server/src/electron.js +++ b/packages/server/src/electron.js @@ -11,11 +11,14 @@ require("dotenv").config({ path: join(homedir(), ".budibase", ".env") }); const APP_URL = "http://localhost:4001/_builder"; const APP_TITLE = "Budibase Builder"; +let win; + function createWindow() { app.server = require("./app"); - let win = new BrowserWindow({ width: 1920, height: 1080 }); + win = new BrowserWindow({ width: 1920, height: 1080 }); win.setTitle(APP_TITLE); win.loadURL(APP_URL); + win.showInactive(); if (isDev) { win.webContents.openDevTools(); } else { From af4a1635c492a50a63f60af1b563c249d1060233 Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Fri, 15 May 2020 18:13:24 +0100 Subject: [PATCH 10/11] electron script --- packages/builder/src/global.css | 1 - packages/builder/src/main.js | 3 ++- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/builder/src/global.css b/packages/builder/src/global.css index 690c18e1d9..999415931a 100644 --- a/packages/builder/src/global.css +++ b/packages/builder/src/global.css @@ -1,4 +1,3 @@ -@import "./budibase.css"; :root { --primary100: #0055ff; diff --git a/packages/builder/src/main.js b/packages/builder/src/main.js index 0fadfc0bdc..77dcc4e172 100644 --- a/packages/builder/src/main.js +++ b/packages/builder/src/main.js @@ -1,6 +1,6 @@ -import App from "./App.svelte" import "./global.css" import "./fonts.css" +import "./budibase.css"; import "/assets/roboto-v20-latin-ext_latin-300" import "/assets/roboto-v20-latin-ext_latin-400" import "/assets/roboto-v20-latin-ext_latin-500" @@ -12,6 +12,7 @@ import "uikit/dist/css/uikit.min.css" import "uikit/dist/js/uikit.min.js" import "codemirror/lib/codemirror.css" import "codemirror/theme/monokai.css" +import App from "./App.svelte" /* eslint-disable */ const app = new App({ From 03593259e83b886abf81b10f91ba8800e114df8f Mon Sep 17 00:00:00 2001 From: Martin McKeaveney Date: Sat, 16 May 2020 18:19:36 +0100 Subject: [PATCH 11/11] native plist config for code signing and notarization --- .gitignore | 3 +++ packages/.DS_Store | Bin 6148 -> 0 bytes packages/server/build/entitlements.mac.plist | 2 ++ packages/server/package.json | 3 ++- packages/server/src/electron.js | 12 ++++++--- packages/server/yarn.lock | 27 ++++++++++++++++++- 6 files changed, 41 insertions(+), 6 deletions(-) delete mode 100644 packages/.DS_Store diff --git a/.gitignore b/.gitignore index 24c031d958..3b81fd63df 100644 --- a/.gitignore +++ b/.gitignore @@ -76,3 +76,6 @@ typings/ # Serverless directories .serverless + +# Mac files +.DS_Store diff --git a/packages/.DS_Store b/packages/.DS_Store deleted file mode 100644 index 80d62469cdc63f443da8e6c197cd5a03c9529620..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK&2AGh5S~dxn^2&ewt=<+X+Jo~eLMWk$s)RyAew?uC){b^JDeWn* zzyt6AJOdJEUIM`zz?B;_YnKoL5+{VHM;d?Q@yuBMthLtwfW<-QCV&F~8B)enmYQD( zkF!om%6J$tsUaZr+rxe-ZNL;JurL2x#YE$nALl@Lj7P_))yE@zHTGHIqI! zJD16xpTBVN(t?v)T*@uy^7+eGR`RQBYgZf2QmffM=!I$^J9kx}!eTHGd%e)_RQk=f zFMG9Eyo@XUiD)>BKZWjy&i>d{J?>M?^4O7-yB`W6lX|6YHxhB}2fN;I7NT~jf}pG- zKlYWZKaF0fqwQE6Zp*Hs8Hc_&D)o6N+7)3$IF(bYH^ZJT-1;!-0Y}0196BQ(|WvtV$(CHe2w@W;6rqa0ed2 zE*!uKyn@&82HwJZ_yC{bE6(96UdMI3g|~4NAK+u$!7A4A3GV6q6n%M#Tr+3@J7i4k z?64BbK*=8YPjekn9NLd%*<$BD45Jnem4mR z^fcPmGGG~)WMD>j9lrnX{r>$wnPhvG0n5OD#Q>(aDqBTblDS)_7RPt3OZuFYh2usV nzo(FqT*Va2SMdsIBII}3AoL85G?ItJ{s<&A*v2yOR~h&QUJa9M diff --git a/packages/server/build/entitlements.mac.plist b/packages/server/build/entitlements.mac.plist index 5e2a11dfe2..181db8f1fe 100644 --- a/packages/server/build/entitlements.mac.plist +++ b/packages/server/build/entitlements.mac.plist @@ -8,5 +8,7 @@ com.apple.security.cs.allow-dyld-environment-variables + com.apple.security.cs.disable-library-validation + \ No newline at end of file diff --git a/packages/server/package.json b/packages/server/package.json index 86a9858032..1aa15dac49 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -13,7 +13,7 @@ "afterSign": "electron-builder-notarize", "mac": { "category": "public.app-category.developer-tools", - "hardenedRuntime": true + "hardenedRuntime": true }, "linux": { "target": [ @@ -48,6 +48,7 @@ "bcryptjs": "^2.4.3", "dotenv": "^8.2.0", "electron-is-dev": "^1.2.0", + "electron-unhandled": "^3.0.2", "electron-updater": "^4.3.1", "fs-extra": "^8.1.0", "jsonwebtoken": "^8.5.1", diff --git a/packages/server/src/electron.js b/packages/server/src/electron.js index 964c29eb4c..b4bae9d706 100644 --- a/packages/server/src/electron.js +++ b/packages/server/src/electron.js @@ -3,22 +3,26 @@ const { join } = require("path"); const { homedir } = require("os"); const isDev = require("electron-is-dev"); const { autoUpdater } = require("electron-updater"); - +const unhandled = require("electron-unhandled"); require("dotenv").config({ path: join(homedir(), ".budibase", ".env") }); +if (isDev) { + unhandled({ + showDialog: true + }); +} -const APP_URL = "http://localhost:4001/_builder"; +const APP_URL = "http://localhost:4001"; const APP_TITLE = "Budibase Builder"; -let win; +let win function createWindow() { app.server = require("./app"); win = new BrowserWindow({ width: 1920, height: 1080 }); win.setTitle(APP_TITLE); win.loadURL(APP_URL); - win.showInactive(); if (isDev) { win.webContents.openDevTools(); } else { diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock index ed03ba367c..55e6d622df 100644 --- a/packages/server/yarn.lock +++ b/packages/server/yarn.lock @@ -1280,6 +1280,11 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +clean-stack@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + cli-boxes@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d" @@ -1842,7 +1847,7 @@ electron-builder@^22.6.0: update-notifier "^4.1.0" yargs "^15.3.1" -electron-is-dev@^1.2.0: +electron-is-dev@^1.0.1, electron-is-dev@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/electron-is-dev/-/electron-is-dev-1.2.0.tgz#2e5cea0a1b3ccf1c86f577cee77363ef55deb05e" integrity sha512-R1oD5gMBPS7PVU8gJwH6CtT0e6VSoD0+SzSnYpNm+dBkcijgA+K7VAMHDfnRq/lkKPZArpzplTW6jfiMYosdzw== @@ -1869,6 +1874,16 @@ electron-publish@22.6.0: lazy-val "^1.0.4" mime "^2.4.4" +electron-unhandled@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/electron-unhandled/-/electron-unhandled-3.0.2.tgz#e14a19c830ccf7b6e755191c8e78d23094d25112" + integrity sha512-IIqXnM5eNgV7k5sDA/GZ39ygJbpfF3WTArNGQ1TB4AI6ajQuuVztA0M6Mq9uEpmTh5gz4nR+YsTNWYsHLoM5rw== + dependencies: + clean-stack "^2.1.0" + electron-is-dev "^1.0.1" + ensure-error "^2.0.0" + lodash.debounce "^4.0.8" + electron-updater@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/electron-updater/-/electron-updater-4.3.1.tgz#9d485b6262bc56fcf7ee62b1dc1b3b105a3e96a7" @@ -1930,6 +1945,11 @@ end-stream@~0.1.0: dependencies: write-stream "~0.4.3" +ensure-error@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/ensure-error/-/ensure-error-2.1.0.tgz#f11fbe383c0cf4a54850ac77acceb7bc06e0f99d" + integrity sha512-+BMSJHw9gxiJAAp2ZR1E0TNcL09dD3lOvkl7WVm4+Y6xnes/pMetP/TzCHiDduh8ihNDjbGfuYxl7l4PA1xZ8A== + env-paths@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43" @@ -4167,6 +4187,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.includes@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"