From b52a2efef01ab0e463673760cfa4b1395b3438f9 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney <martin@shogunsystems.co.uk>
Date: Tue, 26 Jan 2021 11:07:30 +0000
Subject: [PATCH 01/26] MySQL integration and self hosted deploy event

---
 .../DatasourceNavigator/icons/MySQL.svelte    | 83 +++++++++++++++++++
 .../DatasourceNavigator/icons/index.js        |  2 +
 .../start/BuilderSettingsModal.svelte         |  5 +-
 .../builder/src/constants/backend/index.js    |  5 ++
 .../pages/[application]/deploy/index.svelte   |  6 +-
 packages/server/package.json                  |  3 +-
 packages/server/src/integrations/index.js     |  4 +-
 packages/server/src/integrations/mysql.js     | 80 ++++++++++++++++++
 packages/server/yarn.lock                     | 42 +++++++---
 9 files changed, 214 insertions(+), 16 deletions(-)
 create mode 100644 packages/builder/src/components/backend/DatasourceNavigator/icons/MySQL.svelte
 create mode 100644 packages/server/src/integrations/mysql.js

diff --git a/packages/builder/src/components/backend/DatasourceNavigator/icons/MySQL.svelte b/packages/builder/src/components/backend/DatasourceNavigator/icons/MySQL.svelte
new file mode 100644
index 0000000000..d2e612e7e3
--- /dev/null
+++ b/packages/builder/src/components/backend/DatasourceNavigator/icons/MySQL.svelte
@@ -0,0 +1,83 @@
+<script>
+  export let width = "100"
+  export let height = "100"
+</script>
+
+<svg
+  {width}
+  {height}
+  viewBox="0 0 147 147"
+  fill="none"
+  xmlns="http://www.w3.org/2000/svg">
+  <path
+    d="M128.244 27.5625H83.3444L74.1569
+    45.9375H22.9688V124.031H137.812V27.5625H128.244ZM128.625
+    45.9375H92.7478L97.5621 36.75H128.625V45.9375Z"
+    fill="#2A4B59" />
+  <path
+    fill-rule="evenodd"
+    clip-rule="evenodd"
+    d="M73.5827 67.597C72.6671 67.5874 71.7543 67.6986 70.8678
+    67.9278V68.061H70.9964C71.6302 69.0199 72.3383 69.9277 73.1141
+    70.7759C73.647 71.837 74.111 72.889 74.6393 73.9502L74.7679 73.8169C75.2581
+    73.4258 75.6415 72.917 75.8825 72.3379C76.1234 71.7589 76.2141 71.1283
+    76.146 70.5048C75.8564 70.0602 75.5911 69.6001 75.3513 69.1267C74.9562
+    68.4652 74.0926 68.1345 73.5597 67.6062"
+    fill="white" />
+  <path
+    fill-rule="evenodd"
+    clip-rule="evenodd"
+    d="M139.319 125.345C134.95 125.032 130.564 125.658 126.457 127.183C125.464
+    127.578 123.875 127.578 123.742 128.836C124.275 129.365 124.339 130.214
+    124.808 130.959C125.714 132.492 126.878 133.858 128.248 134.997C129.626
+    136.058 131.028 137.11 132.488 138.038C135.07 139.632 138.001 140.555
+    140.495 142.144C141.956 143.063 143.408 144.262 144.873 145.259C145.599
+    145.787 146.058 146.637 146.986 146.977V146.775C146.712 146.039 146.374
+    145.329 145.976 144.653C145.314 143.996 144.653 143.394 143.986
+    142.737C142.043 140.171 139.72 137.917 137.096 136.053C134.974 134.592
+    130.338 132.608 129.479 130.164L129.346 130.031C130.906 129.811 132.443
+    129.454 133.94 128.965C136.186 128.372 138.24 128.506 140.56 127.913C141.621
+    127.647 143.541 126.994 143.541 126.994V125.961C142.356 124.785 141.51
+    123.204 140.266 122.097C136.876 119.139 133.264 116.447 129.461
+    114.045C127.426 112.735 124.808 111.885 122.649 110.769C121.868 110.374
+    120.558 110.181 120.099 109.524C119.022 107.943 118.121 106.248 117.412
+    104.471C115.475 100.744 113.684 96.944 112.042 93.0786C111.076 90.527
+    109.961 88.0344 108.702 85.6138C102.629 75.3049 93.8692 66.8402 83.3582
+    61.1245C80.7056 59.8389 77.8847 58.9342 74.9792 58.4372C73.3392 58.3683
+    71.7038 58.2396 70.0685 58.1753C69.0107 57.4823 68.0036 56.7147 67.055
+    55.8784C63.3202 53.5218 53.7009 48.4136 50.9493 55.1572C49.1807 59.4156
+    53.5677 63.6051 55.0836 65.7688C56.3514 67.2941 57.4683 68.9387 58.4187
+    70.6795C58.8781 71.7912 59.0067 72.9764 59.4707 74.1524C60.4281 77.1443
+    61.5648 80.0758 62.8746 82.931C63.5769 84.3429 64.3863 85.699 65.2956
+    86.9873C65.8238 87.7131 66.738 88.0347 66.9355 89.2199C66.2106 90.78 65.7036
+    92.4324 65.4288 94.1306C64.2846 97.7426 63.8637 101.545 64.19 105.32C64.5163
+    109.094 65.5835 112.768 67.3306 116.13C68.378 117.765 70.8678 121.372
+    74.2212 119.993C77.1658 118.817 76.5181 115.083 77.3633 111.812C77.5609
+    111.022 77.4276 110.503 77.8227 109.974V110.618C77.8227 110.618 79.4948
+    114.293 80.3217 116.171C82.5698 119.591 85.3631 122.618 88.5905
+    125.134C89.8767 126.245 90.9145 127.614 91.6361
+    129.153V130.339H93.1153C93.0837 129.805 92.9362 129.285 92.6832
+    128.815C92.4301 128.344 92.0775 127.935 91.6499 127.614C90.4391 126.367
+    89.33 125.024 88.3332 123.6C85.6231 119.742 83.234 115.669 81.1899
+    111.421C80.1655 109.34 79.2743 107.071 78.4337 104.99C78.0524 104.191
+    78.0524 102.983 77.4139 102.583C76.2312 103.981 75.2053 105.505 74.3544
+    107.126C73.3203 110.403 72.7195 113.8 72.5675 117.233C72.3148 117.301
+    72.4388 117.233 72.3148 117.366C70.2752 116.833 69.5586 114.61 68.8052
+    112.772C66.8219 107.009 66.6218 100.781 68.231 94.9023C68.6903 93.5242
+    70.5967 89.0821 69.825 87.7453C69.4391 86.4682 68.1666 85.7378 67.4638
+    84.7318C66.5711 83.3765 65.8024 81.9436 65.1669 80.4504C63.6372 76.7065
+    62.8701 72.5538 61.2117 68.8098C60.2956 67.0053 59.2292 65.2811 58.0236
+    63.6557C56.6915 62.031 55.5163 60.2837 54.514 58.4372C54.2707 58.0251
+    54.1215 57.5643 54.077 57.0878C54.0326 56.6113 54.0939 56.1309 54.2568
+    55.6809C54.2928 55.4547 54.4023 55.2467 54.5684 55.0889C54.7344 54.9312
+    54.9478 54.8325 55.1755 54.8081C56.0024 54.0731 58.3636 55.0056 59.1905
+    55.4099C61.4133 56.2841 63.5306 57.4059 65.5023 58.7541C66.421 59.4248
+    68.4974 61.1245 68.4974 61.1245H69.1176C71.2353 61.5839 73.624 61.2531
+    75.6085 61.8503C78.9646 62.967 82.1671 64.5011 85.1406 66.4165C93.9149
+    72.002 101.049 79.8174 105.812 89.0637C106.607 90.5842 106.942 91.9761
+    107.65 93.561C109.028 96.8133 110.764 100.125 112.152 103.3C113.372 106.43
+    114.951 109.408 116.856 112.175C117.848 113.553 121.822 114.293 123.609
+    115.023C125.17 115.557 126.703 116.17 128.202 116.86C130.453 118.239 132.7
+    119.842 134.822 121.367C135.879 122.162 139.191 123.815 139.388 125.143"
+    fill="#F3FDFF" />
+</svg>
diff --git a/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js b/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js
index afedb9e78f..4f8d79dbf4 100644
--- a/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js
+++ b/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js
@@ -6,6 +6,7 @@ import CouchDB from "./CouchDB.svelte"
 import S3 from "./S3.svelte"
 import Airtable from "./Airtable.svelte"
 import SqlServer from "./SQLServer.svelte"
+import MySQL from "./MySQL.svelte"
 
 export default {
   POSTGRES: Postgres,
@@ -16,4 +17,5 @@ export default {
   SQL_SERVER: SqlServer,
   S3: S3,
   AIRTABLE: Airtable,
+  MYSQL: MySQL,
 }
diff --git a/packages/builder/src/components/start/BuilderSettingsModal.svelte b/packages/builder/src/components/start/BuilderSettingsModal.svelte
index 57cdef0c29..6be420b5f9 100644
--- a/packages/builder/src/components/start/BuilderSettingsModal.svelte
+++ b/packages/builder/src/components/start/BuilderSettingsModal.svelte
@@ -1,6 +1,7 @@
 <script>
   import { notifier } from "builderStore/store/notifications"
   import { hostingStore } from "builderStore"
+  import { HostingTypes } from "constants/backend"
   import { Input, ModalContent, Toggle } from "@budibase/bbui"
   import ThemeEditor from "components/settings/ThemeEditor.svelte"
   import analytics from "analytics"
@@ -10,7 +11,7 @@
   let selfhosted = false
 
   async function save() {
-    hostingInfo.type = selfhosted ? "self" : "cloud"
+    hostingInfo.type = selfhosted ? HostingTypes.SELF : HostingTypes.CLOUD
     if (!selfhosted && hostingInfo._rev) {
       hostingInfo = {
         type: hostingInfo.type,
@@ -27,7 +28,7 @@
   }
 
   function updateSelfHosting(event) {
-    if (hostingInfo.type === "cloud" && event.target.checked) {
+    if (hostingInfo.type === HostingTypes.CLOUD && event.target.checked) {
       hostingInfo.hostingUrl = "localhost:10000"
       hostingInfo.useHttps = false
       hostingInfo.selfHostKey = "budibase"
diff --git a/packages/builder/src/constants/backend/index.js b/packages/builder/src/constants/backend/index.js
index bcbce153fe..80eaf613f8 100644
--- a/packages/builder/src/constants/backend/index.js
+++ b/packages/builder/src/constants/backend/index.js
@@ -87,3 +87,8 @@ export const FILE_TYPES = {
   CODE: ["js", "rs", "py", "java", "rb", "hs", "yml"],
   DOCUMENT: ["odf", "docx", "doc", "pdf", "csv"],
 }
+
+export const HostingTypes = {
+  CLOUD: "cloud",
+  SELF: "self",
+}
diff --git a/packages/builder/src/pages/[application]/deploy/index.svelte b/packages/builder/src/pages/[application]/deploy/index.svelte
index 462601ff48..47ae735af4 100644
--- a/packages/builder/src/pages/[application]/deploy/index.svelte
+++ b/packages/builder/src/pages/[application]/deploy/index.svelte
@@ -1,7 +1,7 @@
 <script>
   import { onMount } from "svelte"
   import { Button, Spacer, Modal } from "@budibase/bbui"
-  import { store } from "builderStore"
+  import { store, hostingStore } from "builderStore"
   import { notifier } from "builderStore/store/notifications"
   import api from "builderStore/api"
   import Spinner from "components/common/Spinner.svelte"
@@ -16,6 +16,8 @@
 
   $: appId = $store.appId
 
+  $: console.log($hostingStore)
+
   async function deployApp() {
     const DEPLOY_URL = `/api/deploy`
 
@@ -29,6 +31,7 @@
 
       analytics.captureEvent("Deployed App", {
         appId,
+        hostingType: $hostingStore.hostingInfo?.type,
       })
 
       if (analytics.requestFeedbackOnDeploy()) {
@@ -37,6 +40,7 @@
     } catch (err) {
       analytics.captureEvent("Deploy App Failed", {
         appId,
+        hostingType: $hostingStore.hostingInfo?.type,
       })
       analytics.captureException(err)
       notifier.danger("Deployment unsuccessful. Please try again later.")
diff --git a/packages/server/package.json b/packages/server/package.json
index 1b9973f12b..feefffb827 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -49,9 +49,9 @@
   "author": "Budibase",
   "license": "AGPL-3.0-or-later",
   "dependencies": {
-    "@elastic/elasticsearch": "^7.10.0",
     "@budibase/client": "^0.5.3",
     "@budibase/string-templates": "^0.5.3",
+    "@elastic/elasticsearch": "^7.10.0",
     "@koa/router": "^8.0.0",
     "@sendgrid/mail": "^7.1.1",
     "@sentry/node": "^5.19.2",
@@ -82,6 +82,7 @@
     "lodash": "^4.17.13",
     "mongodb": "^3.6.3",
     "mssql": "^6.2.3",
+    "mysql": "^2.18.1",
     "node-fetch": "^2.6.0",
     "open": "^7.3.0",
     "pg": "^8.5.1",
diff --git a/packages/server/src/integrations/index.js b/packages/server/src/integrations/index.js
index c23b8e8e83..acb81992a9 100644
--- a/packages/server/src/integrations/index.js
+++ b/packages/server/src/integrations/index.js
@@ -3,10 +3,10 @@ const dynamodb = require("./dynamodb")
 const mongodb = require("./mongodb")
 const elasticsearch = require("./elasticsearch")
 const couchdb = require("./couchdb")
-// const redis = require("./redis")
 const sqlServer = require("./microsoftSqlServer")
 const s3 = require("./s3")
 const airtable = require("./airtable")
+const mysql = require("./mysql")
 
 const DEFINITIONS = {
   POSTGRES: postgres.schema,
@@ -17,6 +17,7 @@ const DEFINITIONS = {
   SQL_SERVER: sqlServer.schema,
   S3: s3.schema,
   AIRTABLE: airtable.schema,
+  MYSQL: mysql.schema,
 }
 
 const INTEGRATIONS = {
@@ -28,6 +29,7 @@ const INTEGRATIONS = {
   S3: s3.integration,
   SQL_SERVER: sqlServer.integration,
   AIRTABLE: airtable.integration,
+  MYSQL: mysql.integration,
 }
 
 module.exports = {
diff --git a/packages/server/src/integrations/mysql.js b/packages/server/src/integrations/mysql.js
new file mode 100644
index 0000000000..f5ea1caaca
--- /dev/null
+++ b/packages/server/src/integrations/mysql.js
@@ -0,0 +1,80 @@
+const mysql = require("mysql")
+
+const SCHEMA = {
+  docs: "https://github.com/mysqljs/mysql",
+  datasource: {
+    host: {
+      type: "string",
+      default: "localhost",
+      required: true,
+    },
+    user: {
+      type: "string",
+      default: "root",
+      required: true,
+    },
+    password: {
+      type: "password",
+      default: "root",
+      required: true,
+    },
+    database: {
+      type: "string",
+      required: true,
+    },
+  },
+  query: {
+    create: {
+      type: "sql",
+    },
+    read: {
+      type: "sql",
+    },
+    update: {
+      type: "sql",
+    },
+    delete: {
+      type: "sql",
+    },
+  },
+}
+
+class MySQLIntegration {
+  constructor(config) {
+    this.config = config
+    this.client = mysql.createConnection(config)
+  }
+
+  query(query) {
+    // Node MySQL is callback based, so we must wrap our call in a promise
+    return new Promise((resolve, reject) => {
+      this.client.connect()
+      return this.client.query(query.sql, (error, results) => {
+        if (error) return reject(error)
+        resolve(results)
+        this.client.end()
+      })
+    })
+  }
+
+  create(query) {
+    return this.query(query)
+  }
+
+  read(query) {
+    return this.query(query)
+  }
+
+  update(query) {
+    return this.query(query)
+  }
+
+  delete(query) {
+    return this.query(query)
+  }
+}
+
+module.exports = {
+  schema: SCHEMA,
+  integration: MySQLIntegration,
+}
diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock
index 2bacb8b6cf..73c7a03e81 100644
--- a/packages/server/yarn.lock
+++ b/packages/server/yarn.lock
@@ -1788,6 +1788,11 @@ bcryptjs@^2.4.3:
   resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
   integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=
 
+bignumber.js@9.0.0:
+  version "9.0.0"
+  resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.0.0.tgz#805880f84a329b5eac6e7cb6f8274b6d82bdf075"
+  integrity sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==
+
 binary-extensions@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
@@ -6249,6 +6254,16 @@ mute-stream@0.0.8:
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
   integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
 
+mysql@^2.18.1:
+  version "2.18.1"
+  resolved "https://registry.yarnpkg.com/mysql/-/mysql-2.18.1.tgz#2254143855c5a8c73825e4522baf2ea021766717"
+  integrity sha512-Bca+gk2YWmqp2Uf6k5NFEurwY/0td0cpebAucFpY/3jhrwrVGuxU2uQFCHjU19SJfje0yQvi+rVWdq78hR5lig==
+  dependencies:
+    bignumber.js "9.0.0"
+    readable-stream "2.3.7"
+    safe-buffer "5.1.2"
+    sqlstring "2.3.1"
+
 nan@^2.12.1:
   version "2.14.1"
   resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
@@ -7363,17 +7378,7 @@ readable-stream@1.1.14, readable-stream@^1.0.27-1:
     string_decoder "^1.1.1"
     util-deprecate "^1.0.1"
 
-"readable-stream@>=1.0.33-1 <1.1.0-0":
-  version "1.0.34"
-  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
-  integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
-  dependencies:
-    core-util-is "~1.0.0"
-    inherits "~2.0.1"
-    isarray "0.0.1"
-    string_decoder "~0.10.x"
-
-readable-stream@^2.0.0, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6:
+readable-stream@2.3.7, readable-stream@^2.0.0, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.5, readable-stream@~2.3.6:
   version "2.3.7"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57"
   integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
@@ -7386,6 +7391,16 @@ readable-stream@^2.0.0, readable-stream@^2.2.2, readable-stream@^2.3.0, readable
     string_decoder "~1.1.1"
     util-deprecate "~1.0.1"
 
+"readable-stream@>=1.0.33-1 <1.1.0-0":
+  version "1.0.34"
+  resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c"
+  integrity sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=
+  dependencies:
+    core-util-is "~1.0.0"
+    inherits "~2.0.1"
+    isarray "0.0.1"
+    string_decoder "~0.10.x"
+
 readable-stream@~0.0.2:
   version "0.0.4"
   resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-0.0.4.tgz#f32d76e3fb863344a548d79923007173665b3b8d"
@@ -8071,6 +8086,11 @@ sprintf-js@~1.0.2:
   resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
   integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
 
+sqlstring@2.3.1:
+  version "2.3.1"
+  resolved "https://registry.yarnpkg.com/sqlstring/-/sqlstring-2.3.1.tgz#475393ff9e91479aea62dcaf0ca3d14983a7fb40"
+  integrity sha1-R1OT/56RR5rqYtyvDKPRSYOn+0A=
+
 sshpk@^1.7.0:
   version "1.16.1"
   resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"

From 75b5b0eb52e779570b6a5097f0cccd38fe3918a5 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney <martin@shogunsystems.co.uk>
Date: Tue, 26 Jan 2021 15:23:23 +0000
Subject: [PATCH 02/26] only allow read queries in datasources

---
 .../PropertyControls/TableViewSelect.svelte   |   2 +-
 .../components/integration/QueryViewer.svelte |   2 +-
 .../[selectedDatasource]/index.svelte         |   3 +-
 .../pages/[application]/deploy/index.svelte   |   2 -
 packages/server/yarn.lock                     | 895 +-----------------
 5 files changed, 10 insertions(+), 894 deletions(-)

diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/TableViewSelect.svelte b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/TableViewSelect.svelte
index 4e5201a180..6b3873a08c 100644
--- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/TableViewSelect.svelte
+++ b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/TableViewSelect.svelte
@@ -34,7 +34,7 @@
     }))
     return [...acc, ...viewsArr]
   }, [])
-  $: queries = $backendUiStore.queries.map(query => ({
+  $: queries = $backendUiStore.queries.filter(query => query.queryVerb === "read").map(query => ({
     label: query.name,
     name: query.name,
     tableId: query._id,
diff --git a/packages/builder/src/components/integration/QueryViewer.svelte b/packages/builder/src/components/integration/QueryViewer.svelte
index da5f4e1a40..485dbf7411 100644
--- a/packages/builder/src/components/integration/QueryViewer.svelte
+++ b/packages/builder/src/components/integration/QueryViewer.svelte
@@ -164,7 +164,7 @@
       <div class="viewer-controls">
         <Button
           blue
-          disabled={data.length === 0}
+          disabled={data.length === 0 || !query.name}
           on:click={saveQuery}>
           Save Query
         </Button>
diff --git a/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/index.svelte b/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/index.svelte
index 5f78bc9ce8..0482d5458e 100644
--- a/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/index.svelte
+++ b/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/index.svelte
@@ -51,7 +51,6 @@
           <div class="query-list-item" on:click={() => onClickQuery(query)}>
             <p class="query-name">{query.name}</p>
             <p>{query.queryVerb}</p>
-            <p>4000 records</p>
             <p>→</p>
           </div>
         {/each}
@@ -115,7 +114,7 @@
     background: var(--background);
     border: var(--border-grey);
     display: grid;
-    grid-template-columns: 2fr 0.75fr 0.75fr 1fr 20px;
+    grid-template-columns: 2fr 0.75fr 20px;
     align-items: center;
     padding: var(--spacing-m) var(--layout-xs);
     gap: var(--layout-xs);
diff --git a/packages/builder/src/pages/[application]/deploy/index.svelte b/packages/builder/src/pages/[application]/deploy/index.svelte
index b64424bf0d..c1f081f571 100644
--- a/packages/builder/src/pages/[application]/deploy/index.svelte
+++ b/packages/builder/src/pages/[application]/deploy/index.svelte
@@ -16,8 +16,6 @@
 
   $: appId = $store.appId
 
-  $: console.log($hostingStore)
-
   async function deployApp() {
     const DEPLOY_URL = `/api/deploy`
 
diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock
index 73c7a03e81..55450d3e0c 100644
--- a/packages/server/yarn.lock
+++ b/packages/server/yarn.lock
@@ -228,27 +228,6 @@
     lodash "^4.17.19"
     to-fast-properties "^2.0.0"
 
-"@budibase/client@^0.5.3":
-  version "0.5.3"
-  resolved "https://registry.yarnpkg.com/@budibase/client/-/client-0.5.3.tgz#d2406b9a5b25ac446ba0f776b0ef3a38777a131a"
-  integrity sha512-pv8pMH5vxgvIAEl+2zjp1ScWAtqVWqeH65e9EDqX6oVK2AsnJe9r0HxywOHN5mCgOFxou972+39c6fYR9/enyw==
-  dependencies:
-    deep-equal "^2.0.1"
-    mustache "^4.0.1"
-    regexparam "^1.3.0"
-    svelte-spa-router "^3.0.5"
-
-"@budibase/string-templates@^0.5.3":
-  version "0.5.3"
-  resolved "https://registry.yarnpkg.com/@budibase/string-templates/-/string-templates-0.5.3.tgz#749afa7cfa43455b730540c9b792d8f13f6b444d"
-  integrity sha512-kYmQO31bi8y7A2NLqlunpGnqNMxYwC9XI312vXezljR0TxJk2RDHQ0Q9tOJ536ac5V7aRkkCmS5/GznGeb0k+Q==
-  dependencies:
-    handlebars "^4.7.6"
-    handlebars-helpers "^0.10.0"
-    handlebars-utils "^1.0.6"
-    helper-date "^1.0.1"
-    lodash "^4.17.20"
-
 "@cnakazawa/watch@^1.0.3":
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a"
@@ -1194,130 +1173,6 @@ ansi-align@^3.0.0:
   dependencies:
     string-width "^3.0.0"
 
-ansi-bgblack@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz#a68ba5007887701b6aafbe3fa0dadfdfa8ee3ca2"
-  integrity sha1-poulAHiHcBtqr74/oNrf36juPKI=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-bgblue@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz#67bdc04edc9b9b5278969da196dea3d75c8c3613"
-  integrity sha1-Z73ATtybm1J4lp2hlt6j11yMNhM=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-bgcyan@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz#58489425600bde9f5507068dd969ebfdb50fe768"
-  integrity sha1-WEiUJWAL3p9VBwaN2Wnr/bUP52g=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-bggreen@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz#4e3191248529943f4321e96bf131d1c13816af49"
-  integrity sha1-TjGRJIUplD9DIelr8THRwTgWr0k=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-bgmagenta@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz#9b28432c076eaa999418672a3efbe19391c2c7a1"
-  integrity sha1-myhDLAduqpmUGGcqPvvhk5HCx6E=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-bgred@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-bgred/-/ansi-bgred-0.1.1.tgz#a76f92838382ba43290a6c1778424f984d6f1041"
-  integrity sha1-p2+Sg4OCukMpCmwXeEJPmE1vEEE=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-bgwhite@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz#6504651377a58a6ececd0331994e480258e11ba8"
-  integrity sha1-ZQRlE3elim7OzQMxmU5IAljhG6g=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-bgyellow@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz#c3fe2eb08cd476648029e6874d15a0b38f61d44f"
-  integrity sha1-w/4usIzUdmSAKeaHTRWgs49h1E8=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-black@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-black/-/ansi-black-0.1.1.tgz#f6185e889360b2545a1ec50c0bf063fc43032453"
-  integrity sha1-9hheiJNgslRaHsUMC/Bj/EMDJFM=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-blue@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-blue/-/ansi-blue-0.1.1.tgz#15b804990e92fc9ca8c5476ce8f699777c21edbf"
-  integrity sha1-FbgEmQ6S/JyoxUds6PaZd3wh7b8=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-bold@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-bold/-/ansi-bold-0.1.1.tgz#3e63950af5acc2ae2e670e6f67deb115d1a5f505"
-  integrity sha1-PmOVCvWswq4uZw5vZ96xFdGl9QU=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-colors@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-0.2.0.tgz#72c31de2a0d9a2ccd0cac30cc9823eeb2f6434b5"
-  integrity sha1-csMd4qDZoszQysMMyYI+6y9kNLU=
-  dependencies:
-    ansi-bgblack "^0.1.1"
-    ansi-bgblue "^0.1.1"
-    ansi-bgcyan "^0.1.1"
-    ansi-bggreen "^0.1.1"
-    ansi-bgmagenta "^0.1.1"
-    ansi-bgred "^0.1.1"
-    ansi-bgwhite "^0.1.1"
-    ansi-bgyellow "^0.1.1"
-    ansi-black "^0.1.1"
-    ansi-blue "^0.1.1"
-    ansi-bold "^0.1.1"
-    ansi-cyan "^0.1.1"
-    ansi-dim "^0.1.1"
-    ansi-gray "^0.1.1"
-    ansi-green "^0.1.1"
-    ansi-grey "^0.1.1"
-    ansi-hidden "^0.1.1"
-    ansi-inverse "^0.1.1"
-    ansi-italic "^0.1.1"
-    ansi-magenta "^0.1.1"
-    ansi-red "^0.1.1"
-    ansi-reset "^0.1.1"
-    ansi-strikethrough "^0.1.1"
-    ansi-underline "^0.1.1"
-    ansi-white "^0.1.1"
-    ansi-yellow "^0.1.1"
-    lazy-cache "^2.0.1"
-
-ansi-cyan@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-cyan/-/ansi-cyan-0.1.1.tgz#538ae528af8982f28ae30d86f2f17456d2609873"
-  integrity sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-dim@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-dim/-/ansi-dim-0.1.1.tgz#40de4c603aa8086d8e7a86b8ff998d5c36eefd6c"
-  integrity sha1-QN5MYDqoCG2Oeoa4/5mNXDbu/Ww=
-  dependencies:
-    ansi-wrap "0.1.0"
-
 ansi-escapes@^3.0.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
@@ -1330,62 +1185,6 @@ ansi-escapes@^4.2.1:
   dependencies:
     type-fest "^0.11.0"
 
-ansi-gray@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
-  integrity sha1-KWLPVOyXksSFEKPetSRDaGHvclE=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-green@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-green/-/ansi-green-0.1.1.tgz#8a5d9a979e458d57c40e33580b37390b8e10d0f7"
-  integrity sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-grey@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-grey/-/ansi-grey-0.1.1.tgz#59d98b6ac2ba19f8a51798e9853fba78339a33c1"
-  integrity sha1-WdmLasK6GfilF5jphT+6eDOaM8E=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-hidden@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-hidden/-/ansi-hidden-0.1.1.tgz#ed6a4c498d2bb7cbb289dbf2a8d1dcc8567fae0f"
-  integrity sha1-7WpMSY0rt8uyidvyqNHcyFZ/rg8=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-inverse@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-inverse/-/ansi-inverse-0.1.1.tgz#b6af45826fe826bfb528a6c79885794355ccd269"
-  integrity sha1-tq9Fgm/oJr+1KKbHmIV5Q1XM0mk=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-italic@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-italic/-/ansi-italic-0.1.1.tgz#104743463f625c142a036739cf85eda688986f23"
-  integrity sha1-EEdDRj9iXBQqA2c5z4XtpoiYbyM=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-magenta@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-magenta/-/ansi-magenta-0.1.1.tgz#063b5ba16fb3f23e1cfda2b07c0a89de11e430ae"
-  integrity sha1-BjtboW+z8j4c/aKwfAqJ3hHkMK4=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-red@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-red/-/ansi-red-0.1.1.tgz#8c638f9d1080800a353c9c28c8a81ca4705d946c"
-  integrity sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=
-  dependencies:
-    ansi-wrap "0.1.0"
-
 ansi-regex@^2.0.0:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
@@ -1406,20 +1205,6 @@ ansi-regex@^5.0.0:
   resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
   integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
 
-ansi-reset@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-reset/-/ansi-reset-0.1.1.tgz#e7e71292c3c7ddcd4d62ef4a6c7c05980911c3b7"
-  integrity sha1-5+cSksPH3c1NYu9KbHwFmAkRw7c=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-strikethrough@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz#d84877140b2cff07d1c93ebce69904f68885e568"
-  integrity sha1-2Eh3FAss/wfRyT685pkE9oiF5Wg=
-  dependencies:
-    ansi-wrap "0.1.0"
-
 ansi-styles@^3.2.0, ansi-styles@^3.2.1:
   version "3.2.1"
   resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@@ -1434,32 +1219,6 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
   dependencies:
     color-convert "^2.0.1"
 
-ansi-underline@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-underline/-/ansi-underline-0.1.1.tgz#dfc920f4c97b5977ea162df8ffb988308aaa71a4"
-  integrity sha1-38kg9Ml7WXfqFi34/7mIMIqqcaQ=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-white@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-white/-/ansi-white-0.1.1.tgz#9c77b7c193c5ee992e6011d36ec4c921b4578944"
-  integrity sha1-nHe3wZPF7pkuYBHTbsTJIbRXiUQ=
-  dependencies:
-    ansi-wrap "0.1.0"
-
-ansi-wrap@0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf"
-  integrity sha1-qCJQ3bABXponyoLoLqYDu/pF768=
-
-ansi-yellow@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/ansi-yellow/-/ansi-yellow-0.1.1.tgz#cb9356f2f46c732f0e3199e6102955a77da83c1d"
-  integrity sha1-y5NW8vRscy8OMZnmEClVp32oPB0=
-  dependencies:
-    ansi-wrap "0.1.0"
-
 any-base@^1.1.0:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/any-base/-/any-base-1.1.0.tgz#ae101a62bc08a597b4c9ab5b7089d456630549fe"
@@ -1526,7 +1285,7 @@ archive-type@^4.0.0:
   dependencies:
     file-type "^4.2.0"
 
-argparse@^1.0.10, argparse@^1.0.7:
+argparse@^1.0.7:
   version "1.0.10"
   resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
   integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
@@ -1568,20 +1327,6 @@ 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-sort@^0.1.4:
-  version "0.1.4"
-  resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-0.1.4.tgz#662855eaeb671b4188df4451b2f24a0753992b23"
-  integrity sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ==
-  dependencies:
-    default-compare "^1.0.0"
-    get-value "^2.0.6"
-    kind-of "^5.0.2"
-
 array-unique@^0.3.2:
   version "0.3.2"
   resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
@@ -1659,20 +1404,6 @@ atomic-sleep@^1.0.0:
   resolved "https://registry.yarnpkg.com/atomic-sleep/-/atomic-sleep-1.0.0.tgz#eb85b77a601fc932cfe432c5acd364a9e2c9075b"
   integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==
 
-autolinker@~0.28.0:
-  version "0.28.1"
-  resolved "https://registry.yarnpkg.com/autolinker/-/autolinker-0.28.1.tgz#0652b491881879f0775dace0cdca3233942a4e47"
-  integrity sha1-BlK0kYgYefB3XazgzcoyM5QqTkc=
-  dependencies:
-    gulp-header "^1.7.1"
-
-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-sdk@^2.767.0:
   version "2.771.0"
   resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.771.0.tgz#ff4beb0a04d6ab1ae962c85dfb42e3e9bfe2b93b"
@@ -2070,14 +1801,6 @@ cacheable-request@^6.0.0:
     normalize-url "^4.1.0"
     responselike "^1.0.2"
 
-call-bind@^1.0.0, call-bind@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
-  integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
-  dependencies:
-    function-bind "^1.1.1"
-    get-intrinsic "^1.0.2"
-
 callsites@^3.0.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
@@ -2333,13 +2056,6 @@ concat-stream@^1.6.2:
     readable-stream "^2.2.2"
     typedarray "^0.0.6"
 
-concat-with-sourcemaps@*:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz#d4ea93f05ae25790951b99e7b3b09e3908a4082e"
-  integrity sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==
-  dependencies:
-    source-map "^0.6.1"
-
 config-chain@^1.1.11:
   version "1.1.12"
   resolved "https://registry.yarnpkg.com/config-chain/-/config-chain-1.1.12.tgz#0fde8d091200eb5e808caf25fe618c02f48e4efa"
@@ -2419,16 +2135,6 @@ crc@^3.4.4:
   dependencies:
     buffer "^5.1.0"
 
-create-frame@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/create-frame/-/create-frame-1.0.0.tgz#8b95f2691e3249b6080443e33d0bad9f8f6975aa"
-  integrity sha1-i5XyaR4ySbYIBEPjPQutn49pdao=
-  dependencies:
-    define-property "^0.2.5"
-    extend-shallow "^2.0.1"
-    isobject "^3.0.0"
-    lazy-cache "^2.0.2"
-
 cross-spawn@^4.0.0:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
@@ -2495,13 +2201,6 @@ date-utils@*:
   resolved "https://registry.yarnpkg.com/date-utils/-/date-utils-1.2.21.tgz#61fb16cdc1274b3c9acaaffe9fc69df8720a2b64"
   integrity sha1-YfsWzcEnSzyayq/+n8ad+HIKK2Q=
 
-date.js@^0.3.1:
-  version "0.3.3"
-  resolved "https://registry.yarnpkg.com/date.js/-/date.js-0.3.3.tgz#ef1e92332f507a638795dbb985e951882e50bbda"
-  integrity sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw==
-  dependencies:
-    debug "~3.1.0"
-
 dateformat@^3.0.3:
   version "3.0.3"
   resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
@@ -2612,27 +2311,6 @@ decompress@^4.2.1:
     pify "^2.3.0"
     strip-dirs "^2.0.0"
 
-deep-equal@^2.0.1:
-  version "2.0.5"
-  resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-2.0.5.tgz#55cd2fe326d83f9cbf7261ef0e060b3f724c5cb9"
-  integrity sha512-nPiRgmbAtm1a3JsnLCf6/SLfXcjyN5v8L1TXzdCmHrXJ4hx+gW/w1YCcn7z8gJtSiDArZCgYtbao3QqLm/N1Sw==
-  dependencies:
-    call-bind "^1.0.0"
-    es-get-iterator "^1.1.1"
-    get-intrinsic "^1.0.1"
-    is-arguments "^1.0.4"
-    is-date-object "^1.0.2"
-    is-regex "^1.1.1"
-    isarray "^2.0.5"
-    object-is "^1.1.4"
-    object-keys "^1.1.1"
-    object.assign "^4.1.2"
-    regexp.prototype.flags "^1.3.0"
-    side-channel "^1.0.3"
-    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"
@@ -2653,13 +2331,6 @@ deepmerge@^4.2.2:
   resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
   integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
 
-default-compare@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/default-compare/-/default-compare-1.0.0.tgz#cb61131844ad84d84788fb68fd01681ca7781a2f"
-  integrity sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==
-  dependencies:
-    kind-of "^5.0.2"
-
 default-shell@^1.0.0:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/default-shell/-/default-shell-1.0.1.tgz#752304bddc6174f49eb29cb988feea0b8813c8bc"
@@ -3007,11 +2678,6 @@ ensure-error@^2.0.0:
   resolved "https://registry.yarnpkg.com/ensure-error/-/ensure-error-2.1.0.tgz#f11fbe383c0cf4a54850ac77acceb7bc06e0f99d"
   integrity sha512-+BMSJHw9gxiJAAp2ZR1E0TNcL09dD3lOvkl7WVm4+Y6xnes/pMetP/TzCHiDduh8ihNDjbGfuYxl7l4PA1xZ8A==
 
-ent@^2.2.0:
-  version "2.2.0"
-  resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
-  integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0=
-
 env-paths@^2.2.0:
   version "2.2.0"
   resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43"
@@ -3031,11 +2697,6 @@ error-ex@^1.3.1:
   dependencies:
     is-arrayish "^0.2.1"
 
-error-symbol@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/error-symbol/-/error-symbol-0.1.0.tgz#0a4dae37d600d15a29ba453d8ef920f1844333f6"
-  integrity sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y=
-
 es-abstract@^1.17.0-next.1, es-abstract@^1.17.2, es-abstract@^1.17.5:
   version "1.17.7"
   resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.7.tgz#a4de61b2f66989fc7421676c1cb9787573ace54c"
@@ -3071,40 +2732,6 @@ es-abstract@^1.18.0-next.0:
     string.prototype.trimend "^1.0.1"
     string.prototype.trimstart "^1.0.1"
 
-es-abstract@^1.18.0-next.1:
-  version "1.18.0-next.2"
-  resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.2.tgz#088101a55f0541f595e7e057199e27ddc8f3a5c2"
-  integrity sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==
-  dependencies:
-    call-bind "^1.0.2"
-    es-to-primitive "^1.2.1"
-    function-bind "^1.1.1"
-    get-intrinsic "^1.0.2"
-    has "^1.0.3"
-    has-symbols "^1.0.1"
-    is-callable "^1.2.2"
-    is-negative-zero "^2.0.1"
-    is-regex "^1.1.1"
-    object-inspect "^1.9.0"
-    object-keys "^1.1.1"
-    object.assign "^4.1.2"
-    string.prototype.trimend "^1.0.3"
-    string.prototype.trimstart "^1.0.3"
-
-es-get-iterator@^1.1.1:
-  version "1.1.1"
-  resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.1.tgz#b93ddd867af16d5118e00881396533c1c6647ad9"
-  integrity sha512-qorBw8Y7B15DVLaJWy6WdEV/ZkieBcu6QCq/xzWzGOKJqgG1j754vXRfZ3NY7HSShneqU43mPB4OkQBTkvHhFw==
-  dependencies:
-    call-bind "^1.0.0"
-    get-intrinsic "^1.0.1"
-    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"
@@ -3474,13 +3101,6 @@ falafel@^1.0.1:
     isarray "0.0.1"
     object-keys "^1.0.6"
 
-"falsey@^0.3.2":
-  version "0.3.2"
-  resolved "https://registry.yarnpkg.com/falsey/-/falsey-0.3.2.tgz#b21c90c5c34660fc192bf909575db95b6880d597"
-  integrity sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg==
-  dependencies:
-    kind-of "^5.0.2"
-
 fast-deep-equal@^3.1.1:
   version "3.1.3"
   resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@@ -3669,18 +3289,11 @@ follow-redirects@1.5.10:
   dependencies:
     debug "=3.1.0"
 
-for-in@^1.0.1, for-in@^1.0.2:
+for-in@^1.0.2:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
   integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=
 
-for-own@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b"
-  integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=
-  dependencies:
-    for-in "^1.0.1"
-
 foreach@^2.0.5:
   version "2.0.5"
   resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
@@ -3739,11 +3352,6 @@ fs-constants@^1.0.0:
   resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
   integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
 
-fs-exists-sync@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
-  integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=
-
 fs-extra@^8.1.0:
   version "8.1.0"
   resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
@@ -3801,23 +3409,6 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5:
   resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e"
   integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
 
-get-intrinsic@^1.0.1, get-intrinsic@^1.0.2:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.0.2.tgz#6820da226e50b24894e08859469dc68361545d49"
-  integrity sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==
-  dependencies:
-    function-bind "^1.1.1"
-    has "^1.0.3"
-    has-symbols "^1.0.1"
-
-get-object@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/get-object/-/get-object-0.2.0.tgz#d92ff7d5190c64530cda0543dac63a3d47fe8c0c"
-  integrity sha1-2S/31RkMZFMM2gVD2sY6PUf+jAw=
-  dependencies:
-    is-number "^2.0.2"
-    isobject "^0.2.0"
-
 get-stream@3.0.0, get-stream@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14"
@@ -4002,77 +3593,6 @@ growly@^1.3.0:
   resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
   integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=
 
-gulp-header@^1.7.1:
-  version "1.8.12"
-  resolved "https://registry.yarnpkg.com/gulp-header/-/gulp-header-1.8.12.tgz#ad306be0066599127281c4f8786660e705080a84"
-  integrity sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==
-  dependencies:
-    concat-with-sourcemaps "*"
-    lodash.template "^4.4.0"
-    through2 "^2.0.0"
-
-handlebars-helper-create-frame@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/handlebars-helper-create-frame/-/handlebars-helper-create-frame-0.1.0.tgz#8aa51d10aeb6408fcc6605d40d77356288487a03"
-  integrity sha1-iqUdEK62QI/MZgXUDXc1YohIegM=
-  dependencies:
-    create-frame "^1.0.0"
-    isobject "^3.0.0"
-
-handlebars-helpers@^0.10.0:
-  version "0.10.0"
-  resolved "https://registry.yarnpkg.com/handlebars-helpers/-/handlebars-helpers-0.10.0.tgz#663d49e718928eafbead1473419ed7bc24bcd45a"
-  integrity sha512-QiyhQz58u/DbuV41VnfpE0nhy6YCH4vB514ajysV8SoKmP+DxU+pR+fahVyNECHj+jiwEN2VrvxD/34/yHaLUg==
-  dependencies:
-    arr-flatten "^1.1.0"
-    array-sort "^0.1.4"
-    create-frame "^1.0.0"
-    define-property "^1.0.0"
-    "falsey" "^0.3.2"
-    for-in "^1.0.2"
-    for-own "^1.0.0"
-    get-object "^0.2.0"
-    get-value "^2.0.6"
-    handlebars "^4.0.11"
-    handlebars-helper-create-frame "^0.1.0"
-    handlebars-utils "^1.0.6"
-    has-value "^1.0.0"
-    helper-date "^1.0.1"
-    helper-markdown "^1.0.0"
-    helper-md "^0.2.2"
-    html-tag "^2.0.0"
-    is-even "^1.0.0"
-    is-glob "^4.0.0"
-    is-number "^4.0.0"
-    kind-of "^6.0.0"
-    lazy-cache "^2.0.2"
-    logging-helpers "^1.0.0"
-    micromatch "^3.1.4"
-    relative "^3.0.2"
-    striptags "^3.1.0"
-    to-gfm-code-block "^0.1.1"
-    year "^0.2.1"
-
-handlebars-utils@^1.0.2, handlebars-utils@^1.0.4, handlebars-utils@^1.0.6:
-  version "1.0.6"
-  resolved "https://registry.yarnpkg.com/handlebars-utils/-/handlebars-utils-1.0.6.tgz#cb9db43362479054782d86ffe10f47abc76357f9"
-  integrity sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw==
-  dependencies:
-    kind-of "^6.0.0"
-    typeof-article "^0.1.1"
-
-handlebars@^4.0.11, handlebars@^4.7.6:
-  version "4.7.6"
-  resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.6.tgz#d4c05c1baf90e9945f77aa68a7a219aa4a7df74e"
-  integrity sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==
-  dependencies:
-    minimist "^1.2.5"
-    neo-async "^2.6.0"
-    source-map "^0.6.1"
-    wordwrap "^1.0.0"
-  optionalDependencies:
-    uglify-js "^3.1.4"
-
 har-schema@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
@@ -4156,39 +3676,6 @@ has@^1.0.3:
   dependencies:
     function-bind "^1.1.1"
 
-helper-date@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/helper-date/-/helper-date-1.0.1.tgz#12fedea3ad8e44a7ca4c4efb0ff4104a5120cffb"
-  integrity sha512-wU3VOwwTJvGr/w5rZr3cprPHO+hIhlblTJHD6aFBrKLuNbf4lAmkawd2iK3c6NbJEvY7HAmDpqjOFSI5/+Ey2w==
-  dependencies:
-    date.js "^0.3.1"
-    handlebars-utils "^1.0.4"
-    moment "^2.18.1"
-
-helper-markdown@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/helper-markdown/-/helper-markdown-1.0.0.tgz#ee7e9fc554675007d37eb90f7853b13ce74f3e10"
-  integrity sha512-AnDqMS4ejkQK0MXze7pA9TM3pu01ZY+XXsES6gEE0RmCGk5/NIfvTn0NmItfyDOjRAzyo9z6X7YHbHX4PzIvOA==
-  dependencies:
-    handlebars-utils "^1.0.2"
-    highlight.js "^9.12.0"
-    remarkable "^1.7.1"
-
-helper-md@^0.2.2:
-  version "0.2.2"
-  resolved "https://registry.yarnpkg.com/helper-md/-/helper-md-0.2.2.tgz#c1f59d7e55bbae23362fd8a0e971607aec69d41f"
-  integrity sha1-wfWdflW7riM2L9ig6XFgeuxp1B8=
-  dependencies:
-    ent "^2.2.0"
-    extend-shallow "^2.0.1"
-    fs-exists-sync "^0.1.0"
-    remarkable "^1.6.2"
-
-highlight.js@^9.12.0:
-  version "9.18.5"
-  resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.5.tgz#d18a359867f378c138d6819edfc2a8acd5f29825"
-  integrity sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==
-
 hosted-git-info@^2.1.4:
   version "2.8.8"
   resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488"
@@ -4218,14 +3705,6 @@ html-escaper@^2.0.0:
   resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
   integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
 
-html-tag@^2.0.0:
-  version "2.0.0"
-  resolved "https://registry.yarnpkg.com/html-tag/-/html-tag-2.0.0.tgz#36c3bc8d816fd30b570d5764a497a641640c2fed"
-  integrity sha512-XxzooSo6oBoxBEUazgjdXj7VwTn/iSTSZzTYKzYY6I916tkaYzypHxy+pbVU1h+0UQ9JlVf5XkNQyxOAiiQO1g==
-  dependencies:
-    is-self-closing "^1.0.1"
-    kind-of "^6.0.0"
-
 http-assert@^1.3.0:
   version "1.4.1"
   resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.4.1.tgz#c5f725d677aa7e873ef736199b89686cceb37878"
@@ -4383,11 +3862,6 @@ inflight@^1.0.4:
     once "^1.3.0"
     wrappy "1"
 
-info-symbol@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/info-symbol/-/info-symbol-0.1.0.tgz#27841d72867ddb4242cd612d79c10633881c6a78"
-  integrity sha1-J4QdcoZ920JCzWEtecEGM4gcang=
-
 inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
@@ -4459,23 +3933,11 @@ is-accessor-descriptor@^1.0.0:
   dependencies:
     kind-of "^6.0.0"
 
-is-arguments@^1.0.4:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.0.tgz#62353031dfbee07ceb34656a6bde59efecae8dd9"
-  integrity sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==
-  dependencies:
-    call-bind "^1.0.0"
-
 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.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2"
-  integrity sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==
-
 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"
@@ -4483,13 +3945,6 @@ is-binary-path@~2.1.0:
   dependencies:
     binary-extensions "^2.0.0"
 
-is-boolean-object@^1.1.0:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0"
-  integrity sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==
-  dependencies:
-    call-bind "^1.0.0"
-
 is-buffer@^1.1.5:
   version "1.1.6"
   resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
@@ -4526,7 +3981,7 @@ is-data-descriptor@^1.0.0:
   dependencies:
     kind-of "^6.0.0"
 
-is-date-object@^1.0.1, is-date-object@^1.0.2:
+is-date-object@^1.0.1:
   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==
@@ -4554,13 +4009,6 @@ is-docker@^2.0.0:
   resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156"
   integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==
 
-is-even@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/is-even/-/is-even-1.0.0.tgz#76b5055fbad8d294a86b6a949015e1c97b717c06"
-  integrity sha1-drUFX7rY0pSoa2qUkBXhyXtxfAY=
-  dependencies:
-    is-odd "^0.1.2"
-
 is-extendable@^0.1.0, is-extendable@^0.1.1:
   version "0.1.1"
   resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89"
@@ -4618,11 +4066,6 @@ 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.2"
-  resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127"
-  integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==
-
 is-natural-number@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/is-natural-number/-/is-natural-number-4.0.1.tgz#ab9d76e1db4ced51e35de0c72ebecf09f734cde8"
@@ -4633,28 +4076,11 @@ is-negative-zero@^2.0.0:
   resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461"
   integrity sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=
 
-is-negative-zero@^2.0.1:
-  version "2.0.1"
-  resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24"
-  integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==
-
 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.4:
-  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@^2.0.2:
-  version "2.1.0"
-  resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f"
-  integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=
-  dependencies:
-    kind-of "^3.0.2"
-
 is-number@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195"
@@ -4662,11 +4088,6 @@ is-number@^3.0.0:
   dependencies:
     kind-of "^3.0.2"
 
-is-number@^4.0.0:
-  version "4.0.0"
-  resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff"
-  integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==
-
 is-number@^7.0.0:
   version "7.0.0"
   resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
@@ -4682,13 +4103,6 @@ is-object@^1.0.1:
   resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470"
   integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA=
 
-is-odd@^0.1.2:
-  version "0.1.2"
-  resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-0.1.2.tgz#bc573b5ce371ef2aad6e6f49799b72bef13978a7"
-  integrity sha1-vFc7XONx7yqtbm9JeZtyvvE5eKc=
-  dependencies:
-    is-number "^3.0.0"
-
 is-path-inside@^3.0.1:
   version "3.0.2"
   resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017"
@@ -4718,29 +4132,12 @@ is-retry-allowed@^1.1.0:
   resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
   integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
 
-is-self-closing@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/is-self-closing/-/is-self-closing-1.0.1.tgz#5f406b527c7b12610176320338af0fa3896416e4"
-  integrity sha512-E+60FomW7Blv5GXTlYee2KDrnG6srxF7Xt1SjrhWUGUEsTFIqY/nq2y3DaftCsgUMdh89V07IVfhY9KIJhLezg==
-  dependencies:
-    self-closing-tags "^1.0.1"
-
-is-set@^2.0.1:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec"
-  integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==
-
 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.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, is-symbol@^1.0.3:
+is-symbol@^1.0.2:
   version "1.0.3"
   resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937"
   integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==
@@ -4756,17 +4153,6 @@ 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.4"
-  resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.4.tgz#1f66f34a283a3c94a4335434661ca53fff801120"
-  integrity sha512-ILaRgn4zaSrVNXNGtON6iFNotXW3hAPF3+0fB1usg2jFlWqo5fEDdmJkz0zBfoi7Dgskr8Khi2xZ8cXqZEfXNA==
-  dependencies:
-    available-typed-arrays "^1.0.2"
-    call-bind "^1.0.0"
-    es-abstract "^1.18.0-next.1"
-    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"
@@ -4777,16 +4163,6 @@ is-utf8@^0.2.0:
   resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
   integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
 
-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"
@@ -4819,11 +4195,6 @@ isarray@1.0.0, 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"
@@ -4834,11 +4205,6 @@ isexe@^2.0.0:
   resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
   integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
 
-isobject@^0.2.0:
-  version "0.2.0"
-  resolved "https://registry.yarnpkg.com/isobject/-/isobject-0.2.0.tgz#a3432192f39b910b5f02cc989487836ec70aa85e"
-  integrity sha1-o0MhkvObkQtfAsyYlIeDbscKqF4=
-
 isobject@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
@@ -5517,7 +4883,7 @@ keyv@^3.0.0:
   dependencies:
     json-buffer "3.0.0"
 
-kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.1.0, kind-of@^3.2.0:
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
   version "3.2.2"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
   integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
@@ -5531,7 +4897,7 @@ kind-of@^4.0.0:
   dependencies:
     is-buffer "^1.1.5"
 
-kind-of@^5.0.0, kind-of@^5.0.2:
+kind-of@^5.0.0:
   version "5.1.0"
   resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
   integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
@@ -5661,13 +5027,6 @@ latest-version@^5.0.0:
   dependencies:
     package-json "^6.3.0"
 
-lazy-cache@^2.0.1, lazy-cache@^2.0.2:
-  version "2.0.2"
-  resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264"
-  integrity sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=
-  dependencies:
-    set-getter "^0.1.0"
-
 lazy-val@^1.0.4:
   version "1.0.4"
   resolved "https://registry.yarnpkg.com/lazy-val/-/lazy-val-1.0.4.tgz#882636a7245c2cfe6e0a4e3ba6c5d68a137e5c65"
@@ -5846,11 +5205,6 @@ locate-path@^5.0.0:
   dependencies:
     p-locate "^4.1.0"
 
-lodash._reinterpolate@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
-  integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=
-
 lodash.debounce@^4.0.8:
   version "4.0.8"
   resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
@@ -5921,21 +5275,6 @@ lodash.sortby@^4.7.0:
   resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
   integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
 
-lodash.template@^4.4.0:
-  version "4.5.0"
-  resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab"
-  integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==
-  dependencies:
-    lodash._reinterpolate "^3.0.0"
-    lodash.templatesettings "^4.0.0"
-
-lodash.templatesettings@^4.0.0:
-  version "4.2.0"
-  resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33"
-  integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==
-  dependencies:
-    lodash._reinterpolate "^3.0.0"
-
 lodash.without@^4.4.0:
   version "4.4.0"
   resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac"
@@ -5946,40 +5285,11 @@ lodash.xor@^4.5.0:
   resolved "https://registry.yarnpkg.com/lodash.xor/-/lodash.xor-4.5.0.tgz#4d48ed7e98095b0632582ba714d3ff8ae8fb1db6"
   integrity sha1-TUjtfpgJWwYyWCunFNP/iuj7HbY=
 
-lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.3:
+lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.3:
   version "4.17.20"
   resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
   integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
 
-log-ok@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/log-ok/-/log-ok-0.1.1.tgz#bea3dd36acd0b8a7240d78736b5b97c65444a334"
-  integrity sha1-vqPdNqzQuKckDXhza1uXxlREozQ=
-  dependencies:
-    ansi-green "^0.1.1"
-    success-symbol "^0.1.0"
-
-log-utils@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/log-utils/-/log-utils-0.2.1.tgz#a4c217a0dd9a50515d9b920206091ab3d4e031cf"
-  integrity sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=
-  dependencies:
-    ansi-colors "^0.2.0"
-    error-symbol "^0.1.0"
-    info-symbol "^0.1.0"
-    log-ok "^0.1.1"
-    success-symbol "^0.1.0"
-    time-stamp "^1.0.1"
-    warning-symbol "^0.1.0"
-
-logging-helpers@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/logging-helpers/-/logging-helpers-1.0.0.tgz#b5a37b32ad53eb0137c58c7898a47b175ddb7c36"
-  integrity sha512-qyIh2goLt1sOgQQrrIWuwkRjUx4NUcEqEGAcYqD8VOnOC6ItwkrVE8/tA4smGpjzyp4Svhc6RodDp9IO5ghpyA==
-  dependencies:
-    isobject "^3.0.0"
-    log-utils "^0.2.1"
-
 loose-envify@^1.0.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
@@ -6202,11 +5512,6 @@ mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.4:
   dependencies:
     minimist "^1.2.5"
 
-moment@^2.18.1:
-  version "2.29.1"
-  resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
-  integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
-
 mongodb@^3.6.3:
   version "3.6.3"
   resolved "https://registry.yarnpkg.com/mongodb/-/mongodb-3.6.3.tgz#eddaed0cc3598474d7a15f0f2a5b04848489fd05"
@@ -6244,11 +5549,6 @@ mssql@^6.2.3:
     tarn "^1.1.5"
     tedious "^6.6.2"
 
-mustache@^4.0.1:
-  version "4.1.0"
-  resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.1.0.tgz#8c1b042238a982d2eb2d30efc6c14296ae3f699d"
-  integrity sha512-0FsgP/WVq4mKyjolIyX+Z9Bd+3WS8GOwoUTyKXT5cTYMGeauNTi2HPCwERqseC1IHAy0Z7MDZnJBfjabd4O8GQ==
-
 mute-stream@0.0.8:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
@@ -6316,11 +5616,6 @@ negotiator@0.6.2:
   resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
   integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
 
-neo-async@^2.6.0:
-  version "2.6.2"
-  resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
-  integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
-
 new-github-issue-url@^0.2.1:
   version "0.2.1"
   resolved "https://registry.yarnpkg.com/new-github-issue-url/-/new-github-issue-url-0.2.1.tgz#e17be1f665a92de465926603e44b9f8685630c1d"
@@ -6475,19 +5770,6 @@ object-inspect@^1.8.0:
   resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.8.0.tgz#df807e5ecf53a609cc6bfe93eac3cc7be5b3a9d0"
   integrity sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==
 
-object-inspect@^1.9.0:
-  version "1.9.0"
-  resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a"
-  integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==
-
-object-is@^1.1.4:
-  version "1.1.4"
-  resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.4.tgz#63d6c83c00a43f4cbc9434eb9757c8a5b8565068"
-  integrity sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==
-  dependencies:
-    call-bind "^1.0.0"
-    define-properties "^1.1.3"
-
 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"
@@ -6510,16 +5792,6 @@ object.assign@^4.1.1:
     has-symbols "^1.0.1"
     object-keys "^1.1.1"
 
-object.assign@^4.1.2:
-  version "4.1.2"
-  resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
-  integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
-  dependencies:
-    call-bind "^1.0.0"
-    define-properties "^1.1.3"
-    has-symbols "^1.0.1"
-    object-keys "^1.1.1"
-
 object.getownpropertydescriptors@^2.1.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz#369bf1f9592d8ab89d712dced5cb81c7c5352649"
@@ -7453,19 +6725,6 @@ 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.1"
-  resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz#7ef352ae8d159e758c0eadca6f8fcb4eef07be26"
-  integrity sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==
-  dependencies:
-    call-bind "^1.0.2"
-    define-properties "^1.1.3"
-
-regexparam@1.3.0, 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"
@@ -7485,21 +6744,6 @@ registry-url@^5.0.0:
   dependencies:
     rc "^1.2.8"
 
-relative@^3.0.2:
-  version "3.0.2"
-  resolved "https://registry.yarnpkg.com/relative/-/relative-3.0.2.tgz#0dcd8ec54a5d35a3c15e104503d65375b5a5367f"
-  integrity sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8=
-  dependencies:
-    isobject "^2.0.0"
-
-remarkable@^1.6.2, remarkable@^1.7.1:
-  version "1.7.4"
-  resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-1.7.4.tgz#19073cb960398c87a7d6546eaa5e50d2022fcd00"
-  integrity sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==
-  dependencies:
-    argparse "^1.0.10"
-    autolinker "~0.28.0"
-
 remove-trailing-separator@^1.0.1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -7763,11 +7007,6 @@ seek-bzip@^1.0.5:
   dependencies:
     commander "^2.8.1"
 
-self-closing-tags@^1.0.1:
-  version "1.0.1"
-  resolved "https://registry.yarnpkg.com/self-closing-tags/-/self-closing-tags-1.0.1.tgz#6c5fa497994bb826b484216916371accee490a5d"
-  integrity sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA==
-
 semver-compare@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
@@ -7812,13 +7051,6 @@ set-blocking@^2.0.0:
   resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
   integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
 
-set-getter@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376"
-  integrity sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=
-  dependencies:
-    to-object-path "^0.3.0"
-
 set-value@^2.0.0, set-value@^2.0.1:
   version "2.0.1"
   resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
@@ -7877,15 +7109,6 @@ shellwords@^0.1.1:
   resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
   integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
 
-side-channel@^1.0.3:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
-  integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
-  dependencies:
-    call-bind "^1.0.0"
-    get-intrinsic "^1.0.2"
-    object-inspect "^1.9.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"
@@ -8178,14 +7401,6 @@ string.prototype.trimend@^1.0.1:
     define-properties "^1.1.3"
     es-abstract "^1.17.5"
 
-string.prototype.trimend@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b"
-  integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==
-  dependencies:
-    call-bind "^1.0.0"
-    define-properties "^1.1.3"
-
 string.prototype.trimstart@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz#14af6d9f34b053f7cfc89b72f8f2ee14b9039a54"
@@ -8194,14 +7409,6 @@ string.prototype.trimstart@^1.0.1:
     define-properties "^1.1.3"
     es-abstract "^1.17.5"
 
-string.prototype.trimstart@^1.0.3:
-  version "1.0.3"
-  resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa"
-  integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==
-  dependencies:
-    call-bind "^1.0.0"
-    define-properties "^1.1.3"
-
 string_decoder@^1.1.1:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
@@ -8290,11 +7497,6 @@ strip-outer@^1.0.0:
   dependencies:
     escape-string-regexp "^1.0.2"
 
-striptags@^3.1.0:
-  version "3.1.1"
-  resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.1.1.tgz#c8c3e7fdd6fb4bb3a32a3b752e5b5e3e38093ebd"
-  integrity sha1-yMPn/db7S7OjKjt1LltePjgJPr0=
-
 sublevel-pouchdb@7.2.2:
   version "7.2.2"
   resolved "https://registry.yarnpkg.com/sublevel-pouchdb/-/sublevel-pouchdb-7.2.2.tgz#49e46cd37883bf7ff5006d7c5b9bcc7bcc1f422f"
@@ -8305,11 +7507,6 @@ sublevel-pouchdb@7.2.2:
     ltgt "2.2.1"
     readable-stream "1.1.14"
 
-success-symbol@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/success-symbol/-/success-symbol-0.1.0.tgz#24022e486f3bf1cdca094283b769c472d3b72897"
-  integrity sha1-JAIuSG878c3KCUKDt2nEctO3KJc=
-
 sumchecker@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/sumchecker/-/sumchecker-3.0.1.tgz#6377e996795abb0b6d348e9b3e1dfb24345a8e42"
@@ -8362,13 +7559,6 @@ supports-color@^7.1.0:
   dependencies:
     has-flag "^4.0.0"
 
-svelte-spa-router@^3.0.5:
-  version "3.1.0"
-  resolved "https://registry.yarnpkg.com/svelte-spa-router/-/svelte-spa-router-3.1.0.tgz#a929f0def7e12c41f32bc356f91685aeadcd75bf"
-  integrity sha512-jlM/xwjn57mylr+pzHYCOOy+IPQauT46gOucNGTBu6jHcFXu3F+oaojN4PXC1LYizRGxFB6QA0qnYbZnRfX7Sg==
-  dependencies:
-    regexparam "1.3.0"
-
 svelte@^3.30.0:
   version "3.31.2"
   resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.31.2.tgz#d2ddf6cacbb95e4cc3796207510b660a25586324"
@@ -8507,11 +7697,6 @@ through@^2.3.6, through@^2.3.8, through@~2.3.4:
   resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
   integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
 
-time-stamp@^1.0.1:
-  version "1.1.0"
-  resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3"
-  integrity sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=
-
 timed-out@^4.0.1:
   version "4.0.1"
   resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
@@ -8554,11 +7739,6 @@ to-fast-properties@^2.0.0:
   resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
   integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=
 
-to-gfm-code-block@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/to-gfm-code-block/-/to-gfm-code-block-0.1.1.tgz#25d045a5fae553189e9637b590900da732d8aa82"
-  integrity sha1-JdBFpfrlUxielje1kJANpzLYqoI=
-
 to-json-schema@^0.2.5:
   version "0.2.5"
   resolved "https://registry.yarnpkg.com/to-json-schema/-/to-json-schema-0.2.5.tgz#ef3c3f11ad64460dcfbdbafd0fd525d69d62a98f"
@@ -8732,18 +7912,6 @@ typedarray@^0.0.6:
   resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
   integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
 
-typeof-article@^0.1.1:
-  version "0.1.1"
-  resolved "https://registry.yarnpkg.com/typeof-article/-/typeof-article-0.1.1.tgz#9f07e733c3fbb646ffa9e61c08debacd460e06af"
-  integrity sha1-nwfnM8P7tkb/qeYcCN66zUYOBq8=
-  dependencies:
-    kind-of "^3.1.0"
-
-uglify-js@^3.1.4:
-  version "3.11.4"
-  resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.11.4.tgz#b47b7ae99d4bd1dca65b53aaa69caa0909e6fadf"
-  integrity sha512-FyYnoxVL1D6+jDGQpbK5jW6y/2JlVfRfEeQ67BPCUg5wfCjaKOpr2XeceE4QL+MkhxliLtf5EbrMDZgzpt2CNw==
-
 unbzip2-stream@^1.0.9:
   version "1.4.3"
   resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7"
@@ -8967,11 +8135,6 @@ walker@^1.0.7, walker@~1.0.5:
   dependencies:
     makeerror "1.0.x"
 
-warning-symbol@^0.1.0:
-  version "0.1.0"
-  resolved "https://registry.yarnpkg.com/warning-symbol/-/warning-symbol-0.1.0.tgz#bb31dd11b7a0f9d67ab2ed95f457b65825bbad21"
-  integrity sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE=
-
 webidl-conversions@^4.0.2:
   version "4.0.2"
   resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
@@ -9007,45 +8170,11 @@ whatwg-url@^7.0.0:
     tr46 "^1.0.1"
     webidl-conversions "^4.0.2"
 
-which-boxed-primitive@^1.0.1:
-  version "1.0.2"
-  resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
-  integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
-  dependencies:
-    is-bigint "^1.0.1"
-    is-boolean-object "^1.1.0"
-    is-number-object "^1.0.4"
-    is-string "^1.0.5"
-    is-symbol "^1.0.3"
-
-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.4"
-  resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.4.tgz#8fcb7d3ee5adf2d771066fba7cf37e32fe8711ff"
-  integrity sha512-49E0SpUe90cjpoc7BOJwyPHRqSAd12c10Qm2amdEZrJPCY2NDxaW01zHITrem+rnETY3dwrbH3UUrUwagfCYDA==
-  dependencies:
-    available-typed-arrays "^1.0.2"
-    call-bind "^1.0.0"
-    es-abstract "^1.18.0-next.1"
-    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"
@@ -9065,11 +8194,6 @@ word-wrap@~1.2.3:
   resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
   integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
 
-wordwrap@^1.0.0:
-  version "1.0.0"
-  resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
-  integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
-
 worker-farm@^1.7.0:
   version "1.7.0"
   resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz#26a94c5391bbca926152002f69b84a4bf772e5a8"
@@ -9276,11 +8400,6 @@ yauzl@^2.10.0, yauzl@^2.4.2:
     buffer-crc32 "~0.2.3"
     fd-slicer "~1.1.0"
 
-year@^0.2.1:
-  version "0.2.1"
-  resolved "https://registry.yarnpkg.com/year/-/year-0.2.1.tgz#4083ae520a318b23ec86037f3000cb892bdf9bb0"
-  integrity sha1-QIOuUgoxiyPshgN/MADLiSvfm7A=
-
 ylru@^1.2.0:
   version "1.2.1"
   resolved "https://registry.yarnpkg.com/ylru/-/ylru-1.2.1.tgz#f576b63341547989c1de7ba288760923b27fe84f"

From 19a3e609e6a21b6c2ded70f9d1cd381f0ad7581b Mon Sep 17 00:00:00 2001
From: Martin McKeaveney <martin@shogunsystems.co.uk>
Date: Tue, 26 Jan 2021 16:02:44 +0000
Subject: [PATCH 03/26] return schemas from backend

---
 packages/server/src/integrations/postgres.js | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/packages/server/src/integrations/postgres.js b/packages/server/src/integrations/postgres.js
index 6f3e5ed2d7..fd5b1fe96f 100644
--- a/packages/server/src/integrations/postgres.js
+++ b/packages/server/src/integrations/postgres.js
@@ -58,7 +58,7 @@ class PostgresIntegration {
 
   async create({ sql }) {
     const response = await this.client.query(sql)
-    return response.rows
+    return response.rows.length ? response.rows : [{ created: true }]
   }
 
   async read({ sql }) {
@@ -68,12 +68,12 @@ class PostgresIntegration {
 
   async update({ sql }) {
     const response = await this.client.query(sql)
-    return response.rows
+    return response.rows.length ? response.rows : [{ updated: true }]
   }
 
   async delete({ sql }) {
     const response = await this.client.query(sql)
-    return response.rows
+    return response.rows.length ? response.rows : [{ deleted: true }]
   }
 }
 

From 58019592c8808133f641ac0fdb88008d9c9f34b4 Mon Sep 17 00:00:00 2001
From: Joe <49767913+joebudi@users.noreply.github.com>
Date: Tue, 26 Jan 2021 22:42:31 +0000
Subject: [PATCH 04/26] Minor ui updates

Padding and spacing improved
---
 packages/builder/package.json                 |  2 +-
 .../PropertiesPanel/BindingPanel.svelte       | 21 +++++++-------
 .../EventsEditor/EventEditor.svelte           | 28 ++++++++-----------
 .../EventsEditor/EventEditorModal.svelte      |  2 +-
 packages/builder/yarn.lock                    |  8 +++---
 5 files changed, 28 insertions(+), 33 deletions(-)

diff --git a/packages/builder/package.json b/packages/builder/package.json
index 41b98750e9..52fa846db3 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -63,7 +63,7 @@
     }
   },
   "dependencies": {
-    "@budibase/bbui": "^1.54.1",
+    "@budibase/bbui": "^1.55.2",
     "@budibase/client": "^0.5.3",
     "@budibase/colorpicker": "^1.0.1",
     "@budibase/string-templates": "^0.5.3",
diff --git a/packages/builder/src/components/design/PropertiesPanel/BindingPanel.svelte b/packages/builder/src/components/design/PropertiesPanel/BindingPanel.svelte
index 612dc9caa5..7e91759764 100644
--- a/packages/builder/src/components/design/PropertiesPanel/BindingPanel.svelte
+++ b/packages/builder/src/components/design/PropertiesPanel/BindingPanel.svelte
@@ -26,10 +26,8 @@
 <div class="drawer-contents">
   <div class="container" data-cy="binding-dropdown-modal">
     <div class="list">
-      <Heading extraSmall>Objects</Heading>
-      <Spacer medium />
       {#if context}
-        <Heading extraSmall>Tables</Heading>
+        <Heading extraSmall>Columns</Heading>
         <ul>
           {#each context as { readableBinding }}
             <li on:click={() => addToText(readableBinding)}>
@@ -53,8 +51,8 @@
       <TextArea
         thin
         bind:value
-        placeholder="Add text, or click the objects on the left to add them to the
-        textbox." />
+        placeholder="Add text, or click the objects on the left to add them to
+        the textbox." />
     </div>
   </div>
 </div>
@@ -63,15 +61,14 @@
   .container {
     height: 100%;
     display: grid;
-    grid-template-columns: auto 1fr;
+    grid-template-columns: 260px 1fr;
   }
   .list {
-    width: 150px;
-    border-right: 1.5px solid var(--grey-4);
-    padding: var(--spacing-s);
+    border-right: var(--border-light);
+    padding: var(--spacing-l);
   }
   .text {
-    padding: var(--spacing-s);
+    padding: var(--spacing-xl);
     font-family: var(--font-sans);
   }
   .text :global(p) {
@@ -89,10 +86,12 @@
     font-family: var(--font-sans);
     font-size: var(--font-size-xs);
     color: var(--grey-7);
-    padding: var(--spacing-s) 0;
+    padding: var(--spacing-m) 0;
     margin: auto 0px;
     align-items: center;
     cursor: pointer;
+    border: var(--border-light);
+    border-width: 1px 0 1px 0;
   }
 
   li:hover {
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditor.svelte b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditor.svelte
index f15b87d867..701e416c2f 100644
--- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditor.svelte
+++ b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditor.svelte
@@ -1,10 +1,10 @@
 <script>
   import {
     Button,
-    TextButton,
     Body,
     DropdownMenu,
     ModalContent,
+    Spacer,
   } from "@budibase/bbui"
   import { AddIcon, ArrowDownIcon } from "components/common/Icons/"
   import actionTypes from "./actions"
@@ -48,12 +48,11 @@
   <div class="actions-list">
     <div>
       <div bind:this={addActionButton}>
-        <TextButton text small blue on:click={addActionDropdown.show}>
-          <div style="height: 20px; width: 20px;">
-            <AddIcon />
-          </div>
+        <Spacer small />
+        <Button wide secondary on:click={addActionDropdown.show}>
           Add Action
-        </TextButton>
+        </Button>
+        <Spacer medium />
       </div>
       <DropdownMenu
         bind:this={addActionDropdown}
@@ -74,13 +73,12 @@
         <div class="action-container">
           <div class="action-header" on:click={selectAction(action)}>
             <span class:selected={action === selectedAction}>
-              {index + 1}.
-              {action[EVENT_TYPE_KEY]}
+              {index + 1}. {action[EVENT_TYPE_KEY]}
             </span>
           </div>
           <i
             class="ri-close-fill"
-            style="margin-left: var(--spacing-m);"
+            style="margin-left: auto;"
             on:click={() => deleteAction(index)} />
         </div>
       {/each}
@@ -107,7 +105,7 @@
 
   .action-header > span {
     margin-bottom: var(--spacing-m);
-    font-size: var(--font-size-s);
+    font-size: var(--font-size-xs);
   }
 
   .action-header > span:hover,
@@ -123,7 +121,7 @@
 
   .available-action {
     padding: var(--spacing-s);
-    font-size: var(--font-size-m);
+    font-size: var(--font-size-xs);
     cursor: pointer;
   }
 
@@ -135,7 +133,7 @@
     height: 40vh;
     display: grid;
     grid-gap: var(--spacing-m);
-    grid-template-columns: 15% 1fr;
+    grid-template-columns: 260px 1fr;
     grid-auto-flow: column;
     min-height: 0;
     padding-top: 0;
@@ -143,15 +141,13 @@
   }
 
   .action-container {
-    border: var(--border-light);
-    border-width: 1px 0 0 0;
+    border-top: var(--border-light);
     display: flex;
     align-items: center;
   }
 
   .selected-action-container {
-    padding-bottom: var(--spacing-s);
-    padding-top: var(--spacing-s);
+    padding: var(--spacing-xl);
   }
 
   a {
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditorModal.svelte b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditorModal.svelte
index ac976317ec..97c6a310fc 100644
--- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditorModal.svelte
+++ b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditorModal.svelte
@@ -156,7 +156,7 @@
   }
 
   .available-action {
-    padding: var(--spacing-s);
+    padding: var(--spacing-m);
     font-size: var(--font-size-m);
     cursor: pointer;
   }
diff --git a/packages/builder/yarn.lock b/packages/builder/yarn.lock
index 85bbdab526..fb269dda5e 100644
--- a/packages/builder/yarn.lock
+++ b/packages/builder/yarn.lock
@@ -842,10 +842,10 @@
     lodash "^4.17.19"
     to-fast-properties "^2.0.0"
 
-"@budibase/bbui@^1.54.1":
-  version "1.54.1"
-  resolved "https://registry.yarnpkg.com/@budibase/bbui/-/bbui-1.54.1.tgz#ad0439c0be6a4dc818cd9dacda00f053b0daa9d5"
-  integrity sha512-ZY2OP/tF+ReMSyzZIGZV6wpQ4eIEzYGxZV3n+C+oNjzK5u3rwWPCDEVDlZgJSqJ61z+sEf2zuIyAh88lq9RTaA==
+"@budibase/bbui@^1.55.2":
+  version "1.55.2"
+  resolved "https://registry.yarnpkg.com/@budibase/bbui/-/bbui-1.55.2.tgz#be636e8b86b7e516a08eb626bb50c4b1f9774bf8"
+  integrity sha512-CevH/olxDFIko9uwYUpUTevPmpShrLwJSR7+wn/JetZERwhTwbLhOXzpsyXaK226qQ8vWhm0U31HRSKI1HwDDg==
   dependencies:
     markdown-it "^12.0.2"
     quill "^1.3.7"

From 032cce7bcd0f45ea9cbfb57aad6f1cde09cd1568 Mon Sep 17 00:00:00 2001
From: Joe <49767913+joebudi@users.noreply.github.com>
Date: Wed, 27 Jan 2021 09:44:58 +0000
Subject: [PATCH 05/26] Further spacing improvements

Spacing improvements
Red color applied to X hover
List of bindable objects is now scrollable without a visual of the scrollbar
---
 .../components/design/PropertiesPanel/BindingPanel.svelte  | 7 +++++++
 .../PropertyControls/EventsEditor/EventEditor.svelte       | 7 ++++++-
 2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/packages/builder/src/components/design/PropertiesPanel/BindingPanel.svelte b/packages/builder/src/components/design/PropertiesPanel/BindingPanel.svelte
index 7e91759764..8bfae51337 100644
--- a/packages/builder/src/components/design/PropertiesPanel/BindingPanel.svelte
+++ b/packages/builder/src/components/design/PropertiesPanel/BindingPanel.svelte
@@ -28,6 +28,7 @@
     <div class="list">
       {#if context}
         <Heading extraSmall>Columns</Heading>
+        <Spacer small />
         <ul>
           {#each context as { readableBinding }}
             <li on:click={() => addToText(readableBinding)}>
@@ -66,7 +67,13 @@
   .list {
     border-right: var(--border-light);
     padding: var(--spacing-l);
+    overflow: auto;
   }
+
+  .list::-webkit-scrollbar {
+    display: none;
+  }
+
   .text {
     padding: var(--spacing-xl);
     font-family: var(--font-sans);
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditor.svelte b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditor.svelte
index 701e416c2f..86e5174473 100644
--- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditor.svelte
+++ b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditor.svelte
@@ -115,7 +115,7 @@
   }
 
   .actions-list {
-    border: var(--border-light);
+    border-right: var(--border-light);
     padding: var(--spacing-s);
   }
 
@@ -160,4 +160,9 @@
   a:hover {
     color: var(--blue);
   }
+
+  i:hover {
+    color: var(--red);
+    cursor: pointer;
+  }
 </style>

From b1a76ad74d49385fc59c83f94c25296f3688dcd8 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney <martin@shogunsystems.co.uk>
Date: Wed, 27 Jan 2021 15:04:13 +0000
Subject: [PATCH 06/26] v0.6.0

---
 lerna.json                                | 2 +-
 packages/builder/package.json             | 6 +++---
 packages/client/package.json              | 6 +++---
 packages/server/package.json              | 6 +++---
 packages/standard-components/package.json | 2 +-
 packages/string-templates/package.json    | 2 +-
 packages/worker/package.json              | 2 +-
 7 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/lerna.json b/lerna.json
index 22963e707b..4ef7575771 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
 {
-  "version": "0.5.3",
+  "version": "0.6.0",
   "npmClient": "yarn",
   "packages": [
     "packages/*"
diff --git a/packages/builder/package.json b/packages/builder/package.json
index 52fa846db3..0fe3f38d9b 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@budibase/builder",
-  "version": "0.5.3",
+  "version": "0.6.0",
   "license": "AGPL-3.0",
   "private": true,
   "scripts": {
@@ -64,9 +64,9 @@
   },
   "dependencies": {
     "@budibase/bbui": "^1.55.2",
-    "@budibase/client": "^0.5.3",
+    "@budibase/client": "^0.6.0",
     "@budibase/colorpicker": "^1.0.1",
-    "@budibase/string-templates": "^0.5.3",
+    "@budibase/string-templates": "^0.6.0",
     "@budibase/svelte-ag-grid": "^0.0.16",
     "@sentry/browser": "5.19.1",
     "@svelteschool/svelte-forms": "^0.7.0",
diff --git a/packages/client/package.json b/packages/client/package.json
index 18c5e9a78d..2b8d4ce52b 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@budibase/client",
-  "version": "0.5.3",
+  "version": "0.6.0",
   "license": "MPL-2.0",
   "main": "dist/budibase-client.js",
   "module": "dist/budibase-client.js",
@@ -9,14 +9,14 @@
     "dev:builder": "rollup -cw"
   },
   "dependencies": {
-    "@budibase/string-templates": "^0.5.3",
+    "@budibase/string-templates": "^0.6.0",
     "deep-equal": "^2.0.1",
     "regexparam": "^1.3.0",
     "shortid": "^2.2.15",
     "svelte-spa-router": "^3.0.5"
   },
   "devDependencies": {
-    "@budibase/standard-components": "^0.5.3",
+    "@budibase/standard-components": "^0.6.0",
     "@rollup/plugin-commonjs": "^16.0.0",
     "@rollup/plugin-node-resolve": "^10.0.0",
     "fs-extra": "^8.1.0",
diff --git a/packages/server/package.json b/packages/server/package.json
index feefffb827..c775d3bea1 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@budibase/server",
   "email": "hi@budibase.com",
-  "version": "0.5.3",
+  "version": "0.6.0",
   "description": "Budibase Web Server",
   "main": "src/electron.js",
   "repository": {
@@ -49,8 +49,8 @@
   "author": "Budibase",
   "license": "AGPL-3.0-or-later",
   "dependencies": {
-    "@budibase/client": "^0.5.3",
-    "@budibase/string-templates": "^0.5.3",
+    "@budibase/client": "^0.6.0",
+    "@budibase/string-templates": "^0.6.0",
     "@elastic/elasticsearch": "^7.10.0",
     "@koa/router": "^8.0.0",
     "@sendgrid/mail": "^7.1.1",
diff --git a/packages/standard-components/package.json b/packages/standard-components/package.json
index b5b3a64888..d2a60c4912 100644
--- a/packages/standard-components/package.json
+++ b/packages/standard-components/package.json
@@ -29,7 +29,7 @@
   "keywords": [
     "svelte"
   ],
-  "version": "0.5.3",
+  "version": "0.6.0",
   "license": "MIT",
   "gitHead": "62ebf3cedcd7e9b2494b4f8cbcfb90927609b491",
   "dependencies": {
diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json
index 77e8f7ded5..ba052ee66d 100644
--- a/packages/string-templates/package.json
+++ b/packages/string-templates/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@budibase/string-templates",
-  "version": "0.5.3",
+  "version": "0.6.0",
   "description": "Handlebars wrapper for Budibase templating.",
   "main": "dist/bundle.js",
   "module": "dist/bundle.js",
diff --git a/packages/worker/package.json b/packages/worker/package.json
index c53d4e9429..45a642fcae 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@budibase/deployment",
   "email": "hi@budibase.com",
-  "version": "0.5.3",
+  "version": "0.6.0",
   "description": "Budibase Deployment Server",
   "main": "src/index.js",
   "repository": {

From baf2f8bec5d9501161e84da09a34847f28844c11 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney <martin@shogunsystems.co.uk>
Date: Wed, 27 Jan 2021 16:40:47 +0000
Subject: [PATCH 07/26] replace npmignore with package JSON files field

---
 packages/standard-components/.npmignore   | 3 ---
 packages/standard-components/package.json | 5 +++++
 2 files changed, 5 insertions(+), 3 deletions(-)
 delete mode 100644 packages/standard-components/.npmignore

diff --git a/packages/standard-components/.npmignore b/packages/standard-components/.npmignore
deleted file mode 100644
index 81c5644598..0000000000
--- a/packages/standard-components/.npmignore
+++ /dev/null
@@ -1,3 +0,0 @@
-*
-!dist/*
-!components.json
\ No newline at end of file
diff --git a/packages/standard-components/package.json b/packages/standard-components/package.json
index d2a60c4912..202dd9452e 100644
--- a/packages/standard-components/package.json
+++ b/packages/standard-components/package.json
@@ -10,6 +10,11 @@
     "start:dev": "sirv public --single --dev",
     "dev:builder": "rollup -cw"
   },
+  "files": [
+    "manifest.json",
+    "package.json",
+    "dist"
+  ],
   "devDependencies": {
     "@rollup/plugin-alias": "^3.1.1",
     "@rollup/plugin-commonjs": "^16.0.0",

From 23899840d37c65a59f5cc38a832c373166300f03 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney <martin@shogunsystems.co.uk>
Date: Wed, 27 Jan 2021 16:47:44 +0000
Subject: [PATCH 08/26] v0.6.1

---
 lerna.json                                | 2 +-
 packages/builder/package.json             | 6 +++---
 packages/client/package.json              | 6 +++---
 packages/server/package.json              | 6 +++---
 packages/standard-components/package.json | 2 +-
 packages/string-templates/package.json    | 2 +-
 packages/worker/package.json              | 2 +-
 7 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/lerna.json b/lerna.json
index 4ef7575771..5a71180145 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
 {
-  "version": "0.6.0",
+  "version": "0.6.1",
   "npmClient": "yarn",
   "packages": [
     "packages/*"
diff --git a/packages/builder/package.json b/packages/builder/package.json
index 0fe3f38d9b..e56f01ae49 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@budibase/builder",
-  "version": "0.6.0",
+  "version": "0.6.1",
   "license": "AGPL-3.0",
   "private": true,
   "scripts": {
@@ -64,9 +64,9 @@
   },
   "dependencies": {
     "@budibase/bbui": "^1.55.2",
-    "@budibase/client": "^0.6.0",
+    "@budibase/client": "^0.6.1",
     "@budibase/colorpicker": "^1.0.1",
-    "@budibase/string-templates": "^0.6.0",
+    "@budibase/string-templates": "^0.6.1",
     "@budibase/svelte-ag-grid": "^0.0.16",
     "@sentry/browser": "5.19.1",
     "@svelteschool/svelte-forms": "^0.7.0",
diff --git a/packages/client/package.json b/packages/client/package.json
index 2b8d4ce52b..eea47390e5 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@budibase/client",
-  "version": "0.6.0",
+  "version": "0.6.1",
   "license": "MPL-2.0",
   "main": "dist/budibase-client.js",
   "module": "dist/budibase-client.js",
@@ -9,14 +9,14 @@
     "dev:builder": "rollup -cw"
   },
   "dependencies": {
-    "@budibase/string-templates": "^0.6.0",
+    "@budibase/string-templates": "^0.6.1",
     "deep-equal": "^2.0.1",
     "regexparam": "^1.3.0",
     "shortid": "^2.2.15",
     "svelte-spa-router": "^3.0.5"
   },
   "devDependencies": {
-    "@budibase/standard-components": "^0.6.0",
+    "@budibase/standard-components": "^0.6.1",
     "@rollup/plugin-commonjs": "^16.0.0",
     "@rollup/plugin-node-resolve": "^10.0.0",
     "fs-extra": "^8.1.0",
diff --git a/packages/server/package.json b/packages/server/package.json
index c775d3bea1..2984aff7cd 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@budibase/server",
   "email": "hi@budibase.com",
-  "version": "0.6.0",
+  "version": "0.6.1",
   "description": "Budibase Web Server",
   "main": "src/electron.js",
   "repository": {
@@ -49,8 +49,8 @@
   "author": "Budibase",
   "license": "AGPL-3.0-or-later",
   "dependencies": {
-    "@budibase/client": "^0.6.0",
-    "@budibase/string-templates": "^0.6.0",
+    "@budibase/client": "^0.6.1",
+    "@budibase/string-templates": "^0.6.1",
     "@elastic/elasticsearch": "^7.10.0",
     "@koa/router": "^8.0.0",
     "@sendgrid/mail": "^7.1.1",
diff --git a/packages/standard-components/package.json b/packages/standard-components/package.json
index 202dd9452e..decd725967 100644
--- a/packages/standard-components/package.json
+++ b/packages/standard-components/package.json
@@ -34,7 +34,7 @@
   "keywords": [
     "svelte"
   ],
-  "version": "0.6.0",
+  "version": "0.6.1",
   "license": "MIT",
   "gitHead": "62ebf3cedcd7e9b2494b4f8cbcfb90927609b491",
   "dependencies": {
diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json
index ba052ee66d..0fee9f3df7 100644
--- a/packages/string-templates/package.json
+++ b/packages/string-templates/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@budibase/string-templates",
-  "version": "0.6.0",
+  "version": "0.6.1",
   "description": "Handlebars wrapper for Budibase templating.",
   "main": "dist/bundle.js",
   "module": "dist/bundle.js",
diff --git a/packages/worker/package.json b/packages/worker/package.json
index 45a642fcae..3f6c7584ec 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@budibase/deployment",
   "email": "hi@budibase.com",
-  "version": "0.6.0",
+  "version": "0.6.1",
   "description": "Budibase Deployment Server",
   "main": "src/index.js",
   "repository": {

From 0f18ee70ef0f9299c8f3e07e3171f055bcae21d4 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney <martin@shogunsystems.co.uk>
Date: Wed, 27 Jan 2021 17:29:30 +0000
Subject: [PATCH 09/26] actions fix

---
 .../popovers/EditQueryParamsPopover.svelte    |  11 +-
 .../Notification/NotificationDisplay.svelte   |   2 +-
 .../EventsEditor/EventEditor.svelte           |   6 +-
 .../PropertyControls/TableViewSelect.svelte   |  20 +--
 .../integration/QueryFieldsBuilder.svelte     |   8 +-
 .../components/integration/QueryViewer.svelte |  36 +++---
 .../src/components/integration/index.svelte   |   1 -
 .../[selectedDatasource]/index.svelte         |   1 -
 .../client/src/components/ClientApp.svelte    |  11 +-
 .../src/components/NotificationDisplay.svelte | 117 +++++++++---------
 10 files changed, 113 insertions(+), 100 deletions(-)

diff --git a/packages/builder/src/components/backend/DatasourceNavigator/popovers/EditQueryParamsPopover.svelte b/packages/builder/src/components/backend/DatasourceNavigator/popovers/EditQueryParamsPopover.svelte
index bc34d4d80c..c657bd682f 100644
--- a/packages/builder/src/components/backend/DatasourceNavigator/popovers/EditQueryParamsPopover.svelte
+++ b/packages/builder/src/components/backend/DatasourceNavigator/popovers/EditQueryParamsPopover.svelte
@@ -20,12 +20,9 @@
 </script>
 
 <div on:click|stopPropagation bind:this={anchor}>
-  <TextButton
-    text
-    on:click={dropdown.show}
-    active={false}>
-      <Icon name="add" />
-      Add Parameters
+  <TextButton text on:click={dropdown.show} active={false}>
+    <Icon name="add" />
+    Add Parameters
   </TextButton>
   <DropdownMenu align="right" {anchor} bind:this={dropdown}>
     <div class="wrapper">
@@ -39,4 +36,4 @@
     padding: var(--spacing-xl);
     min-width: 600px;
   }
-</style>
\ No newline at end of file
+</style>
diff --git a/packages/builder/src/components/common/Notification/NotificationDisplay.svelte b/packages/builder/src/components/common/Notification/NotificationDisplay.svelte
index 3a7c03a716..2a89426ca8 100644
--- a/packages/builder/src/components/common/Notification/NotificationDisplay.svelte
+++ b/packages/builder/src/components/common/Notification/NotificationDisplay.svelte
@@ -1,6 +1,6 @@
 <script>
   import { notificationStore } from "builderStore/store/notifications"
-  import { flip } from 'svelte/animate';
+  import { flip } from "svelte/animate"
   import { fly } from "svelte/transition"
 
   export let themes = {
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditor.svelte b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditor.svelte
index 86e5174473..0e52aa8f76 100644
--- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditor.svelte
+++ b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/EventsEditor/EventEditor.svelte
@@ -33,6 +33,9 @@
       parameters: {},
       [EVENT_TYPE_KEY]: actionType.name,
     }
+    if (!actions) {
+      actions = []
+    }
     actions.push(newAction)
     selectedAction = newAction
     actions = actions
@@ -73,7 +76,8 @@
         <div class="action-container">
           <div class="action-header" on:click={selectAction(action)}>
             <span class:selected={action === selectedAction}>
-              {index + 1}. {action[EVENT_TYPE_KEY]}
+              {index + 1}.
+              {action[EVENT_TYPE_KEY]}
             </span>
           </div>
           <i
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/TableViewSelect.svelte b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/TableViewSelect.svelte
index 6b3873a08c..5031b37323 100644
--- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/TableViewSelect.svelte
+++ b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/TableViewSelect.svelte
@@ -34,15 +34,17 @@
     }))
     return [...acc, ...viewsArr]
   }, [])
-  $: queries = $backendUiStore.queries.filter(query => query.queryVerb === "read").map(query => ({
-    label: query.name,
-    name: query.name,
-    tableId: query._id,
-    ...query,
-    schema: query.schema,
-    parameters: query.parameters,
-    type: "query",
-  }))
+  $: queries = $backendUiStore.queries
+    .filter(query => query.queryVerb === "read")
+    .map(query => ({
+      label: query.name,
+      name: query.name,
+      tableId: query._id,
+      ...query,
+      schema: query.schema,
+      parameters: query.parameters,
+      type: "query",
+    }))
   $: bindableProperties = getBindableProperties(
     $currentAsset.props,
     $store.selectedComponentId
diff --git a/packages/builder/src/components/integration/QueryFieldsBuilder.svelte b/packages/builder/src/components/integration/QueryFieldsBuilder.svelte
index d5f4b3bd8b..79728f12fd 100644
--- a/packages/builder/src/components/integration/QueryFieldsBuilder.svelte
+++ b/packages/builder/src/components/integration/QueryFieldsBuilder.svelte
@@ -24,8 +24,8 @@
 </script>
 
 <form on:submit|preventDefault>
-<div class="field">
-  {#each schemaKeys as field}
+  <div class="field">
+    {#each schemaKeys as field}
       <Input
         placeholder="Enter {field} name"
         outline
@@ -33,8 +33,8 @@
         type={schema.fields[field]?.type}
         required={schema.fields[field]?.required}
         bind:value={fields[field]} />
-  {/each}
-</div>
+    {/each}
+  </div>
 </form>
 {#if schema.customisable}
   <Editor
diff --git a/packages/builder/src/components/integration/QueryViewer.svelte b/packages/builder/src/components/integration/QueryViewer.svelte
index 485dbf7411..77f6d51476 100644
--- a/packages/builder/src/components/integration/QueryViewer.svelte
+++ b/packages/builder/src/components/integration/QueryViewer.svelte
@@ -135,17 +135,22 @@
     <Input placeholder="✎ Edit Query Name" bind:value={query.name} />
   </div>
   {#if config}
-  <div class="props">
-    <div class="query-type">Query type: <span class="query-type-span">{config[query.queryVerb].type}</span></div>
-    <div class="select">
-      <Select primary thin bind:value={query.queryVerb}>
-        {#each Object.keys(config) as queryVerb}
-          <option value={queryVerb}>{queryVerb}</option>
-        {/each}
-      </Select>
-  </div>
+    <div class="props">
+      <div class="query-type">
+        Query type:
+        <span class="query-type-span">{config[query.queryVerb].type}</span>
+      </div>
+      <div class="select">
+        <Select primary thin bind:value={query.queryVerb}>
+          {#each Object.keys(config) as queryVerb}
+            <option value={queryVerb}>{queryVerb}</option>
+          {/each}
+        </Select>
+      </div>
     </div>
-    <EditQueryParamsPopover bind:parameters={query.parameters} bindable={false} />
+    <EditQueryParamsPopover
+      bind:parameters={query.parameters}
+      bindable={false} />
   {/if}
 </header>
 <Spacer extraLarge />
@@ -182,7 +187,11 @@
               {#each fields as field, idx}
                 <Spacer small />
                 <div class="field">
-                  <Input outline placeholder="Field Name" type={'text'} bind:value={field.name} />
+                  <Input
+                    outline
+                    placeholder="Field Name"
+                    type={'text'}
+                    bind:value={field.name} />
                   <Select thin border bind:value={field.type}>
                     <option value={''}>Select a field type</option>
                     <option value={'STRING'}>Text</option>
@@ -195,8 +204,8 @@
                     on:click={() => deleteField(idx)} />
                 </div>
               {/each}
-                <Spacer small />
-                <Button thin secondary on:click={newField}>Add Field</Button>
+              <Spacer small />
+              <Button thin secondary on:click={newField}>Add Field</Button>
             {/if}
           </Switcher>
         {/if}
@@ -206,7 +215,6 @@
 {/if}
 
 <style>
-
   .input {
     width: 300px;
   }
diff --git a/packages/builder/src/components/integration/index.svelte b/packages/builder/src/components/integration/index.svelte
index a4f59459c0..5d863bb5e7 100644
--- a/packages/builder/src/components/integration/index.svelte
+++ b/packages/builder/src/components/integration/index.svelte
@@ -20,7 +20,6 @@
   }
 </script>
 
-
 {#if schema}
   {#key query._id}
     {#if schema.type === QueryTypes.SQL}
diff --git a/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/index.svelte b/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/index.svelte
index 0482d5458e..fc40923eca 100644
--- a/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/index.svelte
+++ b/packages/builder/src/pages/[application]/data/datasource/[selectedDatasource]/index.svelte
@@ -58,7 +58,6 @@
       </div>
     </div>
   </section>
-
 {/if}
 
 <style>
diff --git a/packages/client/src/components/ClientApp.svelte b/packages/client/src/components/ClientApp.svelte
index 4af1f198d5..659f34568b 100644
--- a/packages/client/src/components/ClientApp.svelte
+++ b/packages/client/src/components/ClientApp.svelte
@@ -2,9 +2,14 @@
   import { writable } from "svelte/store"
   import { setContext, onMount } from "svelte"
   import Component from "./Component.svelte"
-  import NotificationDisplay from './NotificationDisplay.svelte'
+  import NotificationDisplay from "./NotificationDisplay.svelte"
   import SDK from "../sdk"
-  import { createDataStore, initialise, screenStore, notificationStore } from "../store"
+  import {
+    createDataStore,
+    initialise,
+    screenStore,
+    notificationStore,
+  } from "../store"
 
   // Provide contexts
   setContext("sdk", SDK)
@@ -24,4 +29,4 @@
 {#if loaded && $screenStore.activeLayout}
   <Component definition={$screenStore.activeLayout.props} />
 {/if}
-<NotificationDisplay />
\ No newline at end of file
+<NotificationDisplay />
diff --git a/packages/client/src/components/NotificationDisplay.svelte b/packages/client/src/components/NotificationDisplay.svelte
index f398b7f3bc..9f7f4083c2 100644
--- a/packages/client/src/components/NotificationDisplay.svelte
+++ b/packages/client/src/components/NotificationDisplay.svelte
@@ -1,60 +1,59 @@
 <script>
-    import { flip } from 'svelte/animate';
-    import { fly } from "svelte/transition"
-    import { getContext } from "svelte"
-    const { notifications } = getContext("sdk")
-  
-    export let themes = {
-      danger: "#E26D69",
-      success: "#84C991",
-      warning: "#f0ad4e",
-      info: "#5bc0de",
-      default: "#aaaaaa",
-    }
-  </script>
-  
-  <div class="notifications">
-    {#each $notifications as notification (notification.id)}
-      <div
-        animate:flip
-        class="toast"
-        style="background: {themes[notification.type]};"
-        transition:fly={{ y: -30 }}>
-        <div class="content">{notification.message}</div>
-        {#if notification.icon}<i class={notification.icon} />{/if}
-      </div>
-    {/each}
-  </div>
-  
-  <style>
-    .notifications {
-      position: fixed;
-      top: 10px;
-      left: 0;
-      right: 0;
-      margin: 0 auto;
-      padding: 0;
-      z-index: 9999;
-      display: flex;
-      flex-direction: column;
-      justify-content: flex-start;
-      align-items: center;
-      pointer-events: none;
-    }
-  
-    .toast {
-      flex: 0 0 auto;
-      margin-bottom: 10px;
-      border-radius: var(--border-radius-s);
-      /* The toasts now support being auto sized, so this static width could be removed */
-      width: 40vw;
-    }
-  
-    .content {
-      padding: 10px;
-      display: block;
-      color: white;
-      font-weight: 500;
-    }
-  </style>
-  
\ No newline at end of file
+  import { flip } from "svelte/animate"
+  import { fly } from "svelte/transition"
+  import { getContext } from "svelte"
+  const { notifications } = getContext("sdk")
+
+  export let themes = {
+    danger: "#E26D69",
+    success: "#84C991",
+    warning: "#f0ad4e",
+    info: "#5bc0de",
+    default: "#aaaaaa",
+  }
+</script>
+
+<div class="notifications">
+  {#each $notifications as notification (notification.id)}
+    <div
+      animate:flip
+      class="toast"
+      style="background: {themes[notification.type]};"
+      transition:fly={{ y: -30 }}>
+      <div class="content">{notification.message}</div>
+      {#if notification.icon}<i class={notification.icon} />{/if}
+    </div>
+  {/each}
+</div>
+
+<style>
+  .notifications {
+    position: fixed;
+    top: 10px;
+    left: 0;
+    right: 0;
+    margin: 0 auto;
+    padding: 0;
+    z-index: 9999;
+    display: flex;
+    flex-direction: column;
+    justify-content: flex-start;
+    align-items: center;
+    pointer-events: none;
+  }
+
+  .toast {
+    flex: 0 0 auto;
+    margin-bottom: 10px;
+    border-radius: var(--border-radius-s);
+    /* The toasts now support being auto sized, so this static width could be removed */
+    width: 40vw;
+  }
+
+  .content {
+    padding: 10px;
+    display: block;
+    color: white;
+    font-weight: 500;
+  }
+</style>

From 79277f0ee0dfc95b02e3bec98c24fe04d2c06884 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney <martin@shogunsystems.co.uk>
Date: Wed, 27 Jan 2021 17:43:38 +0000
Subject: [PATCH 10/26] v0.6.2

---
 lerna.json                                | 2 +-
 packages/builder/package.json             | 6 +++---
 packages/client/package.json              | 6 +++---
 packages/server/package.json              | 6 +++---
 packages/standard-components/package.json | 2 +-
 packages/string-templates/package.json    | 2 +-
 packages/worker/package.json              | 2 +-
 7 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/lerna.json b/lerna.json
index 5a71180145..640c262a36 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
 {
-  "version": "0.6.1",
+  "version": "0.6.2",
   "npmClient": "yarn",
   "packages": [
     "packages/*"
diff --git a/packages/builder/package.json b/packages/builder/package.json
index e56f01ae49..440215d65c 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@budibase/builder",
-  "version": "0.6.1",
+  "version": "0.6.2",
   "license": "AGPL-3.0",
   "private": true,
   "scripts": {
@@ -64,9 +64,9 @@
   },
   "dependencies": {
     "@budibase/bbui": "^1.55.2",
-    "@budibase/client": "^0.6.1",
+    "@budibase/client": "^0.6.2",
     "@budibase/colorpicker": "^1.0.1",
-    "@budibase/string-templates": "^0.6.1",
+    "@budibase/string-templates": "^0.6.2",
     "@budibase/svelte-ag-grid": "^0.0.16",
     "@sentry/browser": "5.19.1",
     "@svelteschool/svelte-forms": "^0.7.0",
diff --git a/packages/client/package.json b/packages/client/package.json
index eea47390e5..f524b6c0e0 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@budibase/client",
-  "version": "0.6.1",
+  "version": "0.6.2",
   "license": "MPL-2.0",
   "main": "dist/budibase-client.js",
   "module": "dist/budibase-client.js",
@@ -9,14 +9,14 @@
     "dev:builder": "rollup -cw"
   },
   "dependencies": {
-    "@budibase/string-templates": "^0.6.1",
+    "@budibase/string-templates": "^0.6.2",
     "deep-equal": "^2.0.1",
     "regexparam": "^1.3.0",
     "shortid": "^2.2.15",
     "svelte-spa-router": "^3.0.5"
   },
   "devDependencies": {
-    "@budibase/standard-components": "^0.6.1",
+    "@budibase/standard-components": "^0.6.2",
     "@rollup/plugin-commonjs": "^16.0.0",
     "@rollup/plugin-node-resolve": "^10.0.0",
     "fs-extra": "^8.1.0",
diff --git a/packages/server/package.json b/packages/server/package.json
index 2984aff7cd..fd8d5196a0 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@budibase/server",
   "email": "hi@budibase.com",
-  "version": "0.6.1",
+  "version": "0.6.2",
   "description": "Budibase Web Server",
   "main": "src/electron.js",
   "repository": {
@@ -49,8 +49,8 @@
   "author": "Budibase",
   "license": "AGPL-3.0-or-later",
   "dependencies": {
-    "@budibase/client": "^0.6.1",
-    "@budibase/string-templates": "^0.6.1",
+    "@budibase/client": "^0.6.2",
+    "@budibase/string-templates": "^0.6.2",
     "@elastic/elasticsearch": "^7.10.0",
     "@koa/router": "^8.0.0",
     "@sendgrid/mail": "^7.1.1",
diff --git a/packages/standard-components/package.json b/packages/standard-components/package.json
index decd725967..51eda7815e 100644
--- a/packages/standard-components/package.json
+++ b/packages/standard-components/package.json
@@ -34,7 +34,7 @@
   "keywords": [
     "svelte"
   ],
-  "version": "0.6.1",
+  "version": "0.6.2",
   "license": "MIT",
   "gitHead": "62ebf3cedcd7e9b2494b4f8cbcfb90927609b491",
   "dependencies": {
diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json
index 0fee9f3df7..1ebebaaeec 100644
--- a/packages/string-templates/package.json
+++ b/packages/string-templates/package.json
@@ -1,6 +1,6 @@
 {
   "name": "@budibase/string-templates",
-  "version": "0.6.1",
+  "version": "0.6.2",
   "description": "Handlebars wrapper for Budibase templating.",
   "main": "dist/bundle.js",
   "module": "dist/bundle.js",
diff --git a/packages/worker/package.json b/packages/worker/package.json
index 3f6c7584ec..63d026e56b 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -1,7 +1,7 @@
 {
   "name": "@budibase/deployment",
   "email": "hi@budibase.com",
-  "version": "0.6.1",
+  "version": "0.6.2",
   "description": "Budibase Deployment Server",
   "main": "src/index.js",
   "repository": {

From d1ba3f97f63a55f670bc99ec4ed94252291971d4 Mon Sep 17 00:00:00 2001
From: sovlookup <805408477@qq.com>
Date: Thu, 28 Jan 2021 21:42:40 +0800
Subject: [PATCH 11/26] add arangodb integration

---
 .../DatasourceNavigator/icons/ArangoDB.svelte | 22 +++++
 .../DatasourceNavigator/icons/index.js        |  2 +
 packages/server/package.json                  |  1 +
 packages/server/src/integrations/arangodb.js  | 87 +++++++++++++++++++
 packages/server/src/integrations/index.js     |  3 +
 5 files changed, 115 insertions(+)
 create mode 100644 packages/builder/src/components/backend/DatasourceNavigator/icons/ArangoDB.svelte
 create mode 100644 packages/server/src/integrations/arangodb.js

diff --git a/packages/builder/src/components/backend/DatasourceNavigator/icons/ArangoDB.svelte b/packages/builder/src/components/backend/DatasourceNavigator/icons/ArangoDB.svelte
new file mode 100644
index 0000000000..0be4ca2663
--- /dev/null
+++ b/packages/builder/src/components/backend/DatasourceNavigator/icons/ArangoDB.svelte
@@ -0,0 +1,22 @@
+<script>
+  export let width = "100"
+  export let height = "100"
+</script>
+
+
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" {width} {height} viewBox="0 0 2900 2000" >
+<g id="layer101">
+ <path fill="#5b350f" d="M735 1983 c-137 -19 -322 -95 -431 -175 -138 -103 -250 -315 -284 -542 -24 -161 22 -298 129 -382 123 -97 318 -180 577 -243 l130 -32 29 -67 c41 -94 135 -231 199 -289 292 -267 732 -319 1094 -128 148 79 224 151 418 400 137 176 173 242 228 414 41 130 70 301 70 416 0 236 -146 421 -382 484 -206 56 -392 19 -733 -144 -96 -47 -181 -85 -189 -85 -7 0 -61 46 -119 103 -163 159 -283 231 -433 261 -71 15 -229 19 -303 9z"/>
+ </g>
+<g id="layer102">
+ <path fill="#406f23" d="M735 1983 c-137 -19 -322 -95 -431 -175 -138 -103 -250 -315 -284 -542 -24 -161 22 -298 129 -382 123 -97 318 -180 577 -243 l130 -32 29 -67 c41 -94 135 -231 199 -289 292 -267 732 -319 1094 -128 148 79 224 151 418 400 137 176 173 242 228 414 41 130 70 301 70 416 0 236 -146 421 -382 484 -206 56 -392 19 -733 -144 -96 -47 -181 -85 -189 -85 -7 0 -61 46 -119 103 -163 159 -283 231 -433 261 -71 15 -229 19 -303 9z m460 -643 c163 -51 296 -150 329 -246 23 -69 20 -93 -20 -174 -51 -100 -126 -173 -238 -230 l-89 -45 -131 0 c-151 0 -222 18 -323 84 -138 89 -243 264 -243 406 0 62 12 76 120 134 160 85 229 102 405 96 87 -2 139 -9 190 -25z"/>
+ </g>
+<g id="layer103">
+ <path fill="#c6d821" d="M2215 1789 c-27 -4 -68 -15 -90 -23 -42 -15 -264 -116 -397 -180 l-77 -38 78 -102 c102 -134 144 -208 175 -305 37 -116 49 -200 44 -309 -7 -157 -46 -218 -175 -278 -94 -44 -178 -56 -313 -43 -108 10 -401 53 -479 70 -24 5 -45 8 -47 6 -2 -2 20 -44 49 -92 67 -115 176 -225 281 -284 87 -49 235 -103 335 -121 91 -16 253 -14 346 5 175 37 269 95 419 264 307 347 422 563 457 859 18 148 9 247 -29 325 -88 179 -340 286 -577 246z"/>
+ <path fill="#c6d821" d="M549 1680 c-272 -34 -426 -142 -495 -346 -22 -68 -26 -91 -22 -164 6 -115 32 -173 112 -248 70 -65 236 -153 370 -196 241 -79 722 -172 985 -192 180 -14 343 55 404 170 34 64 30 168 -11 271 -88 223 -245 373 -568 542 -222 116 -379 161 -584 168 -69 2 -155 0 -191 -5z m646 -340 c163 -51 296 -150 329 -246 23 -69 20 -93 -20 -174 -50 -100 -126 -173 -235 -229 -84 -42 -90 -44 -200 -48 -190 -8 -312 37 -434 161 -98 99 -155 221 -155 331 0 62 12 76 120 134 160 85 229 102 405 96 87 -2 139 -9 190 -25z"/>
+ </g>
+<g id="layer104">
+ <path fill="#f6f654" d="M2190 1721 c-57 -19 -469 -184 -494 -198 -12 -7 -5 -21 34 -72 28 -35 71 -96 97 -137 l46 -74 69 0 c38 0 83 -6 102 -14 52 -22 105 -75 139 -140 28 -55 32 -70 32 -147 0 -84 -2 -90 -48 -183 -96 -187 -234 -296 -376 -296 -44 0 -80 7 -110 20 -28 13 -65 20 -105 20 -72 0 -264 22 -426 49 -63 10 -117 17 -118 15 -10 -8 59 -113 110 -169 106 -115 238 -183 448 -231 155 -35 313 -29 447 17 78 27 210 117 279 191 82 89 277 353 336 456 92 159 137 344 125 513 -9 117 -37 189 -101 258 -109 116 -332 172 -486 122z"/>
+ <path fill="#f6f654" d="M490 1624 c-153 -33 -275 -125 -339 -257 -54 -109 -59 -201 -17 -301 32 -76 164 -189 288 -245 51 -23 260 -91 281 -91 3 0 -21 25 -54 56 -94 91 -150 193 -170 313 -14 90 1 111 123 172 161 81 195 91 343 96 111 5 143 2 215 -16 221 -55 380 -192 380 -327 0 -52 -46 -143 -106 -212 -75 -85 -233 -170 -323 -173 -25 -1 -25 -1 4 -10 140 -43 411 -62 527 -38 142 30 238 125 238 234 0 88 -58 230 -139 337 -105 139 -431 343 -676 423 -161 52 -429 71 -575 39z"/>
+ </g>
+</svg>
\ No newline at end of file
diff --git a/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js b/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js
index 4f8d79dbf4..ff38782288 100644
--- a/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js
+++ b/packages/builder/src/components/backend/DatasourceNavigator/icons/index.js
@@ -7,6 +7,7 @@ import S3 from "./S3.svelte"
 import Airtable from "./Airtable.svelte"
 import SqlServer from "./SQLServer.svelte"
 import MySQL from "./MySQL.svelte"
+import ArangoDB from "./ArangoDB.svelte"
 
 export default {
   POSTGRES: Postgres,
@@ -18,4 +19,5 @@ export default {
   S3: S3,
   AIRTABLE: Airtable,
   MYSQL: MySQL,
+  ARANGODB: ArangoDB,
 }
diff --git a/packages/server/package.json b/packages/server/package.json
index fd8d5196a0..2ee2c79e22 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -56,6 +56,7 @@
     "@sendgrid/mail": "^7.1.1",
     "@sentry/node": "^5.19.2",
     "airtable": "^0.10.1",
+    "arangojs": "^7.2.0",
     "aws-sdk": "^2.767.0",
     "bcryptjs": "^2.4.3",
     "chmodr": "^1.2.0",
diff --git a/packages/server/src/integrations/arangodb.js b/packages/server/src/integrations/arangodb.js
new file mode 100644
index 0000000000..eefd656cbc
--- /dev/null
+++ b/packages/server/src/integrations/arangodb.js
@@ -0,0 +1,87 @@
+const arangojs = require("arangojs")
+const { FIELD_TYPES, QUERY_TYPES } = require("./Integration")
+// const arangodb = arangojs.Database
+const aql = arangojs.aql
+
+const SCHEMA = {
+    docs: "https://github.com/arangodb/arangojs",
+    datasource: {
+        url: {
+            type: FIELD_TYPES.STRING,
+            default: "http://localhost:8529",
+            required: true,
+        },
+        username: {
+            type: FIELD_TYPES.STRING,
+            default: "root",
+            required: true,
+        },
+        password: {
+            type: FIELD_TYPES.PASSWORD,
+            required: true,
+        },
+        databaseName: {
+            type: FIELD_TYPES.STRING,
+            default: "_system",
+            required: true,
+        },
+        collection: {
+            type: FIELD_TYPES.STRING,
+            required: true,
+        },
+    },
+    query: {
+        read: {
+            type: QUERY_TYPES.SQL,
+        },
+        create: {
+            type: QUERY_TYPES.JSON,
+        },
+    },
+}
+
+class ArangoDBIntegration {
+    constructor(config) {
+        config.auth = {
+            username: config.username,
+            password: config.password,
+        }
+        
+        this.config = config
+        this.client = arangojs.arangojs(config)
+    }
+
+    async read(query) {
+        try {
+            const result = await this.client.query(query.sql)
+            let rl = []
+            await result.forEach((r)=> rl.push(r))
+            return rl
+        } catch (err) {
+            console.error("Error querying arangodb",err.message)
+            throw err
+        } finally {
+            this.client.close()
+        }
+    }
+
+    async create(query) {
+        const clc = this.client.collection(this.config.collection)
+        try {
+            const result = await this.client.query(aql`INSERT ${query.json} INTO ${clc} LET n = NEW RETURN NEW`)
+            let rl = []
+            await result.forEach((r)=> rl.push(r))
+            return rl
+        } catch (err) {
+            console.error("Error querying arangodb",err.message)
+            throw err
+        } finally {
+            this.client.close()
+        }
+    }
+}
+
+module.exports = {
+  schema: SCHEMA,
+  integration: ArangoDBIntegration,
+}
\ No newline at end of file
diff --git a/packages/server/src/integrations/index.js b/packages/server/src/integrations/index.js
index acb81992a9..8ff89f4900 100644
--- a/packages/server/src/integrations/index.js
+++ b/packages/server/src/integrations/index.js
@@ -7,6 +7,7 @@ const sqlServer = require("./microsoftSqlServer")
 const s3 = require("./s3")
 const airtable = require("./airtable")
 const mysql = require("./mysql")
+const arangodb = require("./arangodb")
 
 const DEFINITIONS = {
   POSTGRES: postgres.schema,
@@ -18,6 +19,7 @@ const DEFINITIONS = {
   S3: s3.schema,
   AIRTABLE: airtable.schema,
   MYSQL: mysql.schema,
+  ARANGODB: arangodb.schema,
 }
 
 const INTEGRATIONS = {
@@ -30,6 +32,7 @@ const INTEGRATIONS = {
   SQL_SERVER: sqlServer.integration,
   AIRTABLE: airtable.integration,
   MYSQL: mysql.integration,
+  ARANGODB: arangodb.integration,
 }
 
 module.exports = {

From 13aab3b809cdd2b4a421c9054e2c2fb351594e1f Mon Sep 17 00:00:00 2001
From: sovlookup <805408477@qq.com>
Date: Thu, 28 Jan 2021 21:48:29 +0800
Subject: [PATCH 12/26] add arangodb integration

---
 packages/server/src/integrations/arangodb.js | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/packages/server/src/integrations/arangodb.js b/packages/server/src/integrations/arangodb.js
index eefd656cbc..f2aa54667e 100644
--- a/packages/server/src/integrations/arangodb.js
+++ b/packages/server/src/integrations/arangodb.js
@@ -1,7 +1,5 @@
-const arangojs = require("arangojs")
+const { Database, aql } = require("arangojs")
 const { FIELD_TYPES, QUERY_TYPES } = require("./Integration")
-// const arangodb = arangojs.Database
-const aql = arangojs.aql
 
 const SCHEMA = {
     docs: "https://github.com/arangodb/arangojs",
@@ -48,7 +46,7 @@ class ArangoDBIntegration {
         }
         
         this.config = config
-        this.client = arangojs.arangojs(config)
+        this.client = new Database(config)
     }
 
     async read(query) {

From 561ce349f9f56e7470867b533ecce34fa607122c Mon Sep 17 00:00:00 2001
From: mike12345567 <me@michaeldrury.co.uk>
Date: Thu, 28 Jan 2021 14:03:19 +0000
Subject: [PATCH 13/26] Fixing an issue that aptkingston found with
 relationships were links on the way out would be multiplied (due to the
 bi-directional nature).

---
 packages/server/src/db/linkedRows/linkUtils.js | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/packages/server/src/db/linkedRows/linkUtils.js b/packages/server/src/db/linkedRows/linkUtils.js
index 3a9aff6c33..5f9dca4088 100644
--- a/packages/server/src/db/linkedRows/linkUtils.js
+++ b/packages/server/src/db/linkedRows/linkUtils.js
@@ -77,11 +77,21 @@ exports.getLinkDocuments = async function({
   }
   params.include_docs = !!includeDocs
   try {
-    const response = await db.query(getQueryIndex(ViewNames.LINK), params)
+    let linkRows = (await db.query(getQueryIndex(ViewNames.LINK), params)).rows
+    // filter to get unique entries
+    const foundIds = []
+    linkRows = linkRows.filter(link => {
+      const unique = foundIds.indexOf(link.id) === -1
+      if (unique) {
+        foundIds.push(link.id)
+      }
+      return unique
+    })
+
     if (includeDocs) {
-      return response.rows.map(row => row.doc)
+      return linkRows.map(row => row.doc)
     } else {
-      return response.rows.map(row => row.value)
+      return linkRows.map(row => row.value)
     }
   } catch (err) {
     // check if the view doesn't exist, it should for all new instances

From 0e7e5920c61ec8b805d97c2af9e794da4f76ee58 Mon Sep 17 00:00:00 2001
From: sovlookup <805408477@qq.com>
Date: Thu, 28 Jan 2021 22:17:39 +0800
Subject: [PATCH 14/26] add arangodb integration

---
 packages/server/src/integrations/arangodb.js | 136 ++++++++++---------
 1 file changed, 69 insertions(+), 67 deletions(-)

diff --git a/packages/server/src/integrations/arangodb.js b/packages/server/src/integrations/arangodb.js
index f2aa54667e..2b3ee1b11b 100644
--- a/packages/server/src/integrations/arangodb.js
+++ b/packages/server/src/integrations/arangodb.js
@@ -2,84 +2,86 @@ const { Database, aql } = require("arangojs")
 const { FIELD_TYPES, QUERY_TYPES } = require("./Integration")
 
 const SCHEMA = {
-    docs: "https://github.com/arangodb/arangojs",
-    datasource: {
-        url: {
-            type: FIELD_TYPES.STRING,
-            default: "http://localhost:8529",
-            required: true,
-        },
-        username: {
-            type: FIELD_TYPES.STRING,
-            default: "root",
-            required: true,
-        },
-        password: {
-            type: FIELD_TYPES.PASSWORD,
-            required: true,
-        },
-        databaseName: {
-            type: FIELD_TYPES.STRING,
-            default: "_system",
-            required: true,
-        },
-        collection: {
-            type: FIELD_TYPES.STRING,
-            required: true,
-        },
+  docs: "https://github.com/arangodb/arangojs",
+  datasource: {
+    url: {
+      type: FIELD_TYPES.STRING,
+      default: "http://localhost:8529",
+      required: true,
     },
-    query: {
-        read: {
-            type: QUERY_TYPES.SQL,
-        },
-        create: {
-            type: QUERY_TYPES.JSON,
-        },
+    username: {
+      type: FIELD_TYPES.STRING,
+      default: "root",
+      required: true,
     },
+    password: {
+      type: FIELD_TYPES.PASSWORD,
+      required: true,
+    },
+    databaseName: {
+      type: FIELD_TYPES.STRING,
+      default: "_system",
+      required: true,
+    },
+    collection: {
+      type: FIELD_TYPES.STRING,
+      required: true,
+    },
+  },
+  query: {
+    read: {
+      type: QUERY_TYPES.SQL,
+    },
+    create: {
+      type: QUERY_TYPES.JSON,
+    },
+  },
 }
 
 class ArangoDBIntegration {
-    constructor(config) {
-        config.auth = {
-            username: config.username,
-            password: config.password,
-        }
-        
-        this.config = config
-        this.client = new Database(config)
+  constructor(config) {
+    config.auth = {
+      username: config.username,
+      password: config.password,
     }
 
-    async read(query) {
-        try {
-            const result = await this.client.query(query.sql)
-            let rl = []
-            await result.forEach((r)=> rl.push(r))
-            return rl
-        } catch (err) {
-            console.error("Error querying arangodb",err.message)
-            throw err
-        } finally {
-            this.client.close()
-        }
-    }
+    this.config = config
+    this.client = new Database(config)
+  }
 
-    async create(query) {
-        const clc = this.client.collection(this.config.collection)
-        try {
-            const result = await this.client.query(aql`INSERT ${query.json} INTO ${clc} LET n = NEW RETURN NEW`)
-            let rl = []
-            await result.forEach((r)=> rl.push(r))
-            return rl
-        } catch (err) {
-            console.error("Error querying arangodb",err.message)
-            throw err
-        } finally {
-            this.client.close()
-        }
+  async read(query) {
+    try {
+      const result = await this.client.query(query.sql)
+      let rl = []
+      await result.forEach(r => rl.push(r))
+      return rl
+    } catch (err) {
+      console.error("Error querying arangodb", err.message)
+      throw err
+    } finally {
+      this.client.close()
     }
+  }
+
+  async create(query) {
+    const clc = this.client.collection(this.config.collection)
+    try {
+      const result = await this.client.query(
+        aql`INSERT ${query.json} INTO ${clc} LET n = NEW RETURN NEW`
+      )
+      let rl = []
+      await result.forEach(r => rl.push(r))
+      return rl
+    } catch (err) {
+      console.error("Error querying arangodb", err.message)
+      throw err
+    } finally {
+      this.client.close()
+    }
+  }
 }
 
 module.exports = {
   schema: SCHEMA,
   integration: ArangoDBIntegration,
-}
\ No newline at end of file
+}

From 2f167d8245172f738819a9b44cab924e6155263a Mon Sep 17 00:00:00 2001
From: sovlookup <805408477@qq.com>
Date: Thu, 28 Jan 2021 22:20:15 +0800
Subject: [PATCH 15/26] add arangodb integration

---
 packages/server/src/integrations/arangodb.js | 8 ++------
 1 file changed, 2 insertions(+), 6 deletions(-)

diff --git a/packages/server/src/integrations/arangodb.js b/packages/server/src/integrations/arangodb.js
index 2b3ee1b11b..c886b6b918 100644
--- a/packages/server/src/integrations/arangodb.js
+++ b/packages/server/src/integrations/arangodb.js
@@ -52,9 +52,7 @@ class ArangoDBIntegration {
   async read(query) {
     try {
       const result = await this.client.query(query.sql)
-      let rl = []
-      await result.forEach(r => rl.push(r))
-      return rl
+      return result.forEach(r => rl.push(r))
     } catch (err) {
       console.error("Error querying arangodb", err.message)
       throw err
@@ -69,9 +67,7 @@ class ArangoDBIntegration {
       const result = await this.client.query(
         aql`INSERT ${query.json} INTO ${clc} LET n = NEW RETURN NEW`
       )
-      let rl = []
-      await result.forEach(r => rl.push(r))
-      return rl
+      return result.forEach(r => rl.push(r))
     } catch (err) {
       console.error("Error querying arangodb", err.message)
       throw err

From 136faa243b2681dd5d6a559f4482bbfc40d6bef6 Mon Sep 17 00:00:00 2001
From: sovlookup <805408477@qq.com>
Date: Thu, 28 Jan 2021 22:23:17 +0800
Subject: [PATCH 16/26] fix a little space

---
 packages/server/src/integrations/index.js | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/server/src/integrations/index.js b/packages/server/src/integrations/index.js
index 8ff89f4900..9f9d5a1530 100644
--- a/packages/server/src/integrations/index.js
+++ b/packages/server/src/integrations/index.js
@@ -32,7 +32,7 @@ const INTEGRATIONS = {
   SQL_SERVER: sqlServer.integration,
   AIRTABLE: airtable.integration,
   MYSQL: mysql.integration,
-  ARANGODB: arangodb.integration,
+  ARANGODB: arangodb.integration,
 }
 
 module.exports = {

From faaf4c6a270040a09ae9ce255f2931e16778e1a1 Mon Sep 17 00:00:00 2001
From: sovlookup <805408477@qq.com>
Date: Thu, 28 Jan 2021 22:26:53 +0800
Subject: [PATCH 17/26] this commit is ok

---
 packages/server/src/integrations/arangodb.js | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/packages/server/src/integrations/arangodb.js b/packages/server/src/integrations/arangodb.js
index c886b6b918..f4feed8246 100644
--- a/packages/server/src/integrations/arangodb.js
+++ b/packages/server/src/integrations/arangodb.js
@@ -52,6 +52,7 @@ class ArangoDBIntegration {
   async read(query) {
     try {
       const result = await this.client.query(query.sql)
+      let rl = []
       return result.forEach(r => rl.push(r))
     } catch (err) {
       console.error("Error querying arangodb", err.message)
@@ -67,6 +68,7 @@ class ArangoDBIntegration {
       const result = await this.client.query(
         aql`INSERT ${query.json} INTO ${clc} LET n = NEW RETURN NEW`
       )
+      let rl = []
       return result.forEach(r => rl.push(r))
     } catch (err) {
       console.error("Error querying arangodb", err.message)

From 3f1797acd673177eac3fe9bda1b3b55fdbdfc992 Mon Sep 17 00:00:00 2001
From: sovlookup <805408477@qq.com>
Date: Thu, 28 Jan 2021 22:35:41 +0800
Subject: [PATCH 18/26] cannot return result directly fix it

---
 packages/server/src/integrations/arangodb.js | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/packages/server/src/integrations/arangodb.js b/packages/server/src/integrations/arangodb.js
index f4feed8246..2b3ee1b11b 100644
--- a/packages/server/src/integrations/arangodb.js
+++ b/packages/server/src/integrations/arangodb.js
@@ -53,7 +53,8 @@ class ArangoDBIntegration {
     try {
       const result = await this.client.query(query.sql)
       let rl = []
-      return result.forEach(r => rl.push(r))
+      await result.forEach(r => rl.push(r))
+      return rl
     } catch (err) {
       console.error("Error querying arangodb", err.message)
       throw err
@@ -69,7 +70,8 @@ class ArangoDBIntegration {
         aql`INSERT ${query.json} INTO ${clc} LET n = NEW RETURN NEW`
       )
       let rl = []
-      return result.forEach(r => rl.push(r))
+      await result.forEach(r => rl.push(r))
+      return rl
     } catch (err) {
       console.error("Error querying arangodb", err.message)
       throw err

From a2bafdc814bd6003aa6892f6ebf27e1c0cb778d2 Mon Sep 17 00:00:00 2001
From: sovlookup <805408477@qq.com>
Date: Thu, 28 Jan 2021 23:08:53 +0800
Subject: [PATCH 19/26] prettify code

---
 packages/server/src/integrations/arangodb.js | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/packages/server/src/integrations/arangodb.js b/packages/server/src/integrations/arangodb.js
index 2b3ee1b11b..10449fc967 100644
--- a/packages/server/src/integrations/arangodb.js
+++ b/packages/server/src/integrations/arangodb.js
@@ -52,9 +52,7 @@ class ArangoDBIntegration {
   async read(query) {
     try {
       const result = await this.client.query(query.sql)
-      let rl = []
-      await result.forEach(r => rl.push(r))
-      return rl
+      return result.all()
     } catch (err) {
       console.error("Error querying arangodb", err.message)
       throw err
@@ -67,11 +65,9 @@ class ArangoDBIntegration {
     const clc = this.client.collection(this.config.collection)
     try {
       const result = await this.client.query(
-        aql`INSERT ${query.json} INTO ${clc} LET n = NEW RETURN NEW`
+        aql`INSERT ${query.json} INTO ${clc} RETURN NEW`
       )
-      let rl = []
-      await result.forEach(r => rl.push(r))
-      return rl
+      return result.all()
     } catch (err) {
       console.error("Error querying arangodb", err.message)
       throw err

From f745975a0c06b44b4796045b7b8864fc4243933c Mon Sep 17 00:00:00 2001
From: Martin McKeaveney <martin@shogunsystems.co.uk>
Date: Thu, 28 Jan 2021 19:32:13 +0000
Subject: [PATCH 20/26] privacy features + allow builder usage without cloud
 API key

---
 packages/builder/src/analytics.js             | 13 +++
 .../DatasourceNavigator/icons/ArangoDB.svelte | 53 ++++++++----
 .../components/settings/tabs/APIKeys.svelte   | 10 ++-
 .../start/BuilderSettingsModal.svelte         | 21 +++++
 .../components/start/CreateAppModal.svelte    | 42 +---------
 .../pages/[application]/deploy/index.svelte   | 12 +++
 packages/builder/src/pages/index.svelte       |  5 +-
 packages/server/yarn.lock                     | 81 ++++++++++++++++++-
 8 files changed, 172 insertions(+), 65 deletions(-)

diff --git a/packages/builder/src/analytics.js b/packages/builder/src/analytics.js
index f59d71ac30..c68f228c12 100644
--- a/packages/builder/src/analytics.js
+++ b/packages/builder/src/analytics.js
@@ -106,6 +106,16 @@ function highlightFeedbackIcon() {
   return isFeedbackTimeElapsed(firstRunStr)
 }
 
+// Opt In/Out
+const ifAnalyticsEnabled = func => () => {
+  if (analyticsEnabled && process.env.POSTHOG_TOKEN) {
+    return func()
+  }
+}
+const disabled = () => posthog.has_opted_out_capturing()
+const optIn = () => posthog.opt_in_capturing()
+const optOut = () => posthog.opt_out_capturing()
+
 export default {
   activate,
   identify,
@@ -115,4 +125,7 @@ export default {
   requestFeedbackOnDeploy,
   submitFeedback,
   highlightFeedbackIcon,
+  disabled: ifAnalyticsEnabled(disabled),
+  optIn: ifAnalyticsEnabled(optIn),
+  optOut: ifAnalyticsEnabled(optOut),
 }
diff --git a/packages/builder/src/components/backend/DatasourceNavigator/icons/ArangoDB.svelte b/packages/builder/src/components/backend/DatasourceNavigator/icons/ArangoDB.svelte
index 0be4ca2663..d305c08af0 100644
--- a/packages/builder/src/components/backend/DatasourceNavigator/icons/ArangoDB.svelte
+++ b/packages/builder/src/components/backend/DatasourceNavigator/icons/ArangoDB.svelte
@@ -3,20 +3,39 @@
   export let height = "100"
 </script>
 
-
-<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" {width} {height} viewBox="0 0 2900 2000" >
-<g id="layer101">
- <path fill="#5b350f" d="M735 1983 c-137 -19 -322 -95 -431 -175 -138 -103 -250 -315 -284 -542 -24 -161 22 -298 129 -382 123 -97 318 -180 577 -243 l130 -32 29 -67 c41 -94 135 -231 199 -289 292 -267 732 -319 1094 -128 148 79 224 151 418 400 137 176 173 242 228 414 41 130 70 301 70 416 0 236 -146 421 -382 484 -206 56 -392 19 -733 -144 -96 -47 -181 -85 -189 -85 -7 0 -61 46 -119 103 -163 159 -283 231 -433 261 -71 15 -229 19 -303 9z"/>
- </g>
-<g id="layer102">
- <path fill="#406f23" d="M735 1983 c-137 -19 -322 -95 -431 -175 -138 -103 -250 -315 -284 -542 -24 -161 22 -298 129 -382 123 -97 318 -180 577 -243 l130 -32 29 -67 c41 -94 135 -231 199 -289 292 -267 732 -319 1094 -128 148 79 224 151 418 400 137 176 173 242 228 414 41 130 70 301 70 416 0 236 -146 421 -382 484 -206 56 -392 19 -733 -144 -96 -47 -181 -85 -189 -85 -7 0 -61 46 -119 103 -163 159 -283 231 -433 261 -71 15 -229 19 -303 9z m460 -643 c163 -51 296 -150 329 -246 23 -69 20 -93 -20 -174 -51 -100 -126 -173 -238 -230 l-89 -45 -131 0 c-151 0 -222 18 -323 84 -138 89 -243 264 -243 406 0 62 12 76 120 134 160 85 229 102 405 96 87 -2 139 -9 190 -25z"/>
- </g>
-<g id="layer103">
- <path fill="#c6d821" d="M2215 1789 c-27 -4 -68 -15 -90 -23 -42 -15 -264 -116 -397 -180 l-77 -38 78 -102 c102 -134 144 -208 175 -305 37 -116 49 -200 44 -309 -7 -157 -46 -218 -175 -278 -94 -44 -178 -56 -313 -43 -108 10 -401 53 -479 70 -24 5 -45 8 -47 6 -2 -2 20 -44 49 -92 67 -115 176 -225 281 -284 87 -49 235 -103 335 -121 91 -16 253 -14 346 5 175 37 269 95 419 264 307 347 422 563 457 859 18 148 9 247 -29 325 -88 179 -340 286 -577 246z"/>
- <path fill="#c6d821" d="M549 1680 c-272 -34 -426 -142 -495 -346 -22 -68 -26 -91 -22 -164 6 -115 32 -173 112 -248 70 -65 236 -153 370 -196 241 -79 722 -172 985 -192 180 -14 343 55 404 170 34 64 30 168 -11 271 -88 223 -245 373 -568 542 -222 116 -379 161 -584 168 -69 2 -155 0 -191 -5z m646 -340 c163 -51 296 -150 329 -246 23 -69 20 -93 -20 -174 -50 -100 -126 -173 -235 -229 -84 -42 -90 -44 -200 -48 -190 -8 -312 37 -434 161 -98 99 -155 221 -155 331 0 62 12 76 120 134 160 85 229 102 405 96 87 -2 139 -9 190 -25z"/>
- </g>
-<g id="layer104">
- <path fill="#f6f654" d="M2190 1721 c-57 -19 -469 -184 -494 -198 -12 -7 -5 -21 34 -72 28 -35 71 -96 97 -137 l46 -74 69 0 c38 0 83 -6 102 -14 52 -22 105 -75 139 -140 28 -55 32 -70 32 -147 0 -84 -2 -90 -48 -183 -96 -187 -234 -296 -376 -296 -44 0 -80 7 -110 20 -28 13 -65 20 -105 20 -72 0 -264 22 -426 49 -63 10 -117 17 -118 15 -10 -8 59 -113 110 -169 106 -115 238 -183 448 -231 155 -35 313 -29 447 17 78 27 210 117 279 191 82 89 277 353 336 456 92 159 137 344 125 513 -9 117 -37 189 -101 258 -109 116 -332 172 -486 122z"/>
- <path fill="#f6f654" d="M490 1624 c-153 -33 -275 -125 -339 -257 -54 -109 -59 -201 -17 -301 32 -76 164 -189 288 -245 51 -23 260 -91 281 -91 3 0 -21 25 -54 56 -94 91 -150 193 -170 313 -14 90 1 111 123 172 161 81 195 91 343 96 111 5 143 2 215 -16 221 -55 380 -192 380 -327 0 -52 -46 -143 -106 -212 -75 -85 -233 -170 -323 -173 -25 -1 -25 -1 4 -10 140 -43 411 -62 527 -38 142 30 238 125 238 234 0 88 -58 230 -139 337 -105 139 -431 343 -676 423 -161 52 -429 71 -575 39z"/>
- </g>
-</svg>
\ No newline at end of file
+<svg
+  version="1.1"
+  xmlns="http://www.w3.org/2000/svg"
+  xmlns:xlink="http://www.w3.org/1999/xlink"
+  x="0px"
+  y="0px"
+  {width}
+  {height}
+  viewBox="0 0 2900 2000">
+  <g id="layer101">
+    <path
+      fill="#5b350f"
+      d="M735 1983 c-137 -19 -322 -95 -431 -175 -138 -103 -250 -315 -284 -542 -24 -161 22 -298 129 -382 123 -97 318 -180 577 -243 l130 -32 29 -67 c41 -94 135 -231 199 -289 292 -267 732 -319 1094 -128 148 79 224 151 418 400 137 176 173 242 228 414 41 130 70 301 70 416 0 236 -146 421 -382 484 -206 56 -392 19 -733 -144 -96 -47 -181 -85 -189 -85 -7 0 -61 46 -119 103 -163 159 -283 231 -433 261 -71 15 -229 19 -303 9z" />
+  </g>
+  <g id="layer102">
+    <path
+      fill="#406f23"
+      d="M735 1983 c-137 -19 -322 -95 -431 -175 -138 -103 -250 -315 -284 -542 -24 -161 22 -298 129 -382 123 -97 318 -180 577 -243 l130 -32 29 -67 c41 -94 135 -231 199 -289 292 -267 732 -319 1094 -128 148 79 224 151 418 400 137 176 173 242 228 414 41 130 70 301 70 416 0 236 -146 421 -382 484 -206 56 -392 19 -733 -144 -96 -47 -181 -85 -189 -85 -7 0 -61 46 -119 103 -163 159 -283 231 -433 261 -71 15 -229 19 -303 9z m460 -643 c163 -51 296 -150 329 -246 23 -69 20 -93 -20 -174 -51 -100 -126 -173 -238 -230 l-89 -45 -131 0 c-151 0 -222 18 -323 84 -138 89 -243 264 -243 406 0 62 12 76 120 134 160 85 229 102 405 96 87 -2 139 -9 190 -25z" />
+  </g>
+  <g id="layer103">
+    <path
+      fill="#c6d821"
+      d="M2215 1789 c-27 -4 -68 -15 -90 -23 -42 -15 -264 -116 -397 -180 l-77 -38 78 -102 c102 -134 144 -208 175 -305 37 -116 49 -200 44 -309 -7 -157 -46 -218 -175 -278 -94 -44 -178 -56 -313 -43 -108 10 -401 53 -479 70 -24 5 -45 8 -47 6 -2 -2 20 -44 49 -92 67 -115 176 -225 281 -284 87 -49 235 -103 335 -121 91 -16 253 -14 346 5 175 37 269 95 419 264 307 347 422 563 457 859 18 148 9 247 -29 325 -88 179 -340 286 -577 246z" />
+    <path
+      fill="#c6d821"
+      d="M549 1680 c-272 -34 -426 -142 -495 -346 -22 -68 -26 -91 -22 -164 6 -115 32 -173 112 -248 70 -65 236 -153 370 -196 241 -79 722 -172 985 -192 180 -14 343 55 404 170 34 64 30 168 -11 271 -88 223 -245 373 -568 542 -222 116 -379 161 -584 168 -69 2 -155 0 -191 -5z m646 -340 c163 -51 296 -150 329 -246 23 -69 20 -93 -20 -174 -50 -100 -126 -173 -235 -229 -84 -42 -90 -44 -200 -48 -190 -8 -312 37 -434 161 -98 99 -155 221 -155 331 0 62 12 76 120 134 160 85 229 102 405 96 87 -2 139 -9 190 -25z" />
+  </g>
+  <g id="layer104">
+    <path
+      fill="#f6f654"
+      d="M2190 1721 c-57 -19 -469 -184 -494 -198 -12 -7 -5 -21 34 -72 28 -35 71 -96 97 -137 l46 -74 69 0 c38 0 83 -6 102 -14 52 -22 105 -75 139 -140 28 -55 32 -70 32 -147 0 -84 -2 -90 -48 -183 -96 -187 -234 -296 -376 -296 -44 0 -80 7 -110 20 -28 13 -65 20 -105 20 -72 0 -264 22 -426 49 -63 10 -117 17 -118 15 -10 -8 59 -113 110 -169 106 -115 238 -183 448 -231 155 -35 313 -29 447 17 78 27 210 117 279 191 82 89 277 353 336 456 92 159 137 344 125 513 -9 117 -37 189 -101 258 -109 116 -332 172 -486 122z" />
+    <path
+      fill="#f6f654"
+      d="M490 1624 c-153 -33 -275 -125 -339 -257 -54 -109 -59 -201 -17 -301 32 -76 164 -189 288 -245 51 -23 260 -91 281 -91 3 0 -21 25 -54 56 -94 91 -150 193 -170 313 -14 90 1 111 123 172 161 81 195 91 343 96 111 5 143 2 215 -16 221 -55 380 -192 380 -327 0 -52 -46 -143 -106 -212 -75 -85 -233 -170 -323 -173 -25 -1 -25 -1 4 -10 140 -43 411 -62 527 -38 142 30 238 125 238 234 0 88 -58 230 -139 337 -105 139 -431 343 -676 423 -161 52 -429 71 -575 39z" />
+  </g>
+</svg>
diff --git a/packages/builder/src/components/settings/tabs/APIKeys.svelte b/packages/builder/src/components/settings/tabs/APIKeys.svelte
index 8e569596a4..82e66a12fd 100644
--- a/packages/builder/src/components/settings/tabs/APIKeys.svelte
+++ b/packages/builder/src/components/settings/tabs/APIKeys.svelte
@@ -1,6 +1,7 @@
 <script>
-  import { Input, Label } from "@budibase/bbui"
+  import { Input, Label, TextButton } from "@budibase/bbui"
   import api from "builderStore/api"
+  import { notifier } from "builderStore/store/notifications"
   import { backendUiStore } from "builderStore"
   import analytics from "analytics"
 
@@ -10,7 +11,7 @@
     if (key === "budibase") {
       const isValid = await analytics.identifyByApiKey(value)
       if (!isValid) {
-        // TODO: add validation message
+        notifier.danger("Your API Key is invalid.")
         keys = { ...keys }
         return
       }
@@ -38,7 +39,10 @@
     thin
     edit
     value={keys.budibase}
-    label="Budibase API Key" />
+    label="Budibase Cloud API Key" />
+  <TextButton text medium blue href="https://portal.budi.live">
+    Log in to the Budibase Hosting Portal to get your API Key. →
+  </TextButton>
   <div>
     <Label extraSmall grey>Instance ID (Webhooks)</Label>
     <span>{$backendUiStore.selectedDatabase._id}</span>
diff --git a/packages/builder/src/components/start/BuilderSettingsModal.svelte b/packages/builder/src/components/start/BuilderSettingsModal.svelte
index 6be420b5f9..ec3f3c7827 100644
--- a/packages/builder/src/components/start/BuilderSettingsModal.svelte
+++ b/packages/builder/src/components/start/BuilderSettingsModal.svelte
@@ -10,6 +10,8 @@
   let hostingInfo
   let selfhosted = false
 
+  $: analyticsDisabled = analytics.disabled()
+
   async function save() {
     hostingInfo.type = selfhosted ? HostingTypes.SELF : HostingTypes.CLOUD
     if (!selfhosted && hostingInfo._rev) {
@@ -35,6 +37,15 @@
     }
   }
 
+  function toggleAnalytics() {
+    console.log(analyticsDisabled)
+    if (analyticsDisabled) {
+      analytics.optIn()
+    } else {
+      analytics.optOut()
+    }
+  }
+
   onMount(async () => {
     hostingInfo = await hostingStore.actions.fetch()
     selfhosted = hostingInfo.type === "self"
@@ -59,6 +70,16 @@
     <Input bind:value={hostingInfo.selfHostKey} label="Hosting Key" />
     <Toggle thin text="HTTPS" bind:checked={hostingInfo.useHttps} />
   {/if}
+  <h5>Analytics</h5>
+  <p>
+    If you would like to send analytics that help us make budibase better,
+    please let us know below.
+  </p>
+  <Toggle
+    thin
+    text="Send Analytics To Budibase"
+    checked={!analyticsDisabled}
+    on:change={toggleAnalytics} />
 </ModalContent>
 
 <style>
diff --git a/packages/builder/src/components/start/CreateAppModal.svelte b/packages/builder/src/components/start/CreateAppModal.svelte
index 1e93892f86..836fbf2dd9 100644
--- a/packages/builder/src/components/start/CreateAppModal.svelte
+++ b/packages/builder/src/components/start/CreateAppModal.svelte
@@ -22,36 +22,11 @@
   //Move this to context="module" once svelte-forms is updated so that it can bind to stores correctly
   const createAppStore = writable({ currentStep: 0, values: {} })
 
-  export let hasKey
   export let template
 
-  let isApiKeyValid
   let lastApiKey
   let fetchApiKeyPromise
 
-  const validateApiKey = async apiKey => {
-    if (isApiKeyValid) return true
-    if (!apiKey) return false
-
-    // make sure we only fetch once, unless API Key is changed
-    if (isApiKeyValid === undefined || apiKey !== lastApiKey) {
-      lastApiKey = apiKey
-      // svelte reactivity was causing a requst to get fired mutiple times
-      // so, we make everything await the same promise, if one exists
-      if (!fetchApiKeyPromise) {
-        fetchApiKeyPromise = analytics.identifyByApiKey(apiKey)
-      }
-      isApiKeyValid = await fetchApiKeyPromise
-      fetchApiKeyPromise = undefined
-    }
-    return isApiKeyValid
-  }
-
-  const apiValidation = {
-    apiKey: string()
-      .required("Please enter your API key.")
-      .test("valid-apikey", "This API key is invalid", validateApiKey),
-  }
   const infoValidation = {
     applicationName: string().required("Your application must have a name."),
   }
@@ -66,9 +41,9 @@
   let submitting = false
   let errors = {}
   let validationErrors = {}
-  let validationSchemas = [apiValidation, infoValidation, userValidation]
+  let validationSchemas = [infoValidation, userValidation]
 
-  function buildStep(component) {
+  function buildStep(component, skippable) {
     return {
       component,
       errors,
@@ -76,7 +51,7 @@
   }
 
   // steps need to be initialized for cypress from the get go
-  let steps = [buildStep(API), buildStep(Info), buildStep(User)]
+  let steps = [buildStep(Info), buildStep(User)]
 
   onMount(async () => {
     let hostingInfo = await hostingStore.actions.fetch()
@@ -87,17 +62,11 @@
       infoValidation.applicationName = string()
         .required("Your application must have a name.")
         .notOneOf(existingAppNames)
-      isApiKeyValid = true
       steps = [buildStep(Info), buildStep(User)]
       validationSchemas = [infoValidation, userValidation]
     }
   })
 
-  if (hasKey) {
-    validationSchemas.shift()
-    steps.shift()
-  }
-
   // Handles form navigation
   const back = () => {
     if ($createAppStore.currentStep > 0) {
@@ -145,11 +114,6 @@
   async function createNewApp() {
     submitting = true
     try {
-      // Add API key if there is none.
-      if (!hasKey) {
-        await updateKey(["budibase", $createAppStore.values.apiKey])
-      }
-
       // Create App
       const appResp = await post("/api/applications", {
         name: $createAppStore.values.applicationName,
diff --git a/packages/builder/src/pages/[application]/deploy/index.svelte b/packages/builder/src/pages/[application]/deploy/index.svelte
index c1f081f571..d7e75e9a8e 100644
--- a/packages/builder/src/pages/[application]/deploy/index.svelte
+++ b/packages/builder/src/pages/[application]/deploy/index.svelte
@@ -17,6 +17,18 @@
   $: appId = $store.appId
 
   async function deployApp() {
+    // Must have cloud or self host API key to deploy
+    if (!$hostingStore.hostingInfo?.selfHostKey) {
+      const response = await api.get(`/api/keys/`)
+      const userKeys = await response.json()
+      if (!userKeys.budibase) {
+        notifier.danger(
+          "No budibase API Keys configured. You must set either a self hosted or cloud API key to deploy your budibase app."
+        )
+      }
+      return
+    }
+
     const DEPLOY_URL = `/api/deploy`
 
     try {
diff --git a/packages/builder/src/pages/index.svelte b/packages/builder/src/pages/index.svelte
index fcf0f5af52..7de3a2bb35 100644
--- a/packages/builder/src/pages/index.svelte
+++ b/packages/builder/src/pages/index.svelte
@@ -1,4 +1,5 @@
 <script>
+  import { store } from "builderStore"
   import api from "builderStore/api"
   import AppList from "components/start/AppList.svelte"
   import { get } from "builderStore/api"
@@ -35,10 +36,6 @@
       hasKey = true
       analytics.identify(keys.userId)
     }
-
-    if (!keys.budibase) {
-      modal.show()
-    }
   }
 
   function selectTemplate(newTemplate) {
diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock
index 55450d3e0c..36efad1747 100644
--- a/packages/server/yarn.lock
+++ b/packages/server/yarn.lock
@@ -947,6 +947,11 @@
   resolved "https://registry.yarnpkg.com/@types/node/-/node-14.11.8.tgz#fe2012f2355e4ce08bca44aeb3abbb21cf88d33f"
   integrity sha512-KPcKqKm5UKDkaYPTuXSx8wEP7vE9GnuaXIZKijwRYcePpZFDVuy2a57LarFKiORbHOuTOOwYzxVxcUzsh2P2Pw==
 
+"@types/node@>=13.13.4":
+  version "14.14.22"
+  resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.22.tgz#0d29f382472c4ccf3bd96ff0ce47daf5b7b84b18"
+  integrity sha512-g+f/qj/cNcqKkc3tFqlXOYjrmZA+jNBiDzbP3kH+B+otKFqAdPgVTGP1IeKRdMml/aE69as5S4FqtxAbl+LaMw==
+
 "@types/node@>=8.0.0 <15":
   version "14.14.20"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.20.tgz#f7974863edd21d1f8a494a73e8e2b3658615c340"
@@ -1278,6 +1283,17 @@ app-builder-lib@22.9.1:
     semver "^7.3.2"
     temp-file "^3.3.7"
 
+arangojs@^7.2.0:
+  version "7.2.0"
+  resolved "https://registry.yarnpkg.com/arangojs/-/arangojs-7.2.0.tgz#e576926b4b3469c5a130cceba45fada8b5f015d1"
+  integrity sha512-9mQRCcttaG0lckapNF9TA71ZU7H2ATXK2a1w+0fj+Y4TlTP1bNDMIz3ZN+EnaSgEtwVu0rb6N6Ac97Yd56GmkQ==
+  dependencies:
+    "@types/node" ">=13.13.4"
+    es6-error "^4.0.1"
+    multi-part "^3.0.0"
+    x3-linkedlist "1.2.0"
+    xhr "^2.4.1"
+
 archive-type@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/archive-type/-/archive-type-4.0.0.tgz#f92e72233056dfc6969472749c267bdb046b1d70"
@@ -2759,7 +2775,7 @@ es3ify@^0.2.2:
     jstransform "~11.0.0"
     through "~2.3.4"
 
-es6-error@^4.1.1:
+es6-error@^4.0.1, es6-error@^4.1.1:
   version "4.1.1"
   resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d"
   integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==
@@ -3173,6 +3189,11 @@ file-type@^11.1.0:
   resolved "https://registry.yarnpkg.com/file-type/-/file-type-11.1.0.tgz#93780f3fed98b599755d846b99a1617a2ad063b8"
   integrity sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==
 
+file-type@^12.1.0:
+  version "12.4.2"
+  resolved "https://registry.yarnpkg.com/file-type/-/file-type-12.4.2.tgz#a344ea5664a1d01447ee7fb1b635f72feb6169d9"
+  integrity sha512-UssQP5ZgIOKelfsaB5CuGAL+Y+q7EmONuiwF3N5HAH0t27rvrttgi6Ra9k/+DVaY9UF6+ybxu5pOXLUdA8N7Vg==
+
 file-type@^3.8.0:
   version "3.9.0"
   resolved "https://registry.yarnpkg.com/file-type/-/file-type-3.9.0.tgz#257a078384d1db8087bc449d107d52a52672b9e9"
@@ -3524,6 +3545,14 @@ global@~4.3.0:
     min-document "^2.19.0"
     process "~0.5.1"
 
+global@~4.4.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
+  integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
+  dependencies:
+    min-document "^2.19.0"
+    process "^0.11.10"
+
 globals@^11.1.0:
   version "11.12.0"
   resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
@@ -5441,11 +5470,19 @@ mime-db@1.44.0:
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
   integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
 
-"mime-db@>= 1.43.0 < 2", mime-db@^1.28.0:
+mime-db@1.45.0, "mime-db@>= 1.43.0 < 2", mime-db@^1.28.0:
   version "1.45.0"
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea"
   integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==
 
+mime-kind@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/mime-kind/-/mime-kind-3.0.0.tgz#23bb3aba03ed6a1ea8c4f6093a9c7ab7121a9cb2"
+  integrity sha512-sx9lClVP7GXY2mO3aVDWTQLhfvAdDvNhGi3o3g7+ae3aKaoybeGbEIlnreoRKjrbDpvlPltlkIryxOtatojeXQ==
+  dependencies:
+    file-type "^12.1.0"
+    mime-types "^2.1.24"
+
 mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19, mime-types@~2.1.24:
   version "2.1.27"
   resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
@@ -5453,6 +5490,13 @@ mime-types@^2.1.12, mime-types@^2.1.18, mime-types@~2.1.19, mime-types@~2.1.24:
   dependencies:
     mime-db "1.44.0"
 
+mime-types@^2.1.24:
+  version "2.1.28"
+  resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd"
+  integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==
+  dependencies:
+    mime-db "1.45.0"
+
 mime@^1.3.4, mime@^1.4.1:
   version "1.6.0"
   resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
@@ -5549,6 +5593,19 @@ mssql@^6.2.3:
     tarn "^1.1.5"
     tedious "^6.6.2"
 
+multi-part-lite@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/multi-part-lite/-/multi-part-lite-1.0.0.tgz#7b86baf8ff83ef20ca13f1269a0f35aec42b9000"
+  integrity sha512-KxIRbBZZ45hoKX1ROD/19wJr0ql1bef1rE8Y1PCwD3PuNXV42pp7Wo8lEHYuAajoT4vfAFcd3rPjlkyEEyt1nw==
+
+multi-part@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/multi-part/-/multi-part-3.0.0.tgz#2bde386e8c1dcc9f15a2277267a7f5ed13aa0cc0"
+  integrity sha512-pDbdYQ6DLDxAsD83w9R7r7rlW56cETL7hIB5bCWX7FJYw0K+kL5JwHr0I8tRk9lGeFcAzf+2OEzXWlG/4wCnFw==
+  dependencies:
+    mime-kind "^3.0.0"
+    multi-part-lite "^1.0.0"
+
 mute-stream@0.0.8:
   version "0.0.8"
   resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
@@ -6452,6 +6509,11 @@ process-nextick-args@~2.0.0:
   resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
   integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
 
+process@^0.11.10:
+  version "0.11.10"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+  integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
+
 process@~0.5.1:
   version "0.5.2"
   resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
@@ -8264,6 +8326,11 @@ ws@^5.2.0:
   dependencies:
     async-limiter "~1.0.0"
 
+x3-linkedlist@1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/x3-linkedlist/-/x3-linkedlist-1.2.0.tgz#c70467559b7c748595f0f79222af1d709402699e"
+  integrity sha512-mH/YwxpYSKNa8bDNF1yOuZCMuV+K80LtDN8vcLDUAwNazCxptDNsYt+zA/EJeYiGbdtKposhKLZjErGVOR8mag==
+
 xdg-basedir@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
@@ -8279,6 +8346,16 @@ xhr@^2.0.1:
     parse-headers "^2.0.0"
     xtend "^4.0.0"
 
+xhr@^2.4.1:
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.6.0.tgz#b69d4395e792b4173d6b7df077f0fc5e4e2b249d"
+  integrity sha512-/eCGLb5rxjx5e3mF1A7s+pLlR6CGyqWN91fv1JgER5mVWg1MZmlhBvy9kjcsOdRk8RrIujotWyJamfyrp+WIcA==
+  dependencies:
+    global "~4.4.0"
+    is-function "^1.0.1"
+    parse-headers "^2.0.0"
+    xtend "^4.0.0"
+
 xml-name-validator@^3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"

From 1f84372cccffce0de137b772e5c8b8890c0a8d23 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney <martin@shogunsystems.co.uk>
Date: Thu, 28 Jan 2021 19:34:24 +0000
Subject: [PATCH 21/26] remove log

---
 .../builder/src/components/start/BuilderSettingsModal.svelte     | 1 -
 1 file changed, 1 deletion(-)

diff --git a/packages/builder/src/components/start/BuilderSettingsModal.svelte b/packages/builder/src/components/start/BuilderSettingsModal.svelte
index ec3f3c7827..9409820662 100644
--- a/packages/builder/src/components/start/BuilderSettingsModal.svelte
+++ b/packages/builder/src/components/start/BuilderSettingsModal.svelte
@@ -38,7 +38,6 @@
   }
 
   function toggleAnalytics() {
-    console.log(analyticsDisabled)
     if (analyticsDisabled) {
       analytics.optIn()
     } else {

From d3e398984c9a9494f13f4c06b8173275b89bf946 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney <martin@shogunsystems.co.uk>
Date: Thu, 28 Jan 2021 19:35:04 +0000
Subject: [PATCH 22/26] remove superfluous param

---
 packages/builder/src/components/start/CreateAppModal.svelte | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/packages/builder/src/components/start/CreateAppModal.svelte b/packages/builder/src/components/start/CreateAppModal.svelte
index 836fbf2dd9..945295ec51 100644
--- a/packages/builder/src/components/start/CreateAppModal.svelte
+++ b/packages/builder/src/components/start/CreateAppModal.svelte
@@ -43,7 +43,7 @@
   let validationErrors = {}
   let validationSchemas = [infoValidation, userValidation]
 
-  function buildStep(component, skippable) {
+  function buildStep(component) {
     return {
       component,
       errors,

From f7aa34be1323fefa64ced534fd6bed34cd3020b4 Mon Sep 17 00:00:00 2001
From: yashank09 <yashank@hey.com>
Date: Thu, 28 Jan 2021 23:23:44 -0800
Subject: [PATCH 23/26] adds placeholder on automation trigger

---
 .../src/components/automation/SetupPanel/SchemaSetup.svelte      | 1 +
 1 file changed, 1 insertion(+)

diff --git a/packages/builder/src/components/automation/SetupPanel/SchemaSetup.svelte b/packages/builder/src/components/automation/SetupPanel/SchemaSetup.svelte
index 8855fb6895..50e7346876 100644
--- a/packages/builder/src/components/automation/SetupPanel/SchemaSetup.svelte
+++ b/packages/builder/src/components/automation/SetupPanel/SchemaSetup.svelte
@@ -43,6 +43,7 @@
       <Input
         value={field.name}
         secondary
+        placeholder="Enter field name"
         on:change={fieldNameChanged(field.name)} />
       <Select
         secondary

From c8b8ddb67fd9fd83ca0af8ef0ca4f32713f1a058 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney <martin@shogunsystems.co.uk>
Date: Fri, 29 Jan 2021 10:41:08 +0000
Subject: [PATCH 24/26] add support for staging image that gets built on master
 push

---
 .github/workflows/budibase_ci.yml              |  9 +++++++++
 hosting/scripts/linux/release-to-docker-hub.sh | 10 ++++++++--
 package.json                                   |  3 ++-
 3 files changed, 19 insertions(+), 3 deletions(-)

diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml
index e03768a420..ccbfa3ae24 100644
--- a/.github/workflows/budibase_ci.yml
+++ b/.github/workflows/budibase_ci.yml
@@ -34,3 +34,12 @@ jobs:
         CI: true
         name: Budibase CI
     - run: yarn test:e2e:ci
+
+    - name: Build and Push Staging Docker Image
+      # Only run on push
+      if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
+      run: yarn build:staging:docker
+      env:
+        DOCKER_USER: ${{ secrets.DOCKER_USERNAME }}
+        DOCKER_PASSWORD: ${{ secrets.DOCKER_API_KEY }}
+
diff --git a/hosting/scripts/linux/release-to-docker-hub.sh b/hosting/scripts/linux/release-to-docker-hub.sh
index b1921916e4..1661fed9f0 100755
--- a/hosting/scripts/linux/release-to-docker-hub.sh
+++ b/hosting/scripts/linux/release-to-docker-hub.sh
@@ -1,9 +1,15 @@
 #!/bin/bash
+
+tag=$1
+tag=${tag:-latest}
+
 pushd ../../build
 docker-compose build --force app-service
 docker-compose build --force worker-service
-docker tag build_app-service budibase/budibase-apps:latest
+
+docker tag build_app-service budibase/budibase-apps:$tag
+docker tag build_worker-service budibase/budibase-worker:$tag
+
 docker push budibase/budibase-apps
-docker tag build_worker-service budibase/budibase-worker:latest
 docker push budibase/budibase-worker
 popd
diff --git a/package.json b/package.json
index 37efca51ba..037e9c4b1c 100644
--- a/package.json
+++ b/package.json
@@ -33,6 +33,7 @@
     "format": "prettier --write \"{,!(node_modules)/**/}*.{js,jsx,svelte}\"",
     "test:e2e": "lerna run cy:test",
     "test:e2e:ci": "lerna run cy:ci",
-    "build:docker": "cd hosting/scripts/linux/ && ./release-to-docker-hub.sh && cd -"
+    "build:docker": "cd hosting/scripts/linux/ && ./release-to-docker-hub.sh && cd -",
+    "build:docker:staging": "cd hosting/scripts/linux/ && ./release-to-docker-hub.sh staging && cd -"
   }
 }

From 1aa86f4bffcbf712b68118924c35fb67f6f1140a Mon Sep 17 00:00:00 2001
From: Martin McKeaveney <martin@shogunsystems.co.uk>
Date: Fri, 29 Jan 2021 10:45:11 +0000
Subject: [PATCH 25/26] adding docker login command

---
 .github/workflows/budibase_ci.yml | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml
index ccbfa3ae24..171780a058 100644
--- a/.github/workflows/budibase_ci.yml
+++ b/.github/workflows/budibase_ci.yml
@@ -38,7 +38,9 @@ jobs:
     - name: Build and Push Staging Docker Image
       # Only run on push
       if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
-      run: yarn build:staging:docker
+      run: |
+        docker login -u $DOCKER_USER -p $DOCKER_PASSWORD
+        yarn build:staging:docker
       env:
         DOCKER_USER: ${{ secrets.DOCKER_USERNAME }}
         DOCKER_PASSWORD: ${{ secrets.DOCKER_API_KEY }}

From 5f727d6913448e3cb8c2b37fd9ea5a47b6e85829 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney <martin@budibase.com>
Date: Fri, 29 Jan 2021 12:11:40 +0000
Subject: [PATCH 26/26] Update budibase_ci.yml

---
 .github/workflows/budibase_ci.yml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/.github/workflows/budibase_ci.yml b/.github/workflows/budibase_ci.yml
index 171780a058..bd10833f91 100644
--- a/.github/workflows/budibase_ci.yml
+++ b/.github/workflows/budibase_ci.yml
@@ -40,7 +40,7 @@ jobs:
       if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
       run: |
         docker login -u $DOCKER_USER -p $DOCKER_PASSWORD
-        yarn build:staging:docker
+        yarn build:docker:staging
       env:
         DOCKER_USER: ${{ secrets.DOCKER_USERNAME }}
         DOCKER_PASSWORD: ${{ secrets.DOCKER_API_KEY }}