From b4c14bf8a60e565ed369be0f2e3606aee323ed3c Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Mon, 15 Mar 2021 21:26:50 +0000
Subject: [PATCH 001/135] v0.8.10
---
lerna.json | 2 +-
packages/builder/package.json | 6 +++---
packages/client/package.json | 6 +++---
packages/server/package.json | 8 ++++----
packages/standard-components/package.json | 2 +-
packages/string-templates/package.json | 2 +-
packages/worker/package.json | 2 +-
7 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/lerna.json b/lerna.json
index f63871e1c..3a3a6597b 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "version": "0.8.9",
+ "version": "0.8.10",
"npmClient": "yarn",
"packages": [
"packages/*"
diff --git a/packages/builder/package.json b/packages/builder/package.json
index 32389a985..9e5f7a6a2 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/builder",
- "version": "0.8.9",
+ "version": "0.8.10",
"license": "AGPL-3.0",
"private": true,
"scripts": {
@@ -64,9 +64,9 @@
},
"dependencies": {
"@budibase/bbui": "^1.58.13",
- "@budibase/client": "^0.8.9",
+ "@budibase/client": "^0.8.10",
"@budibase/colorpicker": "1.1.2",
- "@budibase/string-templates": "^0.8.9",
+ "@budibase/string-templates": "^0.8.10",
"@budibase/svelte-ag-grid": "^1.0.4",
"@sentry/browser": "5.19.1",
"@svelteschool/svelte-forms": "0.7.0",
diff --git a/packages/client/package.json b/packages/client/package.json
index 192bacfbc..bb7325ff4 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/client",
- "version": "0.8.9",
+ "version": "0.8.10",
"license": "MPL-2.0",
"main": "dist/budibase-client.js",
"module": "dist/budibase-client.js",
@@ -9,13 +9,13 @@
"dev:builder": "rollup -cw"
},
"dependencies": {
- "@budibase/string-templates": "^0.8.9",
+ "@budibase/string-templates": "^0.8.10",
"regexparam": "^1.3.0",
"shortid": "^2.2.15",
"svelte-spa-router": "^3.0.5"
},
"devDependencies": {
- "@budibase/standard-components": "^0.8.9",
+ "@budibase/standard-components": "^0.8.10",
"@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 0a53aa8f5..db3370b67 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/server",
"email": "hi@budibase.com",
- "version": "0.8.9",
+ "version": "0.8.10",
"description": "Budibase Web Server",
"main": "src/electron.js",
"repository": {
@@ -71,8 +71,8 @@
"author": "Budibase",
"license": "AGPL-3.0-or-later",
"dependencies": {
- "@budibase/client": "^0.8.9",
- "@budibase/string-templates": "^0.8.9",
+ "@budibase/client": "^0.8.10",
+ "@budibase/string-templates": "^0.8.10",
"@elastic/elasticsearch": "7.10.0",
"@koa/router": "8.0.0",
"@sendgrid/mail": "7.1.1",
@@ -126,7 +126,7 @@
"zlib": "1.0.5"
},
"devDependencies": {
- "@budibase/standard-components": "^0.8.9",
+ "@budibase/standard-components": "^0.8.10",
"@jest/test-sequencer": "^24.8.0",
"cross-env": "^7.0.3",
"electron": "10.1.3",
diff --git a/packages/standard-components/package.json b/packages/standard-components/package.json
index 3e937cff4..f3243a577 100644
--- a/packages/standard-components/package.json
+++ b/packages/standard-components/package.json
@@ -35,7 +35,7 @@
"keywords": [
"svelte"
],
- "version": "0.8.9",
+ "version": "0.8.10",
"license": "MIT",
"gitHead": "1b95326b20d1352d36305910259228b96a683dc7",
"dependencies": {
diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json
index 6e0b57365..48f0f8d1a 100644
--- a/packages/string-templates/package.json
+++ b/packages/string-templates/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/string-templates",
- "version": "0.8.9",
+ "version": "0.8.10",
"description": "Handlebars wrapper for Budibase templating.",
"main": "src/index.js",
"module": "src/index.js",
diff --git a/packages/worker/package.json b/packages/worker/package.json
index 1670fd729..e0b7301a2 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/deployment",
"email": "hi@budibase.com",
- "version": "0.8.9",
+ "version": "0.8.10",
"description": "Budibase Deployment Server",
"main": "src/index.js",
"repository": {
From d64b80b1188a7834933a618810845c4df23b0edb Mon Sep 17 00:00:00 2001
From: Maurits Lourens
Date: Thu, 18 Mar 2021 09:08:39 +0100
Subject: [PATCH 002/135] 1292 - add help menu items related to budibase
instead of electron
---
packages/server/src/electron.js | 113 +++++++++++++++++++++++++++++++-
1 file changed, 111 insertions(+), 2 deletions(-)
diff --git a/packages/server/src/electron.js b/packages/server/src/electron.js
index 290c13e6a..f2770e1d4 100644
--- a/packages/server/src/electron.js
+++ b/packages/server/src/electron.js
@@ -1,4 +1,4 @@
-const { app, BrowserWindow, shell, dialog } = require("electron")
+const { app, BrowserWindow, shell, dialog, Menu } = require("electron")
const { join } = require("./utilities/centralPath")
const isDev = require("electron-is-dev")
const { autoUpdater } = require("electron-updater")
@@ -8,7 +8,7 @@ const initialiseBudibase = require("./utilities/initialiseBudibase")
const { budibaseAppsDir } = require("./utilities/budibaseDir")
const { openNewGitHubIssue, debugInfo } = require("electron-util")
const eventEmitter = require("./events")
-
+const isMac = process.platform === 'darwin';
const budibaseDir = budibaseAppsDir()
const envFile = join(budibaseDir, ".env")
@@ -87,6 +87,115 @@ async function startApp() {
// dock icon is clicked and there are no other windows open.
if (win === null) createWindow()
})
+
+ const template = [
+ // { role: 'appMenu' }
+ ...(isMac ? [{
+ label: app.name,
+ submenu: [
+ { role: 'about' },
+ { type: 'separator' },
+ { role: 'services' },
+ { type: 'separator' },
+ { role: 'hide' },
+ { role: 'hideothers' },
+ { role: 'unhide' },
+ { type: 'separator' },
+ { role: 'quit' }
+ ]
+ }] : []),
+ // { role: 'fileMenu' }
+ {
+ label: 'File',
+ submenu: [
+ isMac ? { role: 'close' } : { role: 'quit' }
+ ]
+ },
+ // { role: 'editMenu' }
+ {
+ label: 'Edit',
+ submenu: [
+ { role: 'undo' },
+ { role: 'redo' },
+ { type: 'separator' },
+ { role: 'cut' },
+ { role: 'copy' },
+ { role: 'paste' },
+ ...(isMac ? [
+ { role: 'pasteAndMatchStyle' },
+ { role: 'delete' },
+ { role: 'selectAll' },
+ { type: 'separator' },
+ {
+ label: 'Speech',
+ submenu: [
+ { role: 'startSpeaking' },
+ { role: 'stopSpeaking' }
+ ]
+ }
+ ] : [
+ { role: 'delete' },
+ { type: 'separator' },
+ { role: 'selectAll' }
+ ])
+ ]
+ },
+ // { role: 'viewMenu' }
+ {
+ label: 'View',
+ submenu: [
+ { role: 'reload' },
+ { role: 'forceReload' },
+ { role: 'toggleDevTools' },
+ { type: 'separator' },
+ { role: 'resetZoom' },
+ { role: 'zoomIn' },
+ { role: 'zoomOut' },
+ { type: 'separator' },
+ { role: 'togglefullscreen' }
+ ]
+ },
+ // { role: 'windowMenu' }
+ {
+ label: 'Window',
+ submenu: [
+ { role: 'minimize' },
+ { role: 'zoom' },
+ ...(isMac ? [
+ { type: 'separator' },
+ { role: 'front' },
+ { type: 'separator' },
+ { role: 'window' }
+ ] : [
+ { role: 'close' }
+ ])
+ ]
+ },
+ {
+ role: 'help',
+ submenu: [
+ {
+ label: 'Learn More',
+ click: () => shell.openExternal('https://www.budibase.com/')
+ },
+ {
+ label: 'Documentation',
+ click: () => shell.openExternal('https://docs.budibase.com/')
+ },
+ {
+ label: 'Search issues',
+ click: () => shell.openExternal('https://github.com/Budibase/budibase/issues')
+ },
+ {
+ label: 'Community discussions',
+ click: () => shell.openExternal('https://github.com/Budibase/budibase/discussions')
+ },
+ ]
+ }
+ ]
+
+ const menu = Menu.buildFromTemplate(template)
+ Menu.setApplicationMenu(menu)
}
autoUpdater.on("update-downloaded", (event, releaseNotes, releaseName) => {
From cefd3b96432bcd56dd2be91d96e720d69b46a969 Mon Sep 17 00:00:00 2001
From: Maurits Lourens
Date: Tue, 23 Mar 2021 20:32:22 +0100
Subject: [PATCH 003/135] fix build by running yarn format
---
.../PropertyControls/ColorPicker.svelte | 34 ++--
packages/server/src/electron.js | 155 +++++++++---------
2 files changed, 97 insertions(+), 92 deletions(-)
diff --git a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ColorPicker.svelte b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ColorPicker.svelte
index 6235e744f..c777f7966 100644
--- a/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ColorPicker.svelte
+++ b/packages/builder/src/components/design/PropertiesPanel/PropertyControls/ColorPicker.svelte
@@ -1,38 +1,42 @@
diff --git a/packages/server/src/electron.js b/packages/server/src/electron.js
index f2770e1d4..9f10384b1 100644
--- a/packages/server/src/electron.js
+++ b/packages/server/src/electron.js
@@ -8,7 +8,7 @@ const initialiseBudibase = require("./utilities/initialiseBudibase")
const { budibaseAppsDir } = require("./utilities/budibaseDir")
const { openNewGitHubIssue, debugInfo } = require("electron-util")
const eventEmitter = require("./events")
-const isMac = process.platform === 'darwin';
+const isMac = process.platform === "darwin"
const budibaseDir = budibaseAppsDir()
const envFile = join(budibaseDir, ".env")
@@ -90,108 +90,109 @@ async function startApp() {
const template = [
// { role: 'appMenu' }
- ...(isMac ? [{
- label: app.name,
- submenu: [
- { role: 'about' },
- { type: 'separator' },
- { role: 'services' },
- { type: 'separator' },
- { role: 'hide' },
- { role: 'hideothers' },
- { role: 'unhide' },
- { type: 'separator' },
- { role: 'quit' }
- ]
- }] : []),
+ ...(isMac
+ ? [
+ {
+ label: app.name,
+ submenu: [
+ { role: "about" },
+ { type: "separator" },
+ { role: "services" },
+ { type: "separator" },
+ { role: "hide" },
+ { role: "hideothers" },
+ { role: "unhide" },
+ { type: "separator" },
+ { role: "quit" },
+ ],
+ },
+ ]
+ : []),
// { role: 'fileMenu' }
{
- label: 'File',
- submenu: [
- isMac ? { role: 'close' } : { role: 'quit' }
- ]
+ label: "File",
+ submenu: [isMac ? { role: "close" } : { role: "quit" }],
},
// { role: 'editMenu' }
{
- label: 'Edit',
+ label: "Edit",
submenu: [
- { role: 'undo' },
- { role: 'redo' },
- { type: 'separator' },
- { role: 'cut' },
- { role: 'copy' },
- { role: 'paste' },
- ...(isMac ? [
- { role: 'pasteAndMatchStyle' },
- { role: 'delete' },
- { role: 'selectAll' },
- { type: 'separator' },
- {
- label: 'Speech',
- submenu: [
- { role: 'startSpeaking' },
- { role: 'stopSpeaking' }
+ { role: "undo" },
+ { role: "redo" },
+ { type: "separator" },
+ { role: "cut" },
+ { role: "copy" },
+ { role: "paste" },
+ ...(isMac
+ ? [
+ { role: "pasteAndMatchStyle" },
+ { role: "delete" },
+ { role: "selectAll" },
+ { type: "separator" },
+ {
+ label: "Speech",
+ submenu: [{ role: "startSpeaking" }, { role: "stopSpeaking" }],
+ },
]
- }
- ] : [
- { role: 'delete' },
- { type: 'separator' },
- { role: 'selectAll' }
- ])
- ]
+ : [{ role: "delete" }, { type: "separator" }, { role: "selectAll" }]),
+ ],
},
// { role: 'viewMenu' }
{
- label: 'View',
+ label: "View",
submenu: [
- { role: 'reload' },
- { role: 'forceReload' },
- { role: 'toggleDevTools' },
- { type: 'separator' },
- { role: 'resetZoom' },
- { role: 'zoomIn' },
- { role: 'zoomOut' },
- { type: 'separator' },
- { role: 'togglefullscreen' }
- ]
+ { role: "reload" },
+ { role: "forceReload" },
+ { role: "toggleDevTools" },
+ { type: "separator" },
+ { role: "resetZoom" },
+ { role: "zoomIn" },
+ { role: "zoomOut" },
+ { type: "separator" },
+ { role: "togglefullscreen" },
+ ],
},
// { role: 'windowMenu' }
{
- label: 'Window',
+ label: "Window",
submenu: [
- { role: 'minimize' },
- { role: 'zoom' },
- ...(isMac ? [
- { type: 'separator' },
- { role: 'front' },
- { type: 'separator' },
- { role: 'window' }
- ] : [
- { role: 'close' }
- ])
- ]
+ { role: "minimize" },
+ { role: "zoom" },
+ ...(isMac
+ ? [
+ { type: "separator" },
+ { role: "front" },
+ { type: "separator" },
+ { role: "window" },
+ ]
+ : [{ role: "close" }]),
+ ],
},
{
- role: 'help',
+ role: "help",
submenu: [
{
- label: 'Learn More',
- click: () => shell.openExternal('https://www.budibase.com/')
+ label: "Learn More",
+ click: () => shell.openExternal("https://www.budibase.com/"),
},
{
- label: 'Documentation',
- click: () => shell.openExternal('https://docs.budibase.com/')
+ label: "Documentation",
+ click: () => shell.openExternal("https://docs.budibase.com/"),
},
{
- label: 'Search issues',
- click: () => shell.openExternal('https://github.com/Budibase/budibase/issues')
+ label: "Search issues",
+ click: () =>
+ shell.openExternal("https://github.com/Budibase/budibase/issues"),
},
{
- label: 'Community discussions',
- click: () => shell.openExternal('https://github.com/Budibase/budibase/discussions')
+ label: "Community discussions",
+ click: () =>
+ shell.openExternal(
+ "https://github.com/Budibase/budibase/discussions"
+ ),
},
- ]
- }
+ ],
+ },
]
const menu = Menu.buildFromTemplate(template)
From 4d550d65a2aea55dfad0098d858c2bbc772e358b Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Wed, 24 Mar 2021 15:30:15 +0000
Subject: [PATCH 004/135] Update release.yml
---
.github/workflows/release.yml | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 14c0cc06a..c8a4fb180 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -1,6 +1,13 @@
name: Budibase Release
on:
+ workflow_dispatch:
+ inputs:
+ name:
+ description: 'Version'
+ required: false
+ default: '0.8'
+
# Trigger the workflow on push with tags,
# but only for the master branch
push:
From 9a47528775ee3941b72d1702c21021e028e687c1 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Wed, 24 Mar 2021 18:48:26 +0000
Subject: [PATCH 005/135] v0.8.11
---
lerna.json | 2 +-
packages/builder/package.json | 6 +++---
packages/client/package.json | 6 +++---
packages/server/package.json | 8 ++++----
packages/standard-components/package.json | 2 +-
packages/string-templates/package.json | 2 +-
packages/worker/package.json | 2 +-
7 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/lerna.json b/lerna.json
index 3a3a6597b..2291c7a7a 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "version": "0.8.10",
+ "version": "0.8.11",
"npmClient": "yarn",
"packages": [
"packages/*"
diff --git a/packages/builder/package.json b/packages/builder/package.json
index 9e5f7a6a2..9dd00acfc 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/builder",
- "version": "0.8.10",
+ "version": "0.8.11",
"license": "AGPL-3.0",
"private": true,
"scripts": {
@@ -64,9 +64,9 @@
},
"dependencies": {
"@budibase/bbui": "^1.58.13",
- "@budibase/client": "^0.8.10",
+ "@budibase/client": "^0.8.11",
"@budibase/colorpicker": "1.1.2",
- "@budibase/string-templates": "^0.8.10",
+ "@budibase/string-templates": "^0.8.11",
"@budibase/svelte-ag-grid": "^1.0.4",
"@sentry/browser": "5.19.1",
"@svelteschool/svelte-forms": "0.7.0",
diff --git a/packages/client/package.json b/packages/client/package.json
index bb7325ff4..f090cbf7f 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/client",
- "version": "0.8.10",
+ "version": "0.8.11",
"license": "MPL-2.0",
"main": "dist/budibase-client.js",
"module": "dist/budibase-client.js",
@@ -9,13 +9,13 @@
"dev:builder": "rollup -cw"
},
"dependencies": {
- "@budibase/string-templates": "^0.8.10",
+ "@budibase/string-templates": "^0.8.11",
"regexparam": "^1.3.0",
"shortid": "^2.2.15",
"svelte-spa-router": "^3.0.5"
},
"devDependencies": {
- "@budibase/standard-components": "^0.8.10",
+ "@budibase/standard-components": "^0.8.11",
"@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 db3370b67..b65247d03 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/server",
"email": "hi@budibase.com",
- "version": "0.8.10",
+ "version": "0.8.11",
"description": "Budibase Web Server",
"main": "src/electron.js",
"repository": {
@@ -71,8 +71,8 @@
"author": "Budibase",
"license": "AGPL-3.0-or-later",
"dependencies": {
- "@budibase/client": "^0.8.10",
- "@budibase/string-templates": "^0.8.10",
+ "@budibase/client": "^0.8.11",
+ "@budibase/string-templates": "^0.8.11",
"@elastic/elasticsearch": "7.10.0",
"@koa/router": "8.0.0",
"@sendgrid/mail": "7.1.1",
@@ -126,7 +126,7 @@
"zlib": "1.0.5"
},
"devDependencies": {
- "@budibase/standard-components": "^0.8.10",
+ "@budibase/standard-components": "^0.8.11",
"@jest/test-sequencer": "^24.8.0",
"cross-env": "^7.0.3",
"electron": "10.1.3",
diff --git a/packages/standard-components/package.json b/packages/standard-components/package.json
index f3243a577..cd20d7fff 100644
--- a/packages/standard-components/package.json
+++ b/packages/standard-components/package.json
@@ -35,7 +35,7 @@
"keywords": [
"svelte"
],
- "version": "0.8.10",
+ "version": "0.8.11",
"license": "MIT",
"gitHead": "1b95326b20d1352d36305910259228b96a683dc7",
"dependencies": {
diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json
index 48f0f8d1a..67f4d3c5d 100644
--- a/packages/string-templates/package.json
+++ b/packages/string-templates/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/string-templates",
- "version": "0.8.10",
+ "version": "0.8.11",
"description": "Handlebars wrapper for Budibase templating.",
"main": "src/index.js",
"module": "src/index.js",
diff --git a/packages/worker/package.json b/packages/worker/package.json
index e0b7301a2..1667e27a5 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/deployment",
"email": "hi@budibase.com",
- "version": "0.8.10",
+ "version": "0.8.11",
"description": "Budibase Deployment Server",
"main": "src/index.js",
"repository": {
From bbdd9351f0a1a6ca58dd076d44478fd75e640870 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Thu, 25 Mar 2021 10:27:48 +0000
Subject: [PATCH 006/135] Update release.yml
---
.github/workflows/release.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index c8a4fb180..1f2cb80d1 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -59,8 +59,8 @@ jobs:
mac_certs: ${{ secrets.mac_certs }}
mac_certs_password: ${{ secrets.mac_certs_password }}
- # windows_certs: ${{ secrets.windows_certs }}
- # windows_certs_password: ${{ secrets.windows_certs_password }}
+ windows_certs: ${{ secrets.windows_certs }}
+ windows_certs_password: ${{ secrets.windows_certs_password }}
# release the app after building
release: ${{ startsWith(github.ref, 'refs/tags/v') }}
From 6f2a1d45cc091088f33e9526b7a92934b334c305 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Thu, 25 Mar 2021 10:40:08 +0000
Subject: [PATCH 007/135] v0.8.12
---
lerna.json | 2 +-
packages/builder/package.json | 6 +++---
packages/client/package.json | 6 +++---
packages/server/package.json | 8 ++++----
packages/standard-components/package.json | 2 +-
packages/string-templates/package.json | 2 +-
packages/worker/package.json | 2 +-
7 files changed, 14 insertions(+), 14 deletions(-)
diff --git a/lerna.json b/lerna.json
index 2291c7a7a..5d71dc202 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "version": "0.8.11",
+ "version": "0.8.12",
"npmClient": "yarn",
"packages": [
"packages/*"
diff --git a/packages/builder/package.json b/packages/builder/package.json
index 9dd00acfc..3db29b060 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/builder",
- "version": "0.8.11",
+ "version": "0.8.12",
"license": "AGPL-3.0",
"private": true,
"scripts": {
@@ -64,9 +64,9 @@
},
"dependencies": {
"@budibase/bbui": "^1.58.13",
- "@budibase/client": "^0.8.11",
+ "@budibase/client": "^0.8.12",
"@budibase/colorpicker": "1.1.2",
- "@budibase/string-templates": "^0.8.11",
+ "@budibase/string-templates": "^0.8.12",
"@budibase/svelte-ag-grid": "^1.0.4",
"@sentry/browser": "5.19.1",
"@svelteschool/svelte-forms": "0.7.0",
diff --git a/packages/client/package.json b/packages/client/package.json
index f090cbf7f..af80ac21f 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/client",
- "version": "0.8.11",
+ "version": "0.8.12",
"license": "MPL-2.0",
"main": "dist/budibase-client.js",
"module": "dist/budibase-client.js",
@@ -9,13 +9,13 @@
"dev:builder": "rollup -cw"
},
"dependencies": {
- "@budibase/string-templates": "^0.8.11",
+ "@budibase/string-templates": "^0.8.12",
"regexparam": "^1.3.0",
"shortid": "^2.2.15",
"svelte-spa-router": "^3.0.5"
},
"devDependencies": {
- "@budibase/standard-components": "^0.8.11",
+ "@budibase/standard-components": "^0.8.12",
"@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 b65247d03..c6a051911 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/server",
"email": "hi@budibase.com",
- "version": "0.8.11",
+ "version": "0.8.12",
"description": "Budibase Web Server",
"main": "src/electron.js",
"repository": {
@@ -71,8 +71,8 @@
"author": "Budibase",
"license": "AGPL-3.0-or-later",
"dependencies": {
- "@budibase/client": "^0.8.11",
- "@budibase/string-templates": "^0.8.11",
+ "@budibase/client": "^0.8.12",
+ "@budibase/string-templates": "^0.8.12",
"@elastic/elasticsearch": "7.10.0",
"@koa/router": "8.0.0",
"@sendgrid/mail": "7.1.1",
@@ -126,7 +126,7 @@
"zlib": "1.0.5"
},
"devDependencies": {
- "@budibase/standard-components": "^0.8.11",
+ "@budibase/standard-components": "^0.8.12",
"@jest/test-sequencer": "^24.8.0",
"cross-env": "^7.0.3",
"electron": "10.1.3",
diff --git a/packages/standard-components/package.json b/packages/standard-components/package.json
index cd20d7fff..451db3320 100644
--- a/packages/standard-components/package.json
+++ b/packages/standard-components/package.json
@@ -35,7 +35,7 @@
"keywords": [
"svelte"
],
- "version": "0.8.11",
+ "version": "0.8.12",
"license": "MIT",
"gitHead": "1b95326b20d1352d36305910259228b96a683dc7",
"dependencies": {
diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json
index 67f4d3c5d..c5ee74f2d 100644
--- a/packages/string-templates/package.json
+++ b/packages/string-templates/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/string-templates",
- "version": "0.8.11",
+ "version": "0.8.12",
"description": "Handlebars wrapper for Budibase templating.",
"main": "src/index.js",
"module": "src/index.js",
diff --git a/packages/worker/package.json b/packages/worker/package.json
index 1667e27a5..adc219a22 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/deployment",
"email": "hi@budibase.com",
- "version": "0.8.11",
+ "version": "0.8.12",
"description": "Budibase Deployment Server",
"main": "src/index.js",
"repository": {
From f48b09d378f0500e1143e09651c915a6bfef8bf8 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Mon, 29 Mar 2021 15:00:40 +0100
Subject: [PATCH 008/135] Starting worker instance as part of the stack, some
changes to how environment handled for worker.
---
hosting/docker-compose.yaml | 2 +-
packages/worker/package.json | 10 +-
packages/worker/scripts/dev/manage.js | 42 ++
packages/worker/src/api/controllers/deploy.js | 2 +-
packages/worker/src/environment.js | 18 +-
packages/worker/src/index.js | 2 +-
packages/worker/yarn.lock | 647 +++++++++++++++++-
7 files changed, 710 insertions(+), 13 deletions(-)
create mode 100644 packages/worker/scripts/dev/manage.js
diff --git a/hosting/docker-compose.yaml b/hosting/docker-compose.yaml
index 8de5e9fcd..7b5a7612a 100644
--- a/hosting/docker-compose.yaml
+++ b/hosting/docker-compose.yaml
@@ -37,7 +37,7 @@ services:
PORT: 4003
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY}
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY}
- RAW_MINIO_URL: http://minio-service:9000
+ MINIO_URL: http://minio-service:9000
COUCH_DB_USERNAME: ${COUCH_DB_USER}
COUCH_DB_PASSWORD: ${COUCH_DB_PASSWORD}
COUCH_DB_URL: http://${COUCH_DB_USER}:${COUCH_DB_PASSWORD}@couchdb-service:5984
diff --git a/packages/worker/package.json b/packages/worker/package.json
index 7d88654a8..43deb14a5 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -1,5 +1,5 @@
{
- "name": "@budibase/deployment",
+ "name": "@budibase/worker",
"email": "hi@budibase.com",
"version": "0.8.9",
"description": "Budibase Deployment Server",
@@ -12,13 +12,16 @@
"budibase"
],
"scripts": {
- "run:docker": "node src/index.js"
+ "run:docker": "node src/index.js",
+ "dev:stack:init": "node ./scripts/dev/manage.js init",
+ "dev:builder": "npm run dev:stack:init && nodemon src/index.js"
},
"author": "Budibase",
"license": "AGPL-3.0-or-later",
"dependencies": {
"@koa/router": "^8.0.0",
"aws-sdk": "^2.811.0",
+ "dotenv": "^8.2.0",
"got": "^11.8.1",
"joi": "^17.2.1",
"koa": "^2.7.0",
@@ -33,5 +36,8 @@
"pouchdb": "^7.2.2",
"pouchdb-all-dbs": "^1.0.2",
"server-destroy": "^1.0.1"
+ },
+ "devDependencies": {
+ "nodemon": "^2.0.7"
}
}
diff --git a/packages/worker/scripts/dev/manage.js b/packages/worker/scripts/dev/manage.js
new file mode 100644
index 000000000..b7e92f6d1
--- /dev/null
+++ b/packages/worker/scripts/dev/manage.js
@@ -0,0 +1,42 @@
+#!/usr/bin/env node
+const path = require("path")
+const fs = require("fs")
+
+async function init() {
+ const envFilePath = path.join(process.cwd(), ".env")
+ if (fs.existsSync(envFilePath)) {
+ return
+ }
+ const envFileJson = {
+ SELF_HOSTED: 1,
+ PORT: 4002,
+ MINIO_ACCESS_KEY: "budibase",
+ MINIO_SECRET_KEY: "budibase",
+ COUCH_DB_USER: "budibase",
+ COUCH_DB_PASSWORD: "budibase",
+ MINIO_URL: "http://localhost:10000/",
+ COUCH_DB_URL: "http://budibase:budibase@localhost:10000/db/",
+ }
+ let envFile = ""
+ Object.keys(envFileJson).forEach(key => {
+ envFile += `${key}=${envFileJson[key]}\n`
+ })
+ fs.writeFileSync(envFilePath, envFile)
+}
+
+// if more than init required use this to determine the command type
+//const managementCommand = process.argv.slice(2)[0]
+
+// for now only one command
+let command = init
+
+command()
+ .then(() => {
+ console.log("Done! 🎉")
+ })
+ .catch(err => {
+ console.error(
+ "Something went wrong while managing budibase dev worker:",
+ err.message
+ )
+ })
diff --git a/packages/worker/src/api/controllers/deploy.js b/packages/worker/src/api/controllers/deploy.js
index 207be71c9..cbaf84208 100644
--- a/packages/worker/src/api/controllers/deploy.js
+++ b/packages/worker/src/api/controllers/deploy.js
@@ -43,7 +43,7 @@ async function getMinioSession() {
// make sure the bucket exists
const objClient = new AWS.S3({
- endpoint: env.RAW_MINIO_URL,
+ endpoint: env.MINIO_URL,
region: REGION,
s3ForcePathStyle: true, // needed with minio?
params: {
diff --git a/packages/worker/src/environment.js b/packages/worker/src/environment.js
index 0cd786086..b857dc609 100644
--- a/packages/worker/src/environment.js
+++ b/packages/worker/src/environment.js
@@ -1,16 +1,28 @@
+function isDev() {
+ return process.env.NODE_ENV !== "production"
+}
+
+let LOADED = false
+if (!LOADED && isDev()) {
+ require("dotenv").config()
+ LOADED = true
+}
+
module.exports = {
SELF_HOSTED: process.env.SELF_HOSTED,
PORT: process.env.PORT,
MINIO_ACCESS_KEY: process.env.MINIO_ACCESS_KEY,
MINIO_SECRET_KEY: process.env.MINIO_SECRET_KEY,
- RAW_MINIO_URL: process.env.RAW_MINIO_URL,
- MINIO_PORT: process.env.MINIO_PORT,
+ MINIO_URL: process.env.MINIO_URL,
+ COUCH_DB_URL: process.env.COUCH_DB_URL,
+ LOG_LEVEL: process.env.LOG_LEVEL,
+ /* TODO: to remove - once deployment removed */
SELF_HOST_KEY: process.env.SELF_HOST_KEY,
COUCH_DB_USERNAME: process.env.COUCH_DB_USERNAME,
COUCH_DB_PASSWORD: process.env.COUCH_DB_PASSWORD,
- COUCH_DB_URL: process.env.COUCH_DB_URL,
_set(key, value) {
process.env[key] = value
module.exports[key] = value
},
+ isDev,
}
diff --git a/packages/worker/src/index.js b/packages/worker/src/index.js
index 2cc78cce2..2426b3941 100644
--- a/packages/worker/src/index.js
+++ b/packages/worker/src/index.js
@@ -32,7 +32,7 @@ destroyable(server)
server.on("close", () => console.log("Server Closed"))
-module.exports = server.listen(env.PORT || 4002, async () => {
+module.exports = server.listen(parseInt(env.PORT || 4002), async () => {
console.log(`Worker running on ${JSON.stringify(server.address())}`)
})
diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock
index d88e56017..70bea3b7e 100644
--- a/packages/worker/yarn.lock
+++ b/packages/worker/yarn.lock
@@ -48,11 +48,23 @@
resolved "https://registry.yarnpkg.com/@sideway/pinpoint/-/pinpoint-2.0.0.tgz#cff8ffadc372ad29fd3f78277aeb29e632cc70df"
integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==
+"@sindresorhus/is@^0.14.0":
+ version "0.14.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea"
+ integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==
+
"@sindresorhus/is@^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4"
integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ==
+"@szmarczak/http-timer@^1.1.2":
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
+ integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==
+ dependencies:
+ defer-to-connect "^1.0.1"
+
"@szmarczak/http-timer@^4.0.5":
version "4.0.5"
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.5.tgz#bfbd50211e9dfa51ba07da58a14cdfd333205152"
@@ -107,6 +119,11 @@
dependencies:
"@types/node" "*"
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
abort-controller@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
@@ -159,6 +176,23 @@ amdefine@>=0.0.4:
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=
+ansi-align@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.0.tgz#b536b371cf687caaef236c18d3e21fe3797467cb"
+ integrity sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==
+ dependencies:
+ string-width "^3.0.0"
+
+ansi-regex@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
+ integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==
+
+ansi-regex@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75"
+ integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==
+
ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@@ -178,6 +212,14 @@ any-promise@^1.1.0:
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
+anymatch@~3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
+ integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
args@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/args/-/args-5.0.1.tgz#4bf298df90a4799a09521362c579278cc2fdd761"
@@ -243,6 +285,25 @@ base64-js@^1.0.2, base64-js@^1.3.1:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+boxen@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/boxen/-/boxen-4.2.0.tgz#e411b62357d6d6d36587c8ac3d5d974daa070e64"
+ integrity sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==
+ dependencies:
+ ansi-align "^3.0.0"
+ camelcase "^5.3.1"
+ chalk "^3.0.0"
+ cli-boxes "^2.2.0"
+ string-width "^4.1.0"
+ term-size "^2.1.0"
+ type-fest "^0.8.1"
+ widest-line "^3.1.0"
+
brace-expansion@^1.1.7:
version "1.1.11"
resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
@@ -251,6 +312,13 @@ brace-expansion@^1.1.7:
balanced-match "^1.0.0"
concat-map "0.0.1"
+braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
buffer-from@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
@@ -291,6 +359,19 @@ cacheable-lookup@^5.0.3:
resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005"
integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
+cacheable-request@^6.0.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912"
+ integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^3.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^4.1.0"
+ responselike "^1.0.2"
+
cacheable-request@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.1.tgz#062031c2856232782ed694a257fa35da93942a58"
@@ -309,6 +390,11 @@ camelcase@5.0.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42"
integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==
+camelcase@^5.3.1:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
chalk@2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
@@ -318,6 +404,14 @@ chalk@2.4.2:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
+chalk@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+ integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
chalk@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a"
@@ -326,6 +420,31 @@ chalk@^4.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+chokidar@^3.2.2:
+ version "3.5.1"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a"
+ integrity sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==
+ dependencies:
+ anymatch "~3.1.1"
+ braces "~3.0.2"
+ glob-parent "~5.1.0"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.5.0"
+ optionalDependencies:
+ fsevents "~2.3.1"
+
+ci-info@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
+ integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+
+cli-boxes@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
+ integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==
+
clone-buffer@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
@@ -409,6 +528,18 @@ concat-map@0.0.1:
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+configstore@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
+ integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==
+ dependencies:
+ dot-prop "^5.2.0"
+ graceful-fs "^4.1.2"
+ make-dir "^3.0.0"
+ unique-string "^2.0.0"
+ write-file-atomic "^3.0.0"
+ xdg-basedir "^4.0.0"
+
content-disposition@~0.5.2:
version "0.5.3"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
@@ -441,12 +572,24 @@ crc@^3.4.4:
dependencies:
buffer "^5.1.0"
+crypto-random-string@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
+ integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
+
dateformat@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
-debug@^3.1.0:
+debug@^2.2.0:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0, debug@^3.2.6:
version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
@@ -467,6 +610,13 @@ debug@~3.1.0:
dependencies:
ms "2.0.0"
+decompress-response@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
+ integrity sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=
+ dependencies:
+ mimic-response "^1.0.0"
+
decompress-response@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
@@ -479,6 +629,16 @@ deep-equal@~1.0.1:
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
integrity sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=
+deep-extend@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
+ integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+
+defer-to-connect@^1.0.1:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
+ integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==
+
defer-to-connect@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.0.tgz#83d6b199db041593ac84d781b5222308ccf4c2c1"
@@ -525,16 +685,43 @@ detective@^4.3.1:
acorn "^5.2.1"
defined "^1.0.0"
+dot-prop@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
+ integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==
+ dependencies:
+ is-obj "^2.0.0"
+
+dotenv@^8.2.0:
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz#97e619259ada750eea3e4ea3e26bceea5424b16a"
+ integrity sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==
+
double-ended-queue@2.1.0-0:
version "2.1.0-0"
resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
integrity sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=
+duplexer3@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
+ integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
encodeurl@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
@@ -589,6 +776,11 @@ es3ify@^0.2.2:
jstransform "~11.0.0"
through "~2.3.4"
+escape-goat@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
+ integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==
+
escape-html@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@@ -673,6 +865,13 @@ fetch-cookie@0.10.1:
dependencies:
tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0"
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
flatstr@^1.0.12:
version "1.0.12"
resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931"
@@ -693,6 +892,18 @@ fresh@~0.5.2:
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+fsevents@~2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+get-stream@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
+ integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
+ dependencies:
+ pump "^3.0.0"
+
get-stream@^5.1.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
@@ -700,6 +911,13 @@ get-stream@^5.1.0:
dependencies:
pump "^3.0.0"
+glob-parent@~5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
glob@^5.0.15:
version "5.0.15"
resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
@@ -711,6 +929,13 @@ glob@^5.0.15:
once "^1.3.0"
path-is-absolute "^1.0.0"
+global-dirs@^2.0.1:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d"
+ integrity sha512-MG6kdOUh/xBnyo9cJFeIKkLEc1AyFq42QTU4XiX51i2NEdxLxLWXIjEjmqKeSuKR7pAZjTqUVoT2b2huxVLgYQ==
+ dependencies:
+ ini "1.3.7"
+
got@^11.8.1:
version "11.8.1"
resolved "https://registry.yarnpkg.com/got/-/got-11.8.1.tgz#df04adfaf2e782babb3daabc79139feec2f7e85d"
@@ -728,6 +953,23 @@ got@^11.8.1:
p-cancelable "^2.0.0"
responselike "^2.0.0"
+got@^9.6.0:
+ version "9.6.0"
+ resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85"
+ integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==
+ dependencies:
+ "@sindresorhus/is" "^0.14.0"
+ "@szmarczak/http-timer" "^1.1.2"
+ cacheable-request "^6.0.0"
+ decompress-response "^3.3.0"
+ duplexer3 "^0.1.4"
+ get-stream "^4.1.0"
+ lowercase-keys "^1.0.1"
+ mimic-response "^1.0.1"
+ p-cancelable "^1.0.0"
+ to-readable-stream "^1.0.0"
+ url-parse-lax "^3.0.0"
+
graceful-fs@^4.1.2:
version "4.2.4"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
@@ -743,6 +985,11 @@ has-flag@^4.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+has-yarn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
+ integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
+
http-assert@^1.3.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.4.1.tgz#c5f725d677aa7e873ef736199b89686cceb37878"
@@ -813,6 +1060,11 @@ ieee754@^1.1.13, ieee754@^1.1.4:
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+ignore-by-default@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
+ integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
+
immediate@3.3.0, immediate@^3.2.3:
version "3.3.0"
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266"
@@ -823,6 +1075,16 @@ immediate@~3.0.5:
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=
+import-lazy@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
+ integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
+ integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
+
inflation@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/inflation/-/inflation-2.0.0.tgz#8b417e47c28f925a45133d914ca1fd389107f30f"
@@ -846,6 +1108,16 @@ inherits@2.0.3:
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+ini@1.3.7:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.7.tgz#a09363e1911972ea16d7a8851005d84cf09a9a84"
+ integrity sha512-iKpRpXP+CrP2jyrxvg1kMUpXDyRUFDWurxbnVT1vQPx+Wz9uCYsMIqYuSBLV+PAaZG/d7kRLKRFc9oDMsH+mFQ==
+
+ini@~1.3.0:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
+ integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
+
inline-process-browser@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/inline-process-browser/-/inline-process-browser-1.0.0.tgz#46a61b153dd3c9b1624b1a00626edb4f7f414f22"
@@ -854,16 +1126,80 @@ inline-process-browser@^1.0.0:
falafel "^1.0.1"
through2 "^0.6.5"
+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"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-ci@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
+ integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==
+ dependencies:
+ ci-info "^2.0.0"
+
is-class-hotfix@~0.0.6:
version "0.0.6"
resolved "https://registry.yarnpkg.com/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz#a527d31fb23279281dde5f385c77b5de70a72435"
integrity sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+ integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
+ integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
is-generator-function@^1.0.7:
version "1.0.8"
resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.8.tgz#dfb5c2b120e02b0a8d9d2c6806cd5621aa922f7b"
integrity sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==
+is-glob@^4.0.1, is-glob@~4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
+ integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-installed-globally@^0.3.1:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/is-installed-globally/-/is-installed-globally-0.3.2.tgz#fd3efa79ee670d1187233182d5b0a1dd00313141"
+ integrity sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==
+ dependencies:
+ global-dirs "^2.0.1"
+ is-path-inside "^3.0.1"
+
+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@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-obj@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
+ integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
+
+is-path-inside@^3.0.1:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
+ integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+
is-type-of@^1.0.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/is-type-of/-/is-type-of-1.2.1.tgz#e263ec3857aceb4f28c47130ec78db09a920f8c5"
@@ -873,6 +1209,16 @@ is-type-of@^1.0.0:
is-class-hotfix "~0.0.6"
isstream "~0.1.2"
+is-typedarray@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-yarn-global@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
+ integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==
+
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
@@ -909,6 +1255,11 @@ joycon@^2.2.5:
resolved "https://registry.yarnpkg.com/joycon/-/joycon-2.2.5.tgz#8d4cf4cbb2544d7b7583c216fcdfec19f6be1615"
integrity sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ==
+json-buffer@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
+ integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=
+
json-buffer@3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
@@ -941,6 +1292,13 @@ keygrip@~1.1.0:
dependencies:
tsscmp "1.0.6"
+keyv@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9"
+ integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==
+ dependencies:
+ json-buffer "3.0.0"
+
keyv@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.0.3.tgz#4f3aa98de254803cafcd2896734108daa35e4254"
@@ -1056,6 +1414,13 @@ koa@^2.7.0:
type-is "^1.6.16"
vary "^1.1.2"
+latest-version@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-5.1.0.tgz#119dfe908fe38d15dfa43ecd13fa12ec8832face"
+ integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==
+ dependencies:
+ package-json "^6.3.0"
+
level-codec@9.0.2, level-codec@^9.0.0:
version "9.0.2"
resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc"
@@ -1160,6 +1525,11 @@ lie@3.0.4:
inline-process-browser "^1.0.0"
unreachable-branch-transform "^0.3.0"
+lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
+ integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==
+
lowercase-keys@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
@@ -1170,6 +1540,13 @@ ltgt@2.2.1, ltgt@^2.1.2:
resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=
+make-dir@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
+ integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
+ dependencies:
+ semver "^6.0.0"
+
media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@@ -1197,7 +1574,7 @@ mime-types@^2.1.18, mime-types@~2.1.24:
dependencies:
mime-db "1.44.0"
-mimic-response@^1.0.0:
+mimic-response@^1.0.0, mimic-response@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
@@ -1207,14 +1584,14 @@ mimic-response@^3.1.0:
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
-"minimatch@2 || 3":
+"minimatch@2 || 3", minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
dependencies:
brace-expansion "^1.1.7"
-minimist@^1.2.5:
+minimist@^1.2.0, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@@ -1271,6 +1648,34 @@ node-gyp-build@~4.1.0:
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb"
integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==
+nodemon@^2.0.7:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.7.tgz#6f030a0a0ebe3ea1ba2a38f71bf9bab4841ced32"
+ integrity sha512-XHzK69Awgnec9UzHr1kc8EomQh4sjTQ8oRf8TsGrSmHDx9/UmiGG9E/mM3BuTfNeFwdNBvrqQq/RHL0xIeyFOA==
+ dependencies:
+ chokidar "^3.2.2"
+ debug "^3.2.6"
+ ignore-by-default "^1.0.1"
+ minimatch "^3.0.4"
+ pstree.remy "^1.1.7"
+ semver "^5.7.1"
+ supports-color "^5.5.0"
+ touch "^3.1.0"
+ undefsafe "^2.0.3"
+ update-notifier "^4.1.0"
+
+nopt@~1.0.10:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee"
+ integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=
+ dependencies:
+ abbrev "1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
normalize-url@^4.1.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
@@ -1305,11 +1710,26 @@ only@~0.0.2:
resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4"
integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=
+p-cancelable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
+ integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==
+
p-cancelable@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e"
integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==
+package-json@^6.3.0:
+ version "6.5.0"
+ resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
+ integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==
+ dependencies:
+ got "^9.6.0"
+ registry-auth-token "^4.0.0"
+ registry-url "^5.0.0"
+ semver "^6.2.0"
+
parseurl@^1.3.2:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
@@ -1327,6 +1747,11 @@ path-to-regexp@1.x:
dependencies:
isarray "0.0.1"
+picomatch@^2.0.4, picomatch@^2.2.1:
+ version "2.2.2"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
+ integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
+
pino-http@^5.0.1:
version "5.3.0"
resolved "https://registry.yarnpkg.com/pino-http/-/pino-http-5.3.0.tgz#8ad9c296a60220b8d7067800a63c8716a622c661"
@@ -1414,6 +1839,11 @@ pouchdb@^7.2.2:
uuid "8.1.0"
vuvuzela "1.0.3"
+prepend-http@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
+ integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+
private@^0.1.6, private@~0.1.5:
version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
@@ -1429,6 +1859,11 @@ psl@^1.1.33:
resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+pstree.remy@^1.1.7:
+ version "1.1.8"
+ resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a"
+ integrity sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==
+
pump@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
@@ -1452,6 +1887,13 @@ punycode@^2.1.1:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+pupa@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/pupa/-/pupa-2.1.1.tgz#f5e8fd4afc2c5d97828faa523549ed8744a20d62"
+ integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==
+ dependencies:
+ escape-goat "^2.0.0"
+
q@^1.1.2:
version "1.5.1"
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
@@ -1487,6 +1929,16 @@ raw-body@^2.2.0:
iconv-lite "0.4.24"
unpipe "1.0.0"
+rc@^1.2.8:
+ version "1.2.8"
+ resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
+ integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
+ dependencies:
+ deep-extend "^0.6.0"
+ ini "~1.3.0"
+ minimist "^1.2.0"
+ strip-json-comments "~2.0.1"
+
readable-stream@1.1.14:
version "1.1.14"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
@@ -1521,6 +1973,13 @@ readable-stream@~0.0.2:
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-0.0.4.tgz#f32d76e3fb863344a548d79923007173665b3b8d"
integrity sha1-8y124/uGM0SlSNeZIwBxc2ZbO40=
+readdirp@~3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
+ integrity sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==
+ dependencies:
+ picomatch "^2.2.1"
+
recast@^0.10.1:
version "0.10.43"
resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f"
@@ -1541,6 +2000,20 @@ recast@^0.11.17:
private "~0.1.5"
source-map "~0.5.0"
+registry-auth-token@^4.0.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250"
+ integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==
+ dependencies:
+ rc "^1.2.8"
+
+registry-url@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009"
+ integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==
+ dependencies:
+ rc "^1.2.8"
+
resolve-alpn@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.0.0.tgz#745ad60b3d6aff4b4a48e01b8c0bdc70959e0e8c"
@@ -1554,6 +2027,13 @@ resolve-path@^1.4.0:
http-errors "~1.6.2"
path-is-absolute "1.0.1"
+responselike@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
+ integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=
+ dependencies:
+ lowercase-keys "^1.0.0"
+
responselike@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.0.tgz#26391bcc3174f750f9a79eacc40a12a5c42d7723"
@@ -1586,6 +2066,23 @@ sax@>=0.6.0:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+semver-diff@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
+ integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==
+ dependencies:
+ semver "^6.3.0"
+
+semver@^5.7.1:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
server-destroy@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd"
@@ -1606,6 +2103,11 @@ setprototypeof@1.2.0:
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+signal-exit@^3.0.2:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
+ integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+
sonic-boom@^1.0.2:
version "1.3.0"
resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.3.0.tgz#5c77c846ce6c395dddf2eb8e8e65f9cc576f2e76"
@@ -1655,6 +2157,24 @@ statuses@^2.0.0:
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.0.tgz#aa7b107e018eb33e08e8aee2e7337e762dda1028"
integrity sha512-w9jNUUQdpuVoYqXxnyOakhckBbOxRaoYqJscyIBYCS5ixyCnO7nQn7zBZvP9zf5QOPZcz2DLUpE3KsNPbJBOFA==
+string-width@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string-width@^4.0.0, string-width@^4.1.0:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
+ integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.0"
+
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
@@ -1667,12 +2187,31 @@ string_decoder@~0.10.x:
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+strip-ansi@^5.1.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532"
+ integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==
+ dependencies:
+ ansi-regex "^5.0.0"
+
strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==
-supports-color@^5.3.0:
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
+ integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+
+supports-color@^5.3.0, supports-color@^5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
@@ -1686,6 +2225,11 @@ supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
+term-size@^2.1.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54"
+ integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==
+
through2@3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4"
@@ -1712,11 +2256,30 @@ tiny-queue@^0.2.0:
resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.1.tgz#25a67f2c6e253b2ca941977b5ef7442ef97a6046"
integrity sha1-JaZ/LG4lOyypQZd7XvdELvl6YEY=
+to-readable-stream@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
+ integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
toidentifier@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+touch@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b"
+ integrity sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==
+ dependencies:
+ nopt "~1.0.10"
+
"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0":
version "4.0.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
@@ -1731,6 +2294,11 @@ tsscmp@1.0.6:
resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==
+type-fest@^0.8.1:
+ version "0.8.1"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
+ integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+
type-is@^1.6.14, type-is@^1.6.16:
version "1.6.18"
resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
@@ -1739,6 +2307,27 @@ type-is@^1.6.14, type-is@^1.6.16:
media-typer "0.3.0"
mime-types "~2.1.24"
+typedarray-to-buffer@^3.1.5:
+ version "3.1.5"
+ resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
+ integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==
+ dependencies:
+ is-typedarray "^1.0.0"
+
+undefsafe@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae"
+ integrity sha512-nrXZwwXrD/T/JXeygJqdCO6NZZ1L66HrxM/Z7mIq2oPanoN0F1nLx3lwJMu6AwJY69hdixaFQOuoYsMjE5/C2A==
+ dependencies:
+ debug "^2.2.0"
+
+unique-string@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
+ integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==
+ dependencies:
+ crypto-random-string "^2.0.0"
+
universalify@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
@@ -1758,11 +2347,37 @@ unreachable-branch-transform@^0.3.0:
recast "^0.10.1"
through2 "^0.6.2"
+update-notifier@^4.1.0:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3"
+ integrity sha512-Yld6Z0RyCYGB6ckIjffGOSOmHXj1gMeE7aROz4MG+XMkmixBX4jUngrGXNYz7wPKBmtoD4MnBa2Anu7RSKht/A==
+ dependencies:
+ boxen "^4.2.0"
+ chalk "^3.0.0"
+ configstore "^5.0.1"
+ has-yarn "^2.1.0"
+ import-lazy "^2.1.0"
+ is-ci "^2.0.0"
+ is-installed-globally "^0.3.1"
+ is-npm "^4.0.0"
+ is-yarn-global "^0.3.0"
+ latest-version "^5.0.0"
+ pupa "^2.0.1"
+ semver-diff "^3.1.1"
+ xdg-basedir "^4.0.0"
+
urijs@^1.19.2:
version "1.19.2"
resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.2.tgz#f9be09f00c4c5134b7cb3cf475c1dd394526265a"
integrity sha512-s/UIq9ap4JPZ7H1EB5ULo/aOUbWqfDi7FKzMC2Nz+0Si8GiT1rIEaprt8hy3Vy2Ex2aJPpOQv4P4DuOZ+K1c6w==
+url-parse-lax@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
+ integrity sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=
+ dependencies:
+ prepend-http "^2.0.0"
+
url@0.10.3:
version "0.10.3"
resolved "https://registry.yarnpkg.com/url/-/url-0.10.3.tgz#021e4d9c7705f21bbf37d03ceb58767402774c64"
@@ -1801,11 +2416,28 @@ vuvuzela@1.0.3:
resolved "https://registry.yarnpkg.com/vuvuzela/-/vuvuzela-1.0.3.tgz#3be145e58271c73ca55279dd851f12a682114b0b"
integrity sha1-O+FF5YJxxzylUnndhR8SpoIRSws=
+widest-line@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
+ integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==
+ dependencies:
+ string-width "^4.0.0"
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+write-file-atomic@^3.0.0:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8"
+ integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==
+ dependencies:
+ imurmurhash "^0.1.4"
+ is-typedarray "^1.0.0"
+ signal-exit "^3.0.2"
+ typedarray-to-buffer "^3.1.5"
+
write-stream@~0.4.3:
version "0.4.3"
resolved "https://registry.yarnpkg.com/write-stream/-/write-stream-0.4.3.tgz#83cc8c0347d0af6057a93862b4e3ae01de5c81c1"
@@ -1813,6 +2445,11 @@ write-stream@~0.4.3:
dependencies:
readable-stream "~0.0.2"
+xdg-basedir@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
+ integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
+
xml2js@0.4.19:
version "0.4.19"
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
From bcde3a6d64c9a08e8fe89395c73c65cdfc07875e Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Mon, 29 Mar 2021 15:06:00 +0100
Subject: [PATCH 009/135] Replacing deprecated symbols.
---
packages/server/src/api/index.js | 4 ++--
packages/worker/src/api/index.js | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/packages/server/src/api/index.js b/packages/server/src/api/index.js
index aeceb6503..ef8deb36c 100644
--- a/packages/server/src/api/index.js
+++ b/packages/server/src/api/index.js
@@ -13,10 +13,10 @@ router
compress({
threshold: 2048,
gzip: {
- flush: zlib.Z_SYNC_FLUSH,
+ flush: zlib.constants.Z_SYNC_FLUSH,
},
deflate: {
- flush: zlib.Z_SYNC_FLUSH,
+ flush: zlib.constants.Z_SYNC_FLUSH,
},
br: false,
})
diff --git a/packages/worker/src/api/index.js b/packages/worker/src/api/index.js
index 8b77669c9..0568d79a6 100644
--- a/packages/worker/src/api/index.js
+++ b/packages/worker/src/api/index.js
@@ -10,10 +10,10 @@ router
compress({
threshold: 2048,
gzip: {
- flush: zlib.Z_SYNC_FLUSH,
+ flush: zlib.constants.Z_SYNC_FLUSH,
},
deflate: {
- flush: zlib.Z_SYNC_FLUSH,
+ flush: zlib.constants.Z_SYNC_FLUSH,
},
br: false,
})
From 53b7589d9ec3a196264acad04a3f3787922962d3 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Mon, 29 Mar 2021 17:31:41 +0100
Subject: [PATCH 010/135] Updating worker package with the various parts of
server that needed moved over.
---
packages/worker/package.json | 3 +-
.../worker/src/api/controllers/admin/index.js | 79 ++++++++++++++++
.../worker/src/api/controllers/admin/utils.js | 13 +++
packages/worker/src/api/controllers/deploy.js | 92 -------------------
packages/worker/src/api/routes/admin/index.js | 12 +++
packages/worker/src/api/routes/deploy.js | 9 --
packages/worker/src/api/routes/index.js | 4 +-
packages/worker/src/constants/index.js | 4 +
packages/worker/src/db/utils.js | 32 +++++++
packages/worker/src/environment.js | 2 +
packages/worker/src/middleware/authorized.js | 7 ++
packages/worker/yarn.lock | 7 +-
12 files changed, 159 insertions(+), 105 deletions(-)
create mode 100644 packages/worker/src/api/controllers/admin/index.js
create mode 100644 packages/worker/src/api/controllers/admin/utils.js
delete mode 100644 packages/worker/src/api/controllers/deploy.js
create mode 100644 packages/worker/src/api/routes/admin/index.js
delete mode 100644 packages/worker/src/api/routes/deploy.js
create mode 100644 packages/worker/src/constants/index.js
create mode 100644 packages/worker/src/db/utils.js
create mode 100644 packages/worker/src/middleware/authorized.js
diff --git a/packages/worker/package.json b/packages/worker/package.json
index 43deb14a5..73b417c58 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -21,6 +21,7 @@
"dependencies": {
"@koa/router": "^8.0.0",
"aws-sdk": "^2.811.0",
+ "bcryptjs": "^2.4.3",
"dotenv": "^8.2.0",
"got": "^11.8.1",
"joi": "^17.2.1",
@@ -33,7 +34,7 @@
"koa-static": "^5.0.0",
"node-fetch": "^2.6.1",
"pino-pretty": "^4.0.0",
- "pouchdb": "^7.2.2",
+ "pouchdb": "^7.2.1",
"pouchdb-all-dbs": "^1.0.2",
"server-destroy": "^1.0.1"
},
diff --git a/packages/worker/src/api/controllers/admin/index.js b/packages/worker/src/api/controllers/admin/index.js
new file mode 100644
index 000000000..f94cf39fc
--- /dev/null
+++ b/packages/worker/src/api/controllers/admin/index.js
@@ -0,0 +1,79 @@
+const CouchDB = require("../../../db")
+const { StaticDatabases, generateUserID, getUserParams } = require("../../../db/utils")
+const { hash } = require("./utils")
+const { UserStatus } = require("../../../constants")
+
+const USER_DB = StaticDatabases.USER.name
+
+exports.userSave = async ctx => {
+ const db = new CouchDB(USER_DB)
+ const { email, password, _id } = ctx.request.body
+ const hashedPassword = password ? await hash(password) : null
+ let user = {
+ ...ctx.request.body,
+ _id: generateUserID(email),
+ password: hashedPassword,
+ }, dbUser
+ // in-case user existed already
+ if (_id) {
+ dbUser = await db.get(_id)
+ }
+ // add the active status to a user if its not provided
+ if (user.status == null) {
+ user.status = UserStatus.ACTIVE
+ }
+ try {
+ const response = await db.post({
+ password: hashedPassword || dbUser.password,
+ ...user,
+ })
+ ctx.body = {
+ _id: response.id,
+ _rev: response.rev,
+ email,
+ }
+ } catch (err) {
+ if (err.status === 409) {
+ ctx.throw(400, "User exists already")
+ } else {
+ ctx.throw(err.status, err)
+ }
+ }
+}
+
+exports.userDelete = async ctx => {
+ const db = new CouchDB(USER_DB)
+ await db.destroy(generateUserID(ctx.params.email))
+ ctx.body = {
+ message: `User ${ctx.params.email} deleted.`,
+ }
+}
+
+// called internally by app server user fetch
+exports.userFetch = async ctx => {
+ const db = new CouchDB(USER_DB)
+ const users = (
+ await db.allDocs(
+ getUserParams(null, {
+ include_docs: true,
+ })
+ )
+ ).rows.map(row => row.doc)
+ // user hashed password shouldn't ever be returned
+ for (let user of users) {
+ if (user) {
+ delete user.password
+ }
+ }
+ ctx.body = users
+}
+
+// called internally by app server user find
+exports.userFind = async ctx => {
+ const db = new CouchDB(USER_DB)
+ const user = await db.get(generateUserID(ctx.params.email))
+ if (user) {
+ delete user.password
+ }
+ ctx.body = user
+}
diff --git a/packages/worker/src/api/controllers/admin/utils.js b/packages/worker/src/api/controllers/admin/utils.js
new file mode 100644
index 000000000..4af0a52c4
--- /dev/null
+++ b/packages/worker/src/api/controllers/admin/utils.js
@@ -0,0 +1,13 @@
+const bcrypt = require("bcryptjs")
+const env = require("../environment")
+
+const SALT_ROUNDS = env.SALT_ROUNDS || 10
+
+exports.hash = async data => {
+ const salt = await bcrypt.genSalt(SALT_ROUNDS)
+ return bcrypt.hash(data, salt)
+}
+
+exports.compare = async (data, encrypted) => {
+ return bcrypt.compare(data, encrypted)
+}
\ No newline at end of file
diff --git a/packages/worker/src/api/controllers/deploy.js b/packages/worker/src/api/controllers/deploy.js
deleted file mode 100644
index cbaf84208..000000000
--- a/packages/worker/src/api/controllers/deploy.js
+++ /dev/null
@@ -1,92 +0,0 @@
-const env = require("../../environment")
-const got = require("got")
-const AWS = require("aws-sdk")
-
-const APP_BUCKET = "app-assets"
-// this doesn't matter in self host
-const REGION = "eu-west-1"
-const PUBLIC_READ_POLICY = {
- Version: "2012-10-17",
- Statement: [
- {
- Effect: "Allow",
- Principal: {
- AWS: ["*"],
- },
- Action: "s3:GetObject",
- Resource: [`arn:aws:s3:::${APP_BUCKET}/*`],
- },
- ],
-}
-
-async function getCouchSession() {
- // fetch session token for the api user
- const session = await got.post(`${env.COUCH_DB_URL}/_session`, {
- responseType: "json",
- credentials: "include",
- json: {
- username: env.COUCH_DB_USERNAME,
- password: env.COUCH_DB_PASSWORD,
- },
- })
-
- const cookie = session.headers["set-cookie"][0]
- // Get the session cookie value only
- return cookie.split(";")[0]
-}
-
-async function getMinioSession() {
- AWS.config.update({
- accessKeyId: env.MINIO_ACCESS_KEY,
- secretAccessKey: env.MINIO_SECRET_KEY,
- })
-
- // make sure the bucket exists
- const objClient = new AWS.S3({
- endpoint: env.MINIO_URL,
- region: REGION,
- s3ForcePathStyle: true, // needed with minio?
- params: {
- Bucket: APP_BUCKET,
- },
- })
- // make sure the bucket exists
- try {
- await objClient
- .headBucket({
- Bucket: APP_BUCKET,
- })
- .promise()
- } catch (err) {
- // bucket doesn't exist create it
- if (err.statusCode === 404) {
- await objClient
- .createBucket({
- Bucket: APP_BUCKET,
- })
- .promise()
- } else {
- throw err
- }
- }
- // always make sure policy is correct
- await objClient
- .putBucketPolicy({
- Bucket: APP_BUCKET,
- Policy: JSON.stringify(PUBLIC_READ_POLICY),
- })
- .promise()
- // Ideally want to send back some pre-signed URLs for files that are to be uploaded
- return {
- accessKeyId: env.MINIO_ACCESS_KEY,
- secretAccessKey: env.MINIO_SECRET_KEY,
- }
-}
-
-exports.deploy = async ctx => {
- ctx.body = {
- couchDbSession: await getCouchSession(),
- bucket: APP_BUCKET,
- objectStoreSession: await getMinioSession(),
- }
-}
diff --git a/packages/worker/src/api/routes/admin/index.js b/packages/worker/src/api/routes/admin/index.js
new file mode 100644
index 000000000..9d8592790
--- /dev/null
+++ b/packages/worker/src/api/routes/admin/index.js
@@ -0,0 +1,12 @@
+const Router = require("@koa/router")
+const controller = require("../../controllers/admin")
+const authorized = require("../../../middleware/authorized")
+
+const router = Router()
+
+router.post("/api/admin/users", authorized, controller.userSave)
+ .delete("/api/admin/users/:email", authorized, controller.userDelete)
+ .get("/api/admin/users", authorized, controller.userFetch)
+ .get("/api/admin/users/:email", authorized, controller.userFind)
+
+module.exports = router
diff --git a/packages/worker/src/api/routes/deploy.js b/packages/worker/src/api/routes/deploy.js
deleted file mode 100644
index 97c543975..000000000
--- a/packages/worker/src/api/routes/deploy.js
+++ /dev/null
@@ -1,9 +0,0 @@
-const Router = require("@koa/router")
-const controller = require("../controllers/deploy")
-const checkKey = require("../../middleware/check-key")
-
-const router = Router()
-
-router.post("/api/deploy", checkKey, controller.deploy)
-
-module.exports = router
diff --git a/packages/worker/src/api/routes/index.js b/packages/worker/src/api/routes/index.js
index 7ad619c2b..076710b21 100644
--- a/packages/worker/src/api/routes/index.js
+++ b/packages/worker/src/api/routes/index.js
@@ -1,4 +1,4 @@
-const deployRoutes = require("./deploy")
+const adminRoutes = require("./admin")
const appRoutes = require("./app")
-exports.routes = [deployRoutes, appRoutes]
+exports.routes = [adminRoutes, appRoutes]
diff --git a/packages/worker/src/constants/index.js b/packages/worker/src/constants/index.js
new file mode 100644
index 000000000..77a6aedca
--- /dev/null
+++ b/packages/worker/src/constants/index.js
@@ -0,0 +1,4 @@
+exports.UserStatus = {
+ ACTIVE: "active",
+ INACTIVE: "inactive",
+}
diff --git a/packages/worker/src/db/utils.js b/packages/worker/src/db/utils.js
new file mode 100644
index 000000000..aa274eff3
--- /dev/null
+++ b/packages/worker/src/db/utils.js
@@ -0,0 +1,32 @@
+exports.StaticDatabases = {
+ USER: {
+ name: "user-db",
+ }
+}
+
+const DocumentTypes = {
+ USER: "us"
+}
+
+const UNICODE_MAX = "\ufff0"
+const SEPARATOR = "_"
+
+/**
+ * Generates a new user ID based on the passed in email.
+ * @param {string} email The email which the ID is going to be built up of.
+ * @returns {string} The new user ID which the user doc can be stored under.
+ */
+exports.generateUserID = email => {
+ return `${DocumentTypes.USER}${SEPARATOR}${email}`
+}
+
+/**
+ * Gets parameters for retrieving users, this is a utility function for the getDocParams function.
+ */
+exports.getUserParams = (email = "", otherProps = {}) => {
+ return {
+ ...otherProps,
+ startkey: `${DocumentTypes.USER}${SEPARATOR}${email}`,
+ endkey: `${DocumentTypes.USER}${SEPARATOR}${email}${UNICODE_MAX}`,
+ }
+}
\ No newline at end of file
diff --git a/packages/worker/src/environment.js b/packages/worker/src/environment.js
index b857dc609..bf399fade 100644
--- a/packages/worker/src/environment.js
+++ b/packages/worker/src/environment.js
@@ -16,6 +16,8 @@ module.exports = {
MINIO_URL: process.env.MINIO_URL,
COUCH_DB_URL: process.env.COUCH_DB_URL,
LOG_LEVEL: process.env.LOG_LEVEL,
+ JWT_SECRET: process.env.JWT_SECRET,
+ SALT_ROUNDS: process.env.SALT_ROUNDS,
/* TODO: to remove - once deployment removed */
SELF_HOST_KEY: process.env.SELF_HOST_KEY,
COUCH_DB_USERNAME: process.env.COUCH_DB_USERNAME,
diff --git a/packages/worker/src/middleware/authorized.js b/packages/worker/src/middleware/authorized.js
new file mode 100644
index 000000000..86a5ab27d
--- /dev/null
+++ b/packages/worker/src/middleware/authorized.js
@@ -0,0 +1,7 @@
+/**
+ * Check the user token, used when creating admin resources, like for example
+ * a global user record.
+ */
+module.exports = async (ctx, next) => {
+ next()
+}
diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock
index 70bea3b7e..d969c67ce 100644
--- a/packages/worker/yarn.lock
+++ b/packages/worker/yarn.lock
@@ -285,6 +285,11 @@ base64-js@^1.0.2, base64-js@^1.3.1:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+bcryptjs@^2.4.3:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
+ integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=
+
binary-extensions@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
@@ -1813,7 +1818,7 @@ pouchdb-promise@5.4.3:
dependencies:
lie "3.0.4"
-pouchdb@^7.2.2:
+pouchdb@^7.2.1:
version "7.2.2"
resolved "https://registry.yarnpkg.com/pouchdb/-/pouchdb-7.2.2.tgz#fcae82862db527e4cf7576ed8549d1384961f364"
integrity sha512-5gf5nw5XH/2H/DJj8b0YkvG9fhA/4Jt6kL0Y8QjtztVjb1y4J19Rg4rG+fUbXu96gsUrlyIvZ3XfM0b4mogGmw==
From 865baf6d16928d30e71d9585a4a4638ba94dda2d Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Mon, 29 Mar 2021 17:32:05 +0100
Subject: [PATCH 011/135] Removing use of the , replacing to ctx.appId to make
it clear appId not part of the auth.
---
packages/server/src/api/controllers/auth.js | 2 +-
.../server/src/api/controllers/automation.js | 40 ++++++++++++-------
.../server/src/api/controllers/datasource.js | 8 ++--
.../src/api/controllers/deploy/index.js | 6 +--
packages/server/src/api/controllers/layout.js | 4 +-
packages/server/src/api/controllers/query.js | 12 +++---
packages/server/src/api/controllers/role.js | 8 ++--
packages/server/src/api/controllers/row.js | 20 +++++-----
packages/server/src/api/controllers/screen.js | 6 +--
.../src/api/controllers/search/index.js | 2 +-
.../src/api/controllers/static/index.js | 6 +--
.../server/src/api/controllers/table/index.js | 8 ++--
.../server/src/api/controllers/table/utils.js | 7 ++--
packages/server/src/api/controllers/user.js | 13 +++---
.../server/src/api/controllers/view/index.js | 8 ++--
.../server/src/api/controllers/webhook.js | 8 ++--
.../server/src/api/routes/tests/misc.spec.js | 10 +++--
.../server/src/middleware/authenticated.js | 4 +-
packages/server/src/middleware/usageQuota.js | 2 +-
packages/server/src/utilities/bcrypt.js | 2 +
20 files changed, 96 insertions(+), 80 deletions(-)
diff --git a/packages/server/src/api/controllers/auth.js b/packages/server/src/api/controllers/auth.js
index fc486bcb5..fab46bd05 100644
--- a/packages/server/src/api/controllers/auth.js
+++ b/packages/server/src/api/controllers/auth.js
@@ -48,7 +48,7 @@ exports.authenticate = async ctx => {
// if in prod add the user api key, unless self hosted
/* istanbul ignore next */
if (env.isProd() && !env.SELF_HOSTED) {
- const { apiKey } = await getAPIKey(ctx.user.appId)
+ const { apiKey } = await getAPIKey(ctx.appId)
payload.apiKey = apiKey
}
diff --git a/packages/server/src/api/controllers/automation.js b/packages/server/src/api/controllers/automation.js
index df17371f9..d3ed836bc 100644
--- a/packages/server/src/api/controllers/automation.js
+++ b/packages/server/src/api/controllers/automation.js
@@ -34,13 +34,14 @@ function cleanAutomationInputs(automation) {
/**
* This function handles checking if any webhooks need to be created or deleted for automations.
+ * @param {string} appId The ID of the app in which we are checking for webhooks
* @param {object} user The user object, including all auth info
* @param {object|undefined} oldAuto The old automation object if updating/deleting
* @param {object|undefined} newAuto The new automation object if creating/updating
* @returns {Promise} After this is complete the new automation object may have been updated and should be
* written to DB (this does not write to DB as it would be wasteful to repeat).
*/
-async function checkForWebhooks({ user, oldAuto, newAuto }) {
+async function checkForWebhooks({ appId, user, oldAuto, newAuto }) {
const oldTrigger = oldAuto ? oldAuto.definition.trigger : null
const newTrigger = newAuto ? newAuto.definition.trigger : null
function isWebhookTrigger(auto) {
@@ -56,7 +57,7 @@ async function checkForWebhooks({ user, oldAuto, newAuto }) {
!isWebhookTrigger(newAuto) &&
oldTrigger.webhookId
) {
- let db = new CouchDB(user.appId)
+ let db = new CouchDB(appId)
// need to get the webhook to get the rev
const webhook = await db.get(oldTrigger.webhookId)
const ctx = {
@@ -86,17 +87,17 @@ async function checkForWebhooks({ user, oldAuto, newAuto }) {
const id = ctx.body.webhook._id
newTrigger.webhookId = id
newTrigger.inputs = {
- schemaUrl: `api/webhooks/schema/${user.appId}/${id}`,
- triggerUrl: `api/webhooks/trigger/${user.appId}/${id}`,
+ schemaUrl: `api/webhooks/schema/${appId}/${id}`,
+ triggerUrl: `api/webhooks/trigger/${appId}/${id}`,
}
}
return newAuto
}
exports.create = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
let automation = ctx.request.body
- automation.appId = ctx.user.appId
+ automation.appId = ctx.appId
// call through to update if already exists
if (automation._id && automation._rev) {
@@ -107,7 +108,11 @@ exports.create = async function(ctx) {
automation.type = "automation"
automation = cleanAutomationInputs(automation)
- automation = await checkForWebhooks({ user: ctx.user, newAuto: automation })
+ automation = await checkForWebhooks({
+ appId: ctx.appId,
+ user: ctx.user,
+ newAuto: automation,
+ })
const response = await db.put(automation)
automation._rev = response.rev
@@ -122,12 +127,13 @@ exports.create = async function(ctx) {
}
exports.update = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
let automation = ctx.request.body
- automation.appId = ctx.user.appId
+ automation.appId = ctx.appId
const oldAutomation = await db.get(automation._id)
automation = cleanAutomationInputs(automation)
automation = await checkForWebhooks({
+ appId: ctx.appId,
user: ctx.user,
oldAuto: oldAutomation,
newAuto: automation,
@@ -147,7 +153,7 @@ exports.update = async function(ctx) {
}
exports.fetch = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const response = await db.allDocs(
getAutomationParams(null, {
include_docs: true,
@@ -157,14 +163,18 @@ exports.fetch = async function(ctx) {
}
exports.find = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
ctx.body = await db.get(ctx.params.id)
}
exports.destroy = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const oldAutomation = await db.get(ctx.params.id)
- await checkForWebhooks({ user: ctx.user, oldAuto: oldAutomation })
+ await checkForWebhooks({
+ appId: ctx.appId,
+ user: ctx.user,
+ oldAuto: oldAutomation,
+ })
ctx.body = await db.remove(ctx.params.id, ctx.params.rev)
}
@@ -195,11 +205,11 @@ module.exports.getDefinitionList = async function(ctx) {
*********************/
exports.trigger = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
let automation = await db.get(ctx.params.id)
await triggers.externalTrigger(automation, {
...ctx.request.body,
- appId: ctx.user.appId,
+ appId: ctx.appId,
})
ctx.status = 200
ctx.body = {
diff --git a/packages/server/src/api/controllers/datasource.js b/packages/server/src/api/controllers/datasource.js
index 678c56a14..b5a207dbb 100644
--- a/packages/server/src/api/controllers/datasource.js
+++ b/packages/server/src/api/controllers/datasource.js
@@ -6,7 +6,7 @@ const {
} = require("../../db/utils")
exports.fetch = async function(ctx) {
- const database = new CouchDB(ctx.user.appId)
+ const database = new CouchDB(ctx.appId)
ctx.body = (
await database.allDocs(
getDatasourceParams(null, {
@@ -17,7 +17,7 @@ exports.fetch = async function(ctx) {
}
exports.save = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const datasource = {
_id: generateDatasourceID(),
@@ -34,7 +34,7 @@ exports.save = async function(ctx) {
}
exports.destroy = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
// Delete all queries for the datasource
const rows = await db.allDocs(getQueryParams(ctx.params.datasourceId, null))
@@ -48,6 +48,6 @@ exports.destroy = async function(ctx) {
}
exports.find = async function(ctx) {
- const database = new CouchDB(ctx.user.appId)
+ const database = new CouchDB(ctx.appId)
ctx.body = await database.get(ctx.params.datasourceId)
}
diff --git a/packages/server/src/api/controllers/deploy/index.js b/packages/server/src/api/controllers/deploy/index.js
index 026ce5c85..490fb3c72 100644
--- a/packages/server/src/api/controllers/deploy/index.js
+++ b/packages/server/src/api/controllers/deploy/index.js
@@ -93,7 +93,7 @@ async function deployApp(deployment) {
exports.fetchDeployments = async function(ctx) {
try {
- const db = new PouchDB(ctx.user.appId)
+ const db = new PouchDB(ctx.appId)
const deploymentDoc = await db.get("_local/deployments")
const { updated, deployments } = await checkAllDeployments(
deploymentDoc,
@@ -110,7 +110,7 @@ exports.fetchDeployments = async function(ctx) {
exports.deploymentProgress = async function(ctx) {
try {
- const db = new PouchDB(ctx.user.appId)
+ const db = new PouchDB(ctx.appId)
const deploymentDoc = await db.get("_local/deployments")
ctx.body = deploymentDoc[ctx.params.deploymentId]
} catch (err) {
@@ -128,7 +128,7 @@ exports.deployApp = async function(ctx) {
hostingInfo.type === HostingTypes.CLOUD
? require("./awsDeploy")
: require("./selfDeploy")
- let deployment = new Deployment(ctx.user.appId)
+ let deployment = new Deployment(ctx.appId)
deployment.setStatus(DeploymentStatus.PENDING)
deployment = await storeLocalDeploymentHistory(deployment)
diff --git a/packages/server/src/api/controllers/layout.js b/packages/server/src/api/controllers/layout.js
index f270e95be..86c324d17 100644
--- a/packages/server/src/api/controllers/layout.js
+++ b/packages/server/src/api/controllers/layout.js
@@ -3,7 +3,7 @@ const CouchDB = require("../../db")
const { generateLayoutID, getScreenParams } = require("../../db/utils")
exports.save = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
let layout = ctx.request.body
if (!layout.props) {
@@ -22,7 +22,7 @@ exports.save = async function(ctx) {
}
exports.destroy = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const layoutId = ctx.params.layoutId,
layoutRev = ctx.params.layoutRev
diff --git a/packages/server/src/api/controllers/query.js b/packages/server/src/api/controllers/query.js
index b9b7c8542..ddf88e925 100644
--- a/packages/server/src/api/controllers/query.js
+++ b/packages/server/src/api/controllers/query.js
@@ -28,7 +28,7 @@ function formatResponse(resp) {
}
exports.fetch = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const body = await db.allDocs(
getQueryParams(null, {
@@ -39,7 +39,7 @@ exports.fetch = async function(ctx) {
}
exports.save = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const query = ctx.request.body
if (!query._id) {
@@ -90,7 +90,7 @@ async function enrichQueryFields(fields, parameters) {
}
exports.find = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const query = enrichQueries(await db.get(ctx.params.queryId))
// remove properties that could be dangerous in real app
if (env.isProd()) {
@@ -102,7 +102,7 @@ exports.find = async function(ctx) {
}
exports.preview = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const datasource = await db.get(ctx.request.body.datasourceId)
@@ -130,7 +130,7 @@ exports.preview = async function(ctx) {
}
exports.execute = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const query = await db.get(ctx.params.queryId)
const datasource = await db.get(query.datasourceId)
@@ -153,7 +153,7 @@ exports.execute = async function(ctx) {
}
exports.destroy = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
await db.remove(ctx.params.queryId, ctx.params.revId)
ctx.message = `Query deleted.`
ctx.status = 200
diff --git a/packages/server/src/api/controllers/role.js b/packages/server/src/api/controllers/role.js
index 2c29d1030..11f81c121 100644
--- a/packages/server/src/api/controllers/role.js
+++ b/packages/server/src/api/controllers/role.js
@@ -51,7 +51,7 @@ async function updateRolesOnUserTable(db, roleId, updateOption) {
}
exports.fetch = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const body = await db.allDocs(
getRoleParams(null, {
include_docs: true,
@@ -79,11 +79,11 @@ exports.fetch = async function(ctx) {
}
exports.find = async function(ctx) {
- ctx.body = await getRole(ctx.user.appId, ctx.params.roleId)
+ ctx.body = await getRole(ctx.appId, ctx.params.roleId)
}
exports.save = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
let { _id, name, inherits, permissionId } = ctx.request.body
if (!_id) {
_id = generateRoleID()
@@ -104,7 +104,7 @@ exports.save = async function(ctx) {
}
exports.destroy = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const roleId = ctx.params.roleId
if (isBuiltin(roleId)) {
ctx.throw(400, "Cannot delete builtin role.")
diff --git a/packages/server/src/api/controllers/row.js b/packages/server/src/api/controllers/row.js
index 7540cc189..fe293e931 100644
--- a/packages/server/src/api/controllers/row.js
+++ b/packages/server/src/api/controllers/row.js
@@ -60,7 +60,7 @@ async function findRow(db, appId, tableId, rowId) {
}
exports.patch = async function(ctx) {
- const appId = ctx.user.appId
+ const appId = ctx.appId
const db = new CouchDB(appId)
let dbRow = await db.get(ctx.params.rowId)
let dbTable = await db.get(dbRow.tableId)
@@ -121,7 +121,7 @@ exports.patch = async function(ctx) {
}
exports.save = async function(ctx) {
- const appId = ctx.user.appId
+ const appId = ctx.appId
const db = new CouchDB(appId)
let inputs = ctx.request.body
inputs.tableId = ctx.params.tableId
@@ -197,7 +197,7 @@ exports.save = async function(ctx) {
}
exports.fetchView = async function(ctx) {
- const appId = ctx.user.appId
+ const appId = ctx.appId
const viewName = ctx.params.viewName
// if this is a table view being looked for just transfer to that
@@ -256,7 +256,7 @@ exports.fetchView = async function(ctx) {
}
exports.search = async function(ctx) {
- const appId = ctx.user.appId
+ const appId = ctx.appId
const db = new CouchDB(appId)
const {
query,
@@ -303,7 +303,7 @@ exports.search = async function(ctx) {
}
exports.fetchTableRows = async function(ctx) {
- const appId = ctx.user.appId
+ const appId = ctx.appId
const db = new CouchDB(appId)
// special case for users, fetch through the user controller
@@ -324,7 +324,7 @@ exports.fetchTableRows = async function(ctx) {
}
exports.find = async function(ctx) {
- const appId = ctx.user.appId
+ const appId = ctx.appId
const db = new CouchDB(appId)
try {
const table = await db.get(ctx.params.tableId)
@@ -336,7 +336,7 @@ exports.find = async function(ctx) {
}
exports.destroy = async function(ctx) {
- const appId = ctx.user.appId
+ const appId = ctx.appId
const db = new CouchDB(appId)
const row = await db.get(ctx.params.rowId)
if (row.tableId !== ctx.params.tableId) {
@@ -358,7 +358,7 @@ exports.destroy = async function(ctx) {
exports.validate = async function(ctx) {
const errors = await validate({
- appId: ctx.user.appId,
+ appId: ctx.appId,
tableId: ctx.params.tableId,
row: ctx.request.body,
})
@@ -388,7 +388,7 @@ async function validate({ appId, tableId, row, table }) {
}
exports.fetchEnrichedRow = async function(ctx) {
- const appId = ctx.user.appId
+ const appId = ctx.appId
const db = new CouchDB(appId)
const tableId = ctx.params.tableId
const rowId = ctx.params.rowId
@@ -433,7 +433,7 @@ exports.fetchEnrichedRow = async function(ctx) {
}
async function bulkDelete(ctx) {
- const appId = ctx.user.appId
+ const appId = ctx.appId
const { rows } = ctx.request.body
const db = new CouchDB(appId)
diff --git a/packages/server/src/api/controllers/screen.js b/packages/server/src/api/controllers/screen.js
index 8f9baa817..6095d00c9 100644
--- a/packages/server/src/api/controllers/screen.js
+++ b/packages/server/src/api/controllers/screen.js
@@ -3,7 +3,7 @@ const { getScreenParams, generateScreenID } = require("../../db/utils")
const { AccessController } = require("../../utilities/security/roles")
exports.fetch = async ctx => {
- const appId = ctx.user.appId
+ const appId = ctx.appId
const db = new CouchDB(appId)
const screens = (
@@ -21,7 +21,7 @@ exports.fetch = async ctx => {
}
exports.save = async ctx => {
- const appId = ctx.user.appId
+ const appId = ctx.appId
const db = new CouchDB(appId)
let screen = ctx.request.body
@@ -39,7 +39,7 @@ exports.save = async ctx => {
}
exports.destroy = async ctx => {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
await db.remove(ctx.params.screenId, ctx.params.screenRev)
ctx.body = {
message: "Screen deleted successfully",
diff --git a/packages/server/src/api/controllers/search/index.js b/packages/server/src/api/controllers/search/index.js
index 1810f0719..be431b62a 100644
--- a/packages/server/src/api/controllers/search/index.js
+++ b/packages/server/src/api/controllers/search/index.js
@@ -2,7 +2,7 @@ const { QueryBuilder, buildSearchUrl, search } = require("./utils")
exports.rowSearch = async ctx => {
// this can't be done through pouch, have to reach for trusty node-fetch
- const appId = ctx.user.appId
+ const appId = ctx.appId
const bookmark = ctx.params.bookmark
let url
if (ctx.params.query) {
diff --git a/packages/server/src/api/controllers/static/index.js b/packages/server/src/api/controllers/static/index.js
index 7caf6d0f7..afb1d908a 100644
--- a/packages/server/src/api/controllers/static/index.js
+++ b/packages/server/src/api/controllers/static/index.js
@@ -84,7 +84,7 @@ exports.uploadFile = async function(ctx) {
return prepareUpload({
file,
- s3Key: `assets/${ctx.user.appId}/attachments/${processedFileName}`,
+ s3Key: `assets/${ctx.appId}/attachments/${processedFileName}`,
bucket: "prod-budi-app-assets",
})
})
@@ -120,7 +120,7 @@ exports.serveApp = async function(ctx) {
exports.serveAttachment = async function(ctx) {
await returnObjectStoreFile(
ctx,
- join(ctx.user.appId, "attachments", ctx.file)
+ join(ctx.appId, "attachments", ctx.file)
)
}
@@ -128,7 +128,7 @@ exports.serveAppAsset = async function(ctx) {
if (env.isDev() || env.isTest()) {
return send(ctx, ctx.file, { root: budibaseTempDir() })
}
- await returnObjectStoreFile(ctx, join(ctx.user.appId, "public", ctx.file))
+ await returnObjectStoreFile(ctx, join(ctx.appId, "public", ctx.file))
}
exports.serveComponentLibrary = async function(ctx) {
diff --git a/packages/server/src/api/controllers/table/index.js b/packages/server/src/api/controllers/table/index.js
index 4cb1d1614..995ba8f72 100644
--- a/packages/server/src/api/controllers/table/index.js
+++ b/packages/server/src/api/controllers/table/index.js
@@ -10,7 +10,7 @@ const { FieldTypes } = require("../../../constants")
const { TableSaveFunctions } = require("./utils")
exports.fetch = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const body = await db.allDocs(
getTableParams(null, {
include_docs: true,
@@ -20,12 +20,12 @@ exports.fetch = async function(ctx) {
}
exports.find = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
ctx.body = await db.get(ctx.params.id)
}
exports.save = async function(ctx) {
- const appId = ctx.user.appId
+ const appId = ctx.appId
const db = new CouchDB(appId)
const { dataImport, ...rest } = ctx.request.body
let tableToSave = {
@@ -127,7 +127,7 @@ exports.save = async function(ctx) {
}
exports.destroy = async function(ctx) {
- const appId = ctx.user.appId
+ const appId = ctx.appId
const db = new CouchDB(appId)
const tableToDelete = await db.get(ctx.params.tableId)
diff --git a/packages/server/src/api/controllers/table/utils.js b/packages/server/src/api/controllers/table/utils.js
index 66b3651cc..0302ca18a 100644
--- a/packages/server/src/api/controllers/table/utils.js
+++ b/packages/server/src/api/controllers/table/utils.js
@@ -57,8 +57,8 @@ exports.makeSureTableUpToDate = (table, tableToSave) => {
return tableToSave
}
-exports.handleDataImport = async (user, table, dataImport) => {
- const db = new CouchDB(user.appId)
+exports.handleDataImport = async (appId, user, table, dataImport) => {
+ const db = new CouchDB(appId)
if (dataImport && dataImport.csvString) {
// Populate the table with rows imported from CSV in a bulk update
const data = await csvParser.transform(dataImport)
@@ -152,7 +152,7 @@ class TableSaveFunctions {
this.db = db
this.ctx = ctx
if (this.ctx && this.ctx.user) {
- this.appId = this.ctx.user.appId
+ this.appId = this.ctx.appId
}
this.oldTable = oldTable
this.dataImport = dataImport
@@ -184,6 +184,7 @@ class TableSaveFunctions {
async after(table) {
table = await exports.handleSearchIndexes(this.appId, table)
table = await exports.handleDataImport(
+ this.appId,
this.ctx.user,
table,
this.dataImport
diff --git a/packages/server/src/api/controllers/user.js b/packages/server/src/api/controllers/user.js
index 3dd28284b..d9a4af971 100644
--- a/packages/server/src/api/controllers/user.js
+++ b/packages/server/src/api/controllers/user.js
@@ -5,7 +5,7 @@ const { getRole } = require("../../utilities/security/roles")
const { UserStatus } = require("../../constants")
exports.fetch = async function(ctx) {
- const database = new CouchDB(ctx.user.appId)
+ const database = new CouchDB(ctx.appId)
const users = (
await database.allDocs(
getUserParams(null, {
@@ -20,15 +20,16 @@ exports.fetch = async function(ctx) {
ctx.body = users
}
+// TODO: need to replace this with something that purely manages metadata
exports.create = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const { email, password, roleId } = ctx.request.body
if (!email || !password) {
ctx.throw(400, "email and Password Required.")
}
- const role = await getRole(ctx.user.appId, roleId)
+ const role = await getRole(ctx.appId, roleId)
if (!role) ctx.throw(400, "Invalid Role")
@@ -67,7 +68,7 @@ exports.create = async function(ctx) {
}
exports.update = async function(ctx) {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const user = ctx.request.body
let dbUser
if (user.email && !user._id) {
@@ -94,7 +95,7 @@ exports.update = async function(ctx) {
}
exports.destroy = async function(ctx) {
- const database = new CouchDB(ctx.user.appId)
+ const database = new CouchDB(ctx.appId)
await database.destroy(generateUserID(ctx.params.email))
ctx.body = {
message: `User ${ctx.params.email} deleted.`,
@@ -103,7 +104,7 @@ exports.destroy = async function(ctx) {
}
exports.find = async function(ctx) {
- const database = new CouchDB(ctx.user.appId)
+ const database = new CouchDB(ctx.appId)
let lookup = ctx.params.email
? generateUserID(ctx.params.email)
: ctx.params.userId
diff --git a/packages/server/src/api/controllers/view/index.js b/packages/server/src/api/controllers/view/index.js
index 0f6f008a1..3d0f236fc 100644
--- a/packages/server/src/api/controllers/view/index.js
+++ b/packages/server/src/api/controllers/view/index.js
@@ -7,7 +7,7 @@ const { ViewNames } = require("../../../db/utils")
const controller = {
fetch: async ctx => {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const designDoc = await db.get("_design/database")
const response = []
@@ -25,7 +25,7 @@ const controller = {
ctx.body = response
},
save: async ctx => {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const { originalName, ...viewToSave } = ctx.request.body
const designDoc = await db.get("_design/database")
const view = viewTemplate(viewToSave)
@@ -66,7 +66,7 @@ const controller = {
}
},
destroy: async ctx => {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const designDoc = await db.get("_design/database")
const viewName = decodeURI(ctx.params.viewName)
const view = designDoc.views[viewName]
@@ -81,7 +81,7 @@ const controller = {
ctx.body = view
},
exportView: async ctx => {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const designDoc = await db.get("_design/database")
const viewName = decodeURI(ctx.query.view)
diff --git a/packages/server/src/api/controllers/webhook.js b/packages/server/src/api/controllers/webhook.js
index 5b76f8619..c810f8500 100644
--- a/packages/server/src/api/controllers/webhook.js
+++ b/packages/server/src/api/controllers/webhook.js
@@ -22,7 +22,7 @@ exports.WebhookType = {
}
exports.fetch = async ctx => {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const response = await db.allDocs(
getWebhookParams(null, {
include_docs: true,
@@ -32,9 +32,9 @@ exports.fetch = async ctx => {
}
exports.save = async ctx => {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
const webhook = ctx.request.body
- webhook.appId = ctx.user.appId
+ webhook.appId = ctx.appId
// check that the webhook exists
if (webhook._id) {
@@ -51,7 +51,7 @@ exports.save = async ctx => {
}
exports.destroy = async ctx => {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
ctx.body = await db.remove(ctx.params.id, ctx.params.rev)
}
diff --git a/packages/server/src/api/routes/tests/misc.spec.js b/packages/server/src/api/routes/tests/misc.spec.js
index 2957e42d9..f9608c0d4 100644
--- a/packages/server/src/api/routes/tests/misc.spec.js
+++ b/packages/server/src/api/routes/tests/misc.spec.js
@@ -41,10 +41,12 @@ describe("run misc tests", () => {
const dataImport = {
csvString: "a,b,c,d\n1,2,3,4"
}
- await tableUtils.handleDataImport({
- appId: config.getAppId(),
- userId: "test",
- }, table, dataImport)
+ await tableUtils.handleDataImport(
+ config.getAppId(),
+ { userId: "test" },
+ table,
+ dataImport
+ )
const rows = await config.getRows()
expect(rows[0].a).toEqual("1")
expect(rows[0].b).toEqual("2")
diff --git a/packages/server/src/middleware/authenticated.js b/packages/server/src/middleware/authenticated.js
index 32ed3f63d..d27b88ae9 100644
--- a/packages/server/src/middleware/authenticated.js
+++ b/packages/server/src/middleware/authenticated.js
@@ -41,7 +41,6 @@ module.exports = async (ctx, next) => {
ctx.auth.authenticated = false
ctx.appId = appId
ctx.user = {
- appId,
role: builtinRoles.PUBLIC,
}
await next()
@@ -55,9 +54,10 @@ module.exports = async (ctx, next) => {
ctx.auth.apiKey = jwtPayload.apiKey
ctx.user = {
...jwtPayload,
- appId: appId,
role: await getRole(appId, jwtPayload.roleId),
}
+ // appId no longer carried in user, make sure
+ delete ctx.user.appId
} catch (err) {
console.log(err)
if (authType === AuthTypes.BUILDER) {
diff --git a/packages/server/src/middleware/usageQuota.js b/packages/server/src/middleware/usageQuota.js
index 1bc829fbc..a37f089a6 100644
--- a/packages/server/src/middleware/usageQuota.js
+++ b/packages/server/src/middleware/usageQuota.js
@@ -27,7 +27,7 @@ function getProperty(url) {
}
module.exports = async (ctx, next) => {
- const db = new CouchDB(ctx.user.appId)
+ const db = new CouchDB(ctx.appId)
let usage = METHOD_MAP[ctx.req.method]
const property = getProperty(ctx.req.url)
if (usage == null || property == null) {
diff --git a/packages/server/src/utilities/bcrypt.js b/packages/server/src/utilities/bcrypt.js
index 58a37c06a..6c52d2c2c 100644
--- a/packages/server/src/utilities/bcrypt.js
+++ b/packages/server/src/utilities/bcrypt.js
@@ -1,3 +1,5 @@
+// TODO: REMOVE
+
const bcrypt = require("bcryptjs")
const env = require("../environment")
From b7a31f9a43df4fa951350246db2b0b05a3828398 Mon Sep 17 00:00:00 2001
From: Theo Melo <9499829+theomelo@users.noreply.github.com>
Date: Thu, 1 Apr 2021 11:43:47 -0700
Subject: [PATCH 012/135] fix(README): Broken troubeshooting link
---
README.md | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index 04bb71fb5..d60cb52f5 100644
--- a/README.md
+++ b/README.md
@@ -31,7 +31,7 @@
-
+
@@ -58,9 +58,9 @@
## ✨ Features
-When other platforms chose the closed source route, we decided to go open source. When other platforms chose cloud builders, we decided a local builder offered the better developer experience. We like to do things differently at Budibase.
+When other platforms chose the closed source route, we decided to go open source. When other platforms chose cloud builders, we decided a local builder offered the better developer experience. We like to do things differently at Budibase.
-- **Build and ship real software.** Unlike other platforms, with Budibase you build and ship single page applications. Budibase applications have performance baked in and can be designed responsively, providing your users with a great experience.
+- **Build and ship real software.** Unlike other platforms, with Budibase you build and ship single page applications. Budibase applications have performance baked in and can be designed responsively, providing your users with a great experience.
- **Open source and extensable.** Budibase is open-source. The builder is licensed AGPL v3, the server is GPL v3, and the client is MPL. This should fill you with confidence that Budibase will always be around. You can also code against Budibase or fork it and make changes as you please, providing a developer-friendly experience.
@@ -83,7 +83,7 @@ When other platforms chose the closed source route, we decided to go open source
- [x] Public Beta: Anyone can [sign-up and use Budibase](https://portal.budi.live/signup).
- [ ] Official Launch
-Watch "releases" of this repo to get notified of major updates, and give the star button a click whilst you're there.
+Watch "releases" of this repo to get notified of major updates, and give the star button a click whilst you're there.
@@ -93,7 +93,7 @@ Watch "releases" of this repo to get notified of major updates, and give the sta
[](https://starchart.cc/Budibase/budibase)
-If you are having issues between updates of the builder, please use the guide [here](https://github.com/Budibase/budibase/blob/master/CONTRIBUTING.md#troubleshooting) to clear down your environment.
+If you are having issues between updates of the builder, please use the guide [here](https://github.com/Budibase/budibase/blob/next/.github/CONTRIBUTING.md#troubleshooting) to clear down your environment.
## 🏁 Getting Started with Budibase
@@ -131,14 +131,14 @@ Checkout our [Public Roadmap](https://github.com/Budibase/budibase/projects/10).
## ❗ Code of Conduct
-Budibase is dedicated to providing a welcoming, diverse, and harrassment-free experience for everyone. We expect everyone in the Budibase community to abide by our [**Code of Conduct**](https://github.com/Budibase/budibase/blob/master/.github/CODE_OF_CONDUCT.md). Please read it.
+Budibase is dedicated to providing a welcoming, diverse, and harrassment-free experience for everyone. We expect everyone in the Budibase community to abide by our [**Code of Conduct**](https://github.com/Budibase/budibase/blob/master/.github/CODE_OF_CONDUCT.md). Please read it.
## 🙌 Contributing to Budibase
From opening a bug report to creating a pull request: every contribution is appreciated and welcomed. If you're planning to implement a new feature or change the API please create an issue first. This way we can ensure your work is not in vain.
### Not Sure Where to Start?
-A good place to start contributing, is the [First time issues project](https://github.com/Budibase/budibase/projects/22).
+A good place to start contributing, is the [First time issues project](https://github.com/Budibase/budibase/projects/22).
### How the repository is organized
Budibase is a monorepo managed by lerna. Lerna manages the building and publishing of the budibase packages. At a high level, here are the packages that make up Budibase.
From 155824d652fa5eace79e6887cd109864abbab584 Mon Sep 17 00:00:00 2001
From: Theo Melo <9499829+theomelo@users.noreply.github.com>
Date: Thu, 1 Apr 2021 11:52:23 -0700
Subject: [PATCH 013/135] fix(README) Update places referencing old default
branch name
---
README.md | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/README.md b/README.md
index d60cb52f5..d3db6144b 100644
--- a/README.md
+++ b/README.md
@@ -131,7 +131,7 @@ Checkout our [Public Roadmap](https://github.com/Budibase/budibase/projects/10).
## ❗ Code of Conduct
-Budibase is dedicated to providing a welcoming, diverse, and harrassment-free experience for everyone. We expect everyone in the Budibase community to abide by our [**Code of Conduct**](https://github.com/Budibase/budibase/blob/master/.github/CODE_OF_CONDUCT.md). Please read it.
+Budibase is dedicated to providing a welcoming, diverse, and harrassment-free experience for everyone. We expect everyone in the Budibase community to abide by our [**Code of Conduct**](https://github.com/Budibase/budibase/blob/next/.github/CODE_OF_CONDUCT.md). Please read it.
## 🙌 Contributing to Budibase
@@ -143,13 +143,13 @@ A good place to start contributing, is the [First time issues project](https://g
### How the repository is organized
Budibase is a monorepo managed by lerna. Lerna manages the building and publishing of the budibase packages. At a high level, here are the packages that make up Budibase.
-- [packages/builder](https://github.com/Budibase/budibase/tree/master/packages/builder) - contains code for the budibase builder client side svelte application.
+- [packages/builder](https://github.com/Budibase/budibase/tree/next/packages/builder) - contains code for the budibase builder client side svelte application.
-- [packages/client](https://github.com/Budibase/budibase/tree/master/packages/client) - A module that runs in the browser responsible for reading JSON definition and creating living, breathing web apps from it.
+- [packages/client](https://github.com/Budibase/budibase/tree/next/packages/client) - A module that runs in the browser responsible for reading JSON definition and creating living, breathing web apps from it.
-- [packages/server](https://github.com/Budibase/budibase/tree/master/packages/server) - The budibase server. This Koa app is responsible for serving the JS for the builder and budibase apps, as well as providing the API for interaction with the database and file system.
+- [packages/server](https://github.com/Budibase/budibase/tree/next/packages/server) - The budibase server. This Koa app is responsible for serving the JS for the builder and budibase apps, as well as providing the API for interaction with the database and file system.
-For more information, see [CONTRIBUTING.md](https://github.com/Budibase/budibase/blob/master/.github/CONTRIBUTING.md)
+For more information, see [CONTRIBUTING.md](https://github.com/Budibase/budibase/blob/next/.github/CONTRIBUTING.md)
## 📝 License
From 349a47c1e19dbeda938f19c4331261a92809be41 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Thu, 1 Apr 2021 20:34:43 +0100
Subject: [PATCH 014/135] basic couchDB authentication using passport
---
packages/worker/package.json | 4 +
.../worker/src/api/controllers/admin/auth.js | 14 ++
.../worker/src/api/controllers/admin/index.js | 17 +-
packages/worker/src/api/routes/admin/auth.js | 8 +
packages/worker/src/api/routes/admin/index.js | 5 +-
packages/worker/src/db/utils.js | 6 +-
packages/worker/src/index.js | 6 +
packages/worker/src/middleware/auth/google.js | 13 ++
packages/worker/src/middleware/auth/index.js | 20 ++
packages/worker/src/middleware/auth/jwt.js | 38 ++++
packages/worker/src/middleware/auth/local.js | 58 ++++++
.../src/{api/controllers/admin => }/utils.js | 4 +-
packages/worker/yarn.lock | 186 +++++++++++++++++-
13 files changed, 365 insertions(+), 14 deletions(-)
create mode 100644 packages/worker/src/api/controllers/admin/auth.js
create mode 100644 packages/worker/src/api/routes/admin/auth.js
create mode 100644 packages/worker/src/middleware/auth/google.js
create mode 100644 packages/worker/src/middleware/auth/index.js
create mode 100644 packages/worker/src/middleware/auth/jwt.js
create mode 100644 packages/worker/src/middleware/auth/local.js
rename packages/worker/src/{api/controllers/admin => }/utils.js (87%)
diff --git a/packages/worker/package.json b/packages/worker/package.json
index 73b417c58..8f9e30139 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -28,11 +28,15 @@
"koa": "^2.7.0",
"koa-body": "^4.2.0",
"koa-compress": "^4.0.1",
+ "koa-passport": "^4.1.4",
"koa-pino-logger": "^3.0.0",
"koa-send": "^5.0.0",
"koa-session": "^5.12.0",
"koa-static": "^5.0.0",
"node-fetch": "^2.6.1",
+ "passport-google-oauth": "^2.0.0",
+ "passport-jwt": "^4.0.0",
+ "passport-local": "^1.0.0",
"pino-pretty": "^4.0.0",
"pouchdb": "^7.2.1",
"pouchdb-all-dbs": "^1.0.2",
diff --git a/packages/worker/src/api/controllers/admin/auth.js b/packages/worker/src/api/controllers/admin/auth.js
new file mode 100644
index 000000000..f6b25091a
--- /dev/null
+++ b/packages/worker/src/api/controllers/admin/auth.js
@@ -0,0 +1,14 @@
+const jwt = require("jsonwebtoken")
+const CouchDB = require("../../../db")
+const passport = require("koa-passport")
+
+exports.authenticate = async (ctx, next) => {
+ return passport.authenticate("local", (err, user, info, status) => {
+ ctx.body = {
+ err,
+ user,
+ info,
+ status,
+ }
+ })(ctx, next)
+}
diff --git a/packages/worker/src/api/controllers/admin/index.js b/packages/worker/src/api/controllers/admin/index.js
index f94cf39fc..b6531174b 100644
--- a/packages/worker/src/api/controllers/admin/index.js
+++ b/packages/worker/src/api/controllers/admin/index.js
@@ -1,6 +1,10 @@
const CouchDB = require("../../../db")
-const { StaticDatabases, generateUserID, getUserParams } = require("../../../db/utils")
-const { hash } = require("./utils")
+const {
+ StaticDatabases,
+ generateUserID,
+ getUserParams,
+} = require("../../../db/utils")
+const { hash } = require("../../../utils")
const { UserStatus } = require("../../../constants")
const USER_DB = StaticDatabases.USER.name
@@ -10,10 +14,11 @@ exports.userSave = async ctx => {
const { email, password, _id } = ctx.request.body
const hashedPassword = password ? await hash(password) : null
let user = {
- ...ctx.request.body,
- _id: generateUserID(email),
- password: hashedPassword,
- }, dbUser
+ ...ctx.request.body,
+ _id: generateUserID(email),
+ password: hashedPassword,
+ },
+ dbUser
// in-case user existed already
if (_id) {
dbUser = await db.get(_id)
diff --git a/packages/worker/src/api/routes/admin/auth.js b/packages/worker/src/api/routes/admin/auth.js
new file mode 100644
index 000000000..ca41e9e19
--- /dev/null
+++ b/packages/worker/src/api/routes/admin/auth.js
@@ -0,0 +1,8 @@
+// const Router = require("@koa/router")
+// const controller = require("../controllers/auth")
+
+// const router = Router()
+
+// router.post("/api/authenticate", controller.authenticate)
+
+// module.exports = router
diff --git a/packages/worker/src/api/routes/admin/index.js b/packages/worker/src/api/routes/admin/index.js
index 9d8592790..cf3a5c021 100644
--- a/packages/worker/src/api/routes/admin/index.js
+++ b/packages/worker/src/api/routes/admin/index.js
@@ -1,10 +1,13 @@
const Router = require("@koa/router")
const controller = require("../../controllers/admin")
+const authController = require("../../controllers/admin/auth")
const authorized = require("../../../middleware/authorized")
const router = Router()
-router.post("/api/admin/users", authorized, controller.userSave)
+router
+ .post("/api/admin/users", authorized, controller.userSave)
+ .post("/api/admin/authenticate", authController.authenticate)
.delete("/api/admin/users/:email", authorized, controller.userDelete)
.get("/api/admin/users", authorized, controller.userFetch)
.get("/api/admin/users/:email", authorized, controller.userFind)
diff --git a/packages/worker/src/db/utils.js b/packages/worker/src/db/utils.js
index aa274eff3..cda770882 100644
--- a/packages/worker/src/db/utils.js
+++ b/packages/worker/src/db/utils.js
@@ -1,11 +1,11 @@
exports.StaticDatabases = {
USER: {
name: "user-db",
- }
+ },
}
const DocumentTypes = {
- USER: "us"
+ USER: "us",
}
const UNICODE_MAX = "\ufff0"
@@ -29,4 +29,4 @@ exports.getUserParams = (email = "", otherProps = {}) => {
startkey: `${DocumentTypes.USER}${SEPARATOR}${email}`,
endkey: `${DocumentTypes.USER}${SEPARATOR}${email}${UNICODE_MAX}`,
}
-}
\ No newline at end of file
+}
diff --git a/packages/worker/src/index.js b/packages/worker/src/index.js
index 2426b3941..199bb1d31 100644
--- a/packages/worker/src/index.js
+++ b/packages/worker/src/index.js
@@ -1,6 +1,7 @@
const Koa = require("koa")
const destroyable = require("server-destroy")
const koaBody = require("koa-body")
+const passport = require("koa-passport")
const logger = require("koa-pino-logger")
const http = require("http")
const api = require("./api")
@@ -24,6 +25,11 @@ app.use(
})
)
+// authentication
+require("./middleware/auth")
+app.use(passport.initialize())
+app.use(passport.session())
+
// api routes
app.use(api.routes())
diff --git a/packages/worker/src/middleware/auth/google.js b/packages/worker/src/middleware/auth/google.js
new file mode 100644
index 000000000..fd33bc89a
--- /dev/null
+++ b/packages/worker/src/middleware/auth/google.js
@@ -0,0 +1,13 @@
+// const GoogleStrategy = require("passport-google-auth").Strategy
+
+exports.options = {
+ clientId: "your-client-id",
+ clientSecret: "your-secret",
+ callbackURL:
+ "http://localhost:" + (process.env.PORT || 3000) + "/auth/google/callback",
+}
+
+exports.authenticate = async function(token, tokenSecret, profile, done) {
+ // retrieve user ...
+ // fetchUser().then(user => done(null, user))
+}
diff --git a/packages/worker/src/middleware/auth/index.js b/packages/worker/src/middleware/auth/index.js
new file mode 100644
index 000000000..3eac2badb
--- /dev/null
+++ b/packages/worker/src/middleware/auth/index.js
@@ -0,0 +1,20 @@
+const passport = require("koa-passport")
+const LocalStrategy = require("passport-local").Strategy
+const JwtStrategy = require("passport-jwt").Strategy
+const GoogleStrategy = require("passport-google-oauth").Strategy
+const jwt = require("./jwt")
+const local = require("./local")
+const google = require("./google")
+
+// Strategies
+passport.use(new LocalStrategy(local.options, local.authenticate))
+passport.use(new JwtStrategy(jwt.options, jwt.authenticate))
+// passport.use(new GoogleStrategy(google.options, google.authenticate))
+
+// exports.middleware = async (ctx, next) => {
+// if (ctx.isAuthenticated()) {
+// return next()
+// } else {
+// ctx.throw(403, "Not Authenticated")
+// }
+// }
diff --git a/packages/worker/src/middleware/auth/jwt.js b/packages/worker/src/middleware/auth/jwt.js
new file mode 100644
index 000000000..8313d5abc
--- /dev/null
+++ b/packages/worker/src/middleware/auth/jwt.js
@@ -0,0 +1,38 @@
+const jwt = require("passport-jwt")
+const env = require("../../environment")
+const { getCookieName } = require("../../../../server/src/utilities")
+
+const ExtractJWT = jwt.ExtractJwt
+
+exports.options = {
+ jwtFromRequest: function(ctx) {
+ return ctx.cookies.get("budibase")
+ },
+ // TODO: fix
+ secretOrKey: env.JWT_SECRET || "funky",
+}
+
+exports.authenticate = async function(jwt, done) {
+ console.log(jwt)
+ done({ name: "joe" })
+ // const appId = ctx.appId
+ // if (!appId) ctx.throw(400, "No appId")
+
+ // const { email, password } = ctx.request.body
+
+ // if (!email) ctx.throw(400, "Email Required.")
+ // if (!password) ctx.throw(400, "Password Required.")
+
+ // // Check the user exists in the instance DB by email
+ // const db = new CouchDB(appId)
+ // const app = await db.get(appId)
+
+ // let dbUser
+ // try {
+ // dbUser = await db.get(generateUserID(email))
+ // } catch (_) {
+ // // do not want to throw a 404 - as this could be
+ // // used to determine valid emails
+ // ctx.throw(401, INVALID_ERR)
+ // }
+}
diff --git a/packages/worker/src/middleware/auth/local.js b/packages/worker/src/middleware/auth/local.js
new file mode 100644
index 000000000..413ab1c8f
--- /dev/null
+++ b/packages/worker/src/middleware/auth/local.js
@@ -0,0 +1,58 @@
+const jwt = require("jsonwebtoken")
+const { UserStatus } = require("../../constants")
+const CouchDB = require("../../db")
+const { StaticDatabases, generateUserID } = require("../../db/utils")
+const { compare } = require("../../utils")
+const env = require("../../environment")
+
+const INVALID_ERR = "Invalid Credentials"
+
+exports.options = {}
+
+/**
+ * Passport Local Authentication Middleware.
+ * @param {*} username - username to login with
+ * @param {*} password - plain text password to log in with
+ * @param {*} done - callback from passport to return user information and errors
+ * @returns The authenticated user, or errors if they occur
+ */
+exports.authenticate = async function(username, password, done) {
+ if (!username) return done(null, false, "Email Required.")
+ if (!password) return done(null, false, "Password Required.")
+
+ // Check the user exists in the instance DB by email
+ const db = new CouchDB(StaticDatabases.USER.name)
+
+ let dbUser
+ try {
+ dbUser = await db.get(generateUserID(username))
+ } catch {
+ console.error("User not found")
+ return done(null, false, { message: "User not found" })
+ }
+
+ // check that the user is currently inactive, if this is the case throw invalid
+ if (dbUser.status === UserStatus.INACTIVE) {
+ return done(null, false, { message: INVALID_ERR })
+ }
+
+ // authenticate
+ if (await compare(password, dbUser.password)) {
+ const payload = {
+ userId: dbUser._id,
+ }
+
+ const token = jwt.sign(payload, env.JWT_SECRET, {
+ expiresIn: "1 day",
+ })
+
+ // TODO: remove and use cookie
+ dbUser.token = token
+ // setCookie(ctx, token, appId)
+
+ delete dbUser.password
+ return done(null, dbUser)
+ } else {
+ done(new Error(INVALID_ERR), false)
+ }
+}
diff --git a/packages/worker/src/api/controllers/admin/utils.js b/packages/worker/src/utils.js
similarity index 87%
rename from packages/worker/src/api/controllers/admin/utils.js
rename to packages/worker/src/utils.js
index 4af0a52c4..0711ae67b 100644
--- a/packages/worker/src/api/controllers/admin/utils.js
+++ b/packages/worker/src/utils.js
@@ -1,5 +1,5 @@
const bcrypt = require("bcryptjs")
-const env = require("../environment")
+const env = require("./environment")
const SALT_ROUNDS = env.SALT_ROUNDS || 10
@@ -10,4 +10,4 @@ exports.hash = async data => {
exports.compare = async (data, encrypted) => {
return bcrypt.compare(data, encrypted)
-}
\ No newline at end of file
+}
diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock
index d969c67ce..df8965f51 100644
--- a/packages/worker/yarn.lock
+++ b/packages/worker/yarn.lock
@@ -285,6 +285,11 @@ base64-js@^1.0.2, base64-js@^1.3.1:
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+base64url@3.x.x:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d"
+ integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==
+
bcryptjs@^2.4.3:
version "2.4.3"
resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
@@ -324,6 +329,11 @@ braces@~3.0.2:
dependencies:
fill-range "^7.0.1"
+buffer-equal-constant-time@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
+ integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
+
buffer-from@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
@@ -712,6 +722,13 @@ duplexer3@^0.1.4:
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+ecdsa-sig-formatter@1.0.11:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
+ integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
+ dependencies:
+ safe-buffer "^5.0.1"
+
ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
@@ -1270,6 +1287,22 @@ json-buffer@3.0.1:
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+jsonwebtoken@^8.2.0:
+ version "8.5.1"
+ resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
+ integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==
+ dependencies:
+ jws "^3.2.2"
+ lodash.includes "^4.3.0"
+ lodash.isboolean "^3.0.3"
+ lodash.isinteger "^4.0.4"
+ lodash.isnumber "^3.0.3"
+ lodash.isplainobject "^4.0.6"
+ lodash.isstring "^4.0.1"
+ lodash.once "^4.0.0"
+ ms "^2.1.1"
+ semver "^5.6.0"
+
jstransform@~11.0.0:
version "11.0.3"
resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-11.0.3.tgz#09a78993e0ae4d4ef4487f6155a91f6190cb4223"
@@ -1290,6 +1323,23 @@ jstransform@~3.0.0:
esprima-fb "~3001.1.0-dev-harmony-fb"
source-map "0.1.31"
+jwa@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
+ integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
+ dependencies:
+ buffer-equal-constant-time "1.0.1"
+ ecdsa-sig-formatter "1.0.11"
+ safe-buffer "^5.0.1"
+
+jws@^3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
+ integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
+ dependencies:
+ jwa "^1.4.1"
+ safe-buffer "^5.0.1"
+
keygrip@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/keygrip/-/keygrip-1.1.0.tgz#871b1681d5e159c62a445b0c74b615e0917e7226"
@@ -1356,6 +1406,13 @@ koa-is-json@^1.0.0:
resolved "https://registry.yarnpkg.com/koa-is-json/-/koa-is-json-1.0.0.tgz#273c07edcdcb8df6a2c1ab7d59ee76491451ec14"
integrity sha1-JzwH7c3Ljfaiwat9We52SRRR7BQ=
+koa-passport@^4.1.4:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/koa-passport/-/koa-passport-4.1.4.tgz#5f1665c1c2a37ace79af9f970b770885ca30ccfa"
+ integrity sha512-dJBCkl4X+zdYxbI2V2OtoGy0PUenpvp2ZLLWObc8UJhsId0iQpTFT8RVcuA0709AL2txGwRHnSPoT1bYNGa6Kg==
+ dependencies:
+ passport "^0.4.0"
+
koa-pino-logger@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/koa-pino-logger/-/koa-pino-logger-3.0.0.tgz#27600b4f3639e8767dfc6b66493109c5457f53ba"
@@ -1530,6 +1587,41 @@ lie@3.0.4:
inline-process-browser "^1.0.0"
unreachable-branch-transform "^0.3.0"
+lodash.includes@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
+ integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=
+
+lodash.isboolean@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
+ integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=
+
+lodash.isinteger@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
+ integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=
+
+lodash.isnumber@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
+ integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=
+
+lodash.isplainobject@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+ integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
+
+lodash.isstring@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
+ integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
+
+lodash.once@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
+ integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
+
lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
@@ -1686,6 +1778,11 @@ normalize-url@^4.1.0:
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
+oauth@0.9.x:
+ version "0.9.15"
+ resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1"
+ integrity sha1-vR/vr2hslrdUda7VGWQS/2DPucE=
+
object-assign@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa"
@@ -1740,6 +1837,76 @@ parseurl@^1.3.2:
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+passport-google-oauth1@1.x.x:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/passport-google-oauth1/-/passport-google-oauth1-1.0.0.tgz#af74a803df51ec646f66a44d82282be6f108e0cc"
+ integrity sha1-r3SoA99R7GRvZqRNgigr5vEI4Mw=
+ dependencies:
+ passport-oauth1 "1.x.x"
+
+passport-google-oauth20@2.x.x:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz#0d241b2d21ebd3dc7f2b60669ec4d587e3a674ef"
+ integrity sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==
+ dependencies:
+ passport-oauth2 "1.x.x"
+
+passport-google-oauth@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/passport-google-oauth/-/passport-google-oauth-2.0.0.tgz#f6eb4bc96dd6c16ec0ecfdf4e05ec48ca54d4dae"
+ integrity sha512-JKxZpBx6wBQXX1/a1s7VmdBgwOugohH+IxCy84aPTZNq/iIPX6u7Mqov1zY7MKRz3niFPol0KJz8zPLBoHKtYA==
+ dependencies:
+ passport-google-oauth1 "1.x.x"
+ passport-google-oauth20 "2.x.x"
+
+passport-jwt@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/passport-jwt/-/passport-jwt-4.0.0.tgz#7f0be7ba942e28b9f5d22c2ebbb8ce96ef7cf065"
+ integrity sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==
+ dependencies:
+ jsonwebtoken "^8.2.0"
+ passport-strategy "^1.0.0"
+
+passport-local@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/passport-local/-/passport-local-1.0.0.tgz#1fe63268c92e75606626437e3b906662c15ba6ee"
+ integrity sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=
+ dependencies:
+ passport-strategy "1.x.x"
+
+passport-oauth1@1.x.x:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/passport-oauth1/-/passport-oauth1-1.1.0.tgz#a7de988a211f9cf4687377130ea74df32730c918"
+ integrity sha1-p96YiiEfnPRoc3cTDqdN8ycwyRg=
+ dependencies:
+ oauth "0.9.x"
+ passport-strategy "1.x.x"
+ utils-merge "1.x.x"
+
+passport-oauth2@1.x.x:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.5.0.tgz#64babbb54ac46a4dcab35e7f266ed5294e3c4108"
+ integrity sha512-kqBt6vR/5VlCK8iCx1/KpY42kQ+NEHZwsSyt4Y6STiNjU+wWICG1i8ucc1FapXDGO15C5O5VZz7+7vRzrDPXXQ==
+ dependencies:
+ base64url "3.x.x"
+ oauth "0.9.x"
+ passport-strategy "1.x.x"
+ uid2 "0.0.x"
+ utils-merge "1.x.x"
+
+passport-strategy@1.x.x, passport-strategy@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4"
+ integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=
+
+passport@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/passport/-/passport-0.4.1.tgz#941446a21cb92fc688d97a0861c38ce9f738f270"
+ integrity sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==
+ dependencies:
+ passport-strategy "1.x.x"
+ pause "0.0.1"
+
path-is-absolute@1.0.1, path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
@@ -1752,6 +1919,11 @@ path-to-regexp@1.x:
dependencies:
isarray "0.0.1"
+pause@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d"
+ integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=
+
picomatch@^2.0.4, picomatch@^2.2.1:
version "2.2.2"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
@@ -2051,7 +2223,7 @@ safe-buffer@5.1.2:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-safe-buffer@~5.2.0:
+safe-buffer@^5.0.1, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -2078,7 +2250,7 @@ semver-diff@^3.1.1:
dependencies:
semver "^6.3.0"
-semver@^5.7.1:
+semver@^5.6.0, semver@^5.7.1:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -2319,6 +2491,11 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"
+uid2@0.0.x:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82"
+ integrity sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=
+
undefsafe@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae"
@@ -2396,6 +2573,11 @@ util-deprecate@^1.0.1:
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+utils-merge@1.x.x:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
uuid@3.3.2:
version "3.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
From c659968bd96498a19658b3ab112c49a24fb52dde Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Tue, 6 Apr 2021 18:08:07 +0100
Subject: [PATCH 015/135] Formatting.
---
packages/server/src/api/controllers/static/index.js | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/packages/server/src/api/controllers/static/index.js b/packages/server/src/api/controllers/static/index.js
index afb1d908a..e05327d9f 100644
--- a/packages/server/src/api/controllers/static/index.js
+++ b/packages/server/src/api/controllers/static/index.js
@@ -118,10 +118,7 @@ exports.serveApp = async function(ctx) {
}
exports.serveAttachment = async function(ctx) {
- await returnObjectStoreFile(
- ctx,
- join(ctx.appId, "attachments", ctx.file)
- )
+ await returnObjectStoreFile(ctx, join(ctx.appId, "attachments", ctx.file))
}
exports.serveAppAsset = async function(ctx) {
From 87b1924470d2f4b0ac16f5b2c755dd0f559ab6e8 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Wed, 7 Apr 2021 11:33:16 +0100
Subject: [PATCH 016/135] groundwork for budibase auth lib
---
packages/auth/.gitignore | 117 ++
packages/auth/README.md | 1 +
packages/auth/package.json | 18 +
packages/auth/src/constants.js | 9 +
packages/auth/src/db/index.js | 11 +
packages/auth/src/db/utils.js | 32 +
packages/auth/src/hashing.js | 12 +
packages/auth/src/index.js | 31 +
packages/auth/src/middleware/authenticated.js | 73 ++
packages/auth/src/middleware/google.js | 13 +
packages/auth/src/middleware/index.js | 9 +
packages/auth/src/middleware/jwt.js | 19 +
.../auth => auth/src/middleware}/local.js | 22 +-
packages/auth/yarn.lock | 950 ++++++++++++++
packages/server/package.json | 1 -
packages/server/yarn.lock | 1116 +----------------
packages/worker/package.json | 1 +
.../worker/src/api/controllers/admin/auth.js | 10 +-
packages/worker/src/api/routes/admin/auth.js | 8 -
packages/worker/src/api/routes/admin/index.js | 11 +-
packages/worker/src/index.js | 3 +-
packages/worker/src/middleware/auth/google.js | 13 -
packages/worker/src/middleware/auth/index.js | 20 -
packages/worker/src/middleware/auth/jwt.js | 38 -
packages/worker/src/middleware/authorized.js | 2 +-
25 files changed, 1330 insertions(+), 1210 deletions(-)
create mode 100644 packages/auth/.gitignore
create mode 100644 packages/auth/README.md
create mode 100644 packages/auth/package.json
create mode 100644 packages/auth/src/constants.js
create mode 100644 packages/auth/src/db/index.js
create mode 100644 packages/auth/src/db/utils.js
create mode 100644 packages/auth/src/hashing.js
create mode 100644 packages/auth/src/index.js
create mode 100644 packages/auth/src/middleware/authenticated.js
create mode 100644 packages/auth/src/middleware/google.js
create mode 100644 packages/auth/src/middleware/index.js
create mode 100644 packages/auth/src/middleware/jwt.js
rename packages/{worker/src/middleware/auth => auth/src/middleware}/local.js (74%)
create mode 100644 packages/auth/yarn.lock
delete mode 100644 packages/worker/src/api/routes/admin/auth.js
delete mode 100644 packages/worker/src/middleware/auth/google.js
delete mode 100644 packages/worker/src/middleware/auth/index.js
delete mode 100644 packages/worker/src/middleware/auth/jwt.js
diff --git a/packages/auth/.gitignore b/packages/auth/.gitignore
new file mode 100644
index 000000000..2528ad91a
--- /dev/null
+++ b/packages/auth/.gitignore
@@ -0,0 +1,117 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+
+# Diagnostic reports (https://nodejs.org/api/report.html)
+report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+*.lcov
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Snowpack dependency directory (https://snowpack.dev/)
+web_modules/
+
+# TypeScript cache
+*.tsbuildinfo
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Microbundle cache
+.rpt2_cache/
+.rts2_cache_cjs/
+.rts2_cache_es/
+.rts2_cache_umd/
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+.env.test
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+.parcel-cache
+
+# Next.js build output
+.next
+out
+
+# Nuxt.js build / generate output
+.nuxt
+dist
+
+# Gatsby files
+.cache/
+# Comment in the public line in if your project uses Gatsby and not Next.js
+# https://nextjs.org/blog/next-9-1#public-directory-support
+# public
+
+# vuepress build output
+.vuepress/dist
+
+# Serverless directories
+.serverless/
+
+# FuseBox cache
+.fusebox/
+
+# DynamoDB Local files
+.dynamodb/
+
+# TernJS port file
+.tern-port
+
+# Stores VSCode versions used for testing VSCode extensions
+.vscode-test
+
+# yarn v2
+.yarn/cache
+.yarn/unplugged
+.yarn/build-state.yml
+.yarn/install-state.gz
+.pnp.*
+
diff --git a/packages/auth/README.md b/packages/auth/README.md
new file mode 100644
index 000000000..bbe704026
--- /dev/null
+++ b/packages/auth/README.md
@@ -0,0 +1 @@
+# Budibase Authentication Library
\ No newline at end of file
diff --git a/packages/auth/package.json b/packages/auth/package.json
new file mode 100644
index 000000000..ff59eeb7b
--- /dev/null
+++ b/packages/auth/package.json
@@ -0,0 +1,18 @@
+{
+ "name": "@budibase/auth",
+ "version": "0.0.1",
+ "description": "Authentication middlewares for budibase builder and apps",
+ "main": "src/index.js",
+ "author": "Budibase",
+ "license": "AGPL-3.0",
+ "dependencies": {
+ "bcryptjs": "^2.4.3",
+ "jsonwebtoken": "^8.5.1",
+ "koa-passport": "^4.1.4",
+ "passport-google-auth": "^1.0.2",
+ "passport-google-oauth": "^2.0.0",
+ "passport-jwt": "^4.0.0",
+ "passport-local": "^1.0.0",
+ "pouchdb": "^7.2.2"
+ }
+}
diff --git a/packages/auth/src/constants.js b/packages/auth/src/constants.js
new file mode 100644
index 000000000..b6946a543
--- /dev/null
+++ b/packages/auth/src/constants.js
@@ -0,0 +1,9 @@
+exports.UserStatus = {
+ ACTIVE: "active",
+ INACTIVE: "inactive",
+}
+
+exports.Cookies = {
+ CurrentApp: "budibase:currentapp",
+ Auth: "budibase:auth",
+}
diff --git a/packages/auth/src/db/index.js b/packages/auth/src/db/index.js
new file mode 100644
index 000000000..4db890f01
--- /dev/null
+++ b/packages/auth/src/db/index.js
@@ -0,0 +1,11 @@
+const PouchDB = require("pouchdb")
+
+// level option is purely for testing (development)
+const COUCH_DB_URL =
+ process.env.COUCH_DB_URL || "http://budibase:budibase@localhost:10000/db/"
+
+const Pouch = PouchDB.defaults({
+ prefix: COUCH_DB_URL,
+})
+
+module.exports = Pouch
diff --git a/packages/auth/src/db/utils.js b/packages/auth/src/db/utils.js
new file mode 100644
index 000000000..cda770882
--- /dev/null
+++ b/packages/auth/src/db/utils.js
@@ -0,0 +1,32 @@
+exports.StaticDatabases = {
+ USER: {
+ name: "user-db",
+ },
+}
+
+const DocumentTypes = {
+ USER: "us",
+}
+
+const UNICODE_MAX = "\ufff0"
+const SEPARATOR = "_"
+
+/**
+ * Generates a new user ID based on the passed in email.
+ * @param {string} email The email which the ID is going to be built up of.
+ * @returns {string} The new user ID which the user doc can be stored under.
+ */
+exports.generateUserID = email => {
+ return `${DocumentTypes.USER}${SEPARATOR}${email}`
+}
+
+/**
+ * Gets parameters for retrieving users, this is a utility function for the getDocParams function.
+ */
+exports.getUserParams = (email = "", otherProps = {}) => {
+ return {
+ ...otherProps,
+ startkey: `${DocumentTypes.USER}${SEPARATOR}${email}`,
+ endkey: `${DocumentTypes.USER}${SEPARATOR}${email}${UNICODE_MAX}`,
+ }
+}
diff --git a/packages/auth/src/hashing.js b/packages/auth/src/hashing.js
new file mode 100644
index 000000000..8c81e39d9
--- /dev/null
+++ b/packages/auth/src/hashing.js
@@ -0,0 +1,12 @@
+const bcrypt = require("bcryptjs")
+
+const SALT_ROUNDS = process.env.SALT_ROUNDS || 10
+
+exports.hash = async data => {
+ const salt = await bcrypt.genSalt(SALT_ROUNDS)
+ return bcrypt.hash(data, salt)
+}
+
+exports.compare = async (data, encrypted) => {
+ return bcrypt.compare(data, encrypted)
+}
diff --git a/packages/auth/src/index.js b/packages/auth/src/index.js
new file mode 100644
index 000000000..778d4fb32
--- /dev/null
+++ b/packages/auth/src/index.js
@@ -0,0 +1,31 @@
+const passport = require("koa-passport")
+const LocalStrategy = require("passport-local").Strategy
+const JwtStrategy = require("passport-jwt").Strategy
+// const GoogleStrategy = require("passport-google-oauth").Strategy
+const CouchDB = require("./db")
+const { StaticDatabases } = require("./db/utils")
+const { jwt, local, google } = require("./middleware")
+const hashing = require("./hashing")
+
+// Strategies
+passport.use(new LocalStrategy(local.options, local.authenticate))
+passport.use(new JwtStrategy(jwt.options, jwt.authenticate))
+// passport.use(new GoogleStrategy(google.options, google.authenticate))
+
+passport.serializeUser((user, done) => done(null, user))
+
+passport.deserializeUser(async (user, done) => {
+ const db = new CouchDB(StaticDatabases.USER.name)
+
+ try {
+ const user = await db.get(user._id)
+ return done(null, user)
+ } catch (err) {
+ console.error("User not found", err)
+ return done(null, false, { message: "User not found" })
+ }
+})
+
+// exports.hashing = hashing
+
+module.exports = passport
diff --git a/packages/auth/src/middleware/authenticated.js b/packages/auth/src/middleware/authenticated.js
new file mode 100644
index 000000000..f7ff086b6
--- /dev/null
+++ b/packages/auth/src/middleware/authenticated.js
@@ -0,0 +1,73 @@
+const jwt = require("jsonwebtoken")
+const STATUS_CODES = require("../utilities/statusCodes")
+const { getRole, getBuiltinRoles } = require("../utilities/security/roles")
+const { AuthTypes, Cookies } = require("../constants")
+const {
+ getAppId,
+ getCookieName,
+ clearCookie,
+ setCookie,
+ isClient,
+} = require("../utilities")
+
+module.exports = async (ctx, next) => {
+ // if (ctx.path === "/_builder") {
+ // await next()
+ // return
+ // }
+
+ // do everything we can to make sure the appId is held correctly
+ // we hold it in state as a
+ let appId = getAppId(ctx)
+ const cookieAppId = ctx.cookies.get(Cookies.CurrentApp)
+ // const builtinRoles = getBuiltinRoles()
+ if (appId && cookieAppId !== appId) {
+ setCookie(ctx, appId, "currentapp")
+ } else if (cookieAppId) {
+ appId = cookieAppId
+ }
+ let token, authType
+ // if (!isClient(ctx)) {
+ // token = ctx.cookies.get(getCookieName())
+ // authType = AuthTypes.BUILDER
+ // }
+
+ if (!token && appId) {
+ token = ctx.cookies.get(getCookieName(appId))
+ // authType = AuthTypes.APP
+ }
+
+ // if (!token) {
+ // ctx.auth.authenticated = false
+ // ctx.appId = appId
+ // ctx.user = {
+ // role: builtinRoles.PUBLIC,
+ // }
+ // await next()
+ // return
+ // }
+
+ try {
+ // ctx.auth.authenticated = authType
+ const jwtPayload = jwt.verify(token, ctx.config.jwtSecret)
+ ctx.appId = appId
+ // ctx.auth.apiKey = jwtPayload.apiKey
+ ctx.user = {
+ ...jwtPayload,
+ role: await getRole(appId, jwtPayload.roleId),
+ }
+ // appId no longer carried in user, make sure
+ delete ctx.user.appId
+ } catch (err) {
+ console.log(err)
+ // if (authType === AuthTypes.BUILDER) {
+ // clearCookie(ctx)
+ // ctx.status = 200
+ // return
+ // } else {
+ ctx.throw(err.status || STATUS_CODES.FORBIDDEN, err.text)
+ // }
+ }
+
+ await next()
+}
diff --git a/packages/auth/src/middleware/google.js b/packages/auth/src/middleware/google.js
new file mode 100644
index 000000000..008d4a681
--- /dev/null
+++ b/packages/auth/src/middleware/google.js
@@ -0,0 +1,13 @@
+const CouchDB = require("../db")
+
+exports.options = {
+ clientId: process.env.GOOGLE_CLIENT_ID,
+ clientSecret: process.env.GOOGLE_CLIENT_SECRET,
+ callbackURL: process.env.GOOGLE_AUTH_CALLBACK_URL,
+ // "http://localhost:" + (process.env.PORT || 3000) + "/auth/google/callback",
+}
+
+exports.authenticate = async function(token, tokenSecret, profile, done) {
+ // retrieve user ...
+ // fetchUser().then(user => done(null, user))
+}
diff --git a/packages/auth/src/middleware/index.js b/packages/auth/src/middleware/index.js
new file mode 100644
index 000000000..a9d07516e
--- /dev/null
+++ b/packages/auth/src/middleware/index.js
@@ -0,0 +1,9 @@
+const jwt = require("./jwt")
+const local = require("./local")
+const google = require("./google")
+
+module.exports = {
+ google,
+ jwt,
+ local,
+}
diff --git a/packages/auth/src/middleware/jwt.js b/packages/auth/src/middleware/jwt.js
new file mode 100644
index 000000000..5d36f0b91
--- /dev/null
+++ b/packages/auth/src/middleware/jwt.js
@@ -0,0 +1,19 @@
+// const jwt = require("passport-jwt")
+const { Cookies } = require("../constants")
+
+// const ExtractJWT = jwt.ExtractJwt
+
+exports.options = {
+ jwtFromRequest: function(ctx) {
+ return ctx.cookies.get(Cookies.Auth)
+ },
+ secretOrKey: process.env.JWT_SECRET,
+}
+
+exports.authenticate = async function(jwt, done) {
+ try {
+ return done(null, jwt)
+ } catch (err) {
+ return done(new Error("JWT invalid."), false)
+ }
+}
diff --git a/packages/worker/src/middleware/auth/local.js b/packages/auth/src/middleware/local.js
similarity index 74%
rename from packages/worker/src/middleware/auth/local.js
rename to packages/auth/src/middleware/local.js
index 413ab1c8f..85a68af87 100644
--- a/packages/worker/src/middleware/auth/local.js
+++ b/packages/auth/src/middleware/local.js
@@ -1,9 +1,8 @@
const jwt = require("jsonwebtoken")
-const { UserStatus } = require("../../constants")
-const CouchDB = require("../../db")
-const { StaticDatabases, generateUserID } = require("../../db/utils")
-const { compare } = require("../../utils")
-const env = require("../../environment")
+const { UserStatus } = require("../constants")
+const CouchDB = require("../db")
+const { StaticDatabases, generateUserID } = require("../db/utils")
+const { compare } = require("../hashing")
const INVALID_ERR = "Invalid Credentials"
@@ -26,8 +25,8 @@ exports.authenticate = async function(username, password, done) {
let dbUser
try {
dbUser = await db.get(generateUserID(username))
- } catch {
- console.error("User not found")
+ } catch (err) {
+ console.error("User not found", err)
return done(null, false, { message: "User not found" })
}
@@ -39,18 +38,17 @@ exports.authenticate = async function(username, password, done) {
// authenticate
if (await compare(password, dbUser.password)) {
const payload = {
- userId: dbUser._id,
+ _id: dbUser._id,
}
- const token = jwt.sign(payload, env.JWT_SECRET, {
+ const token = jwt.sign(payload, process.env.JWT_SECRET, {
expiresIn: "1 day",
})
- // TODO: remove and use cookie
dbUser.token = token
- // setCookie(ctx, token, appId)
-
+ // Remove users password in payload
delete dbUser.password
+
return done(null, dbUser)
} else {
done(new Error(INVALID_ERR), false)
diff --git a/packages/auth/yarn.lock b/packages/auth/yarn.lock
new file mode 100644
index 000000000..cde01d210
--- /dev/null
+++ b/packages/auth/yarn.lock
@@ -0,0 +1,950 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+abort-controller@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
+abstract-leveldown@^6.2.1:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a"
+ integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==
+ dependencies:
+ buffer "^5.5.0"
+ immediate "^3.2.3"
+ level-concat-iterator "~2.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+abstract-leveldown@~6.2.1, abstract-leveldown@~6.2.3:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb"
+ integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==
+ dependencies:
+ buffer "^5.5.0"
+ immediate "^3.2.3"
+ level-concat-iterator "~2.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+ajv@^6.12.3:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+argsarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/argsarray/-/argsarray-0.0.1.tgz#6e7207b4ecdb39b0af88303fa5ae22bda8df61cb"
+ integrity sha1-bnIHtOzbObCviDA/pa4ivajfYcs=
+
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+ integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+async@~2.1.4:
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.1.5.tgz#e587c68580994ac67fc56ff86d3ac56bdbe810bc"
+ integrity sha1-5YfGhYCZSsZ/xW/4bTrFa9voELw=
+ dependencies:
+ lodash "^4.14.0"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+base64url@3.x.x:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d"
+ integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+bcryptjs@^2.4.3:
+ version "2.4.3"
+ resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
+ integrity sha1-mrVie5PmBiH/fNrF2pczAn3x0Ms=
+
+buffer-equal-constant-time@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
+ integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
+
+buffer-from@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
+ integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
+
+buffer@^5.5.0, buffer@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
+ integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ dependencies:
+ base64-js "^1.3.1"
+ ieee754 "^1.1.13"
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+clone-buffer@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
+ integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg=
+
+combined-stream@^1.0.6, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+core-util-is@1.0.2, core-util-is@~1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+deferred-leveldown@~5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058"
+ integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==
+ dependencies:
+ abstract-leveldown "~6.2.1"
+ inherits "^2.0.3"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+double-ended-queue@2.1.0-0:
+ version "2.1.0-0"
+ resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
+ integrity sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ecdsa-sig-formatter@1.0.11:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
+ integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+encoding-down@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b"
+ integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==
+ dependencies:
+ abstract-leveldown "^6.2.1"
+ inherits "^2.0.3"
+ level-codec "^9.0.0"
+ level-errors "^2.0.0"
+
+end-stream@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/end-stream/-/end-stream-0.1.0.tgz#32003f3f438a2b0143168137f8fa6e9866c81ed5"
+ integrity sha1-MgA/P0OKKwFDFoE3+PpumGbIHtU=
+ dependencies:
+ write-stream "~0.4.3"
+
+errno@~0.1.1:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
+ integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
+ dependencies:
+ prr "~1.0.1"
+
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+ integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+
+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"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fetch-cookie@0.10.1:
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.10.1.tgz#5ea88f3d36950543c87997c27ae2aeafb4b5c4d4"
+ integrity sha512-beB+VEd4cNeVG1PY+ee74+PkuCQnik78pgLi5Ah/7qdUfov8IctU0vLUbBT8/10Ma5GMBeI4wtxhGrEfKNYs2g==
+ dependencies:
+ tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0"
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+google-auth-library@~0.10.0:
+ version "0.10.0"
+ resolved "https://registry.yarnpkg.com/google-auth-library/-/google-auth-library-0.10.0.tgz#6e15babee85fd1dd14d8d128a295b6838d52136e"
+ integrity sha1-bhW6vuhf0d0U2NEoopW2g41SE24=
+ dependencies:
+ gtoken "^1.2.1"
+ jws "^3.1.4"
+ lodash.noop "^3.0.1"
+ request "^2.74.0"
+
+google-p12-pem@^0.1.0:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/google-p12-pem/-/google-p12-pem-0.1.2.tgz#33c46ab021aa734fa0332b3960a9a3ffcb2f3177"
+ integrity sha1-M8RqsCGqc0+gMys5YKmj/8svMXc=
+ dependencies:
+ node-forge "^0.7.1"
+
+googleapis@^16.0.0:
+ version "16.1.0"
+ resolved "https://registry.yarnpkg.com/googleapis/-/googleapis-16.1.0.tgz#0f19f2d70572d918881a0f626e3b1a2fa8629576"
+ integrity sha1-Dxny1wVy2RiIGg9ibjsaL6hilXY=
+ dependencies:
+ async "~2.1.4"
+ google-auth-library "~0.10.0"
+ string-template "~1.0.0"
+
+gtoken@^1.2.1:
+ version "1.2.3"
+ resolved "https://registry.yarnpkg.com/gtoken/-/gtoken-1.2.3.tgz#5509571b8afd4322e124cf66cf68115284c476d8"
+ integrity sha512-wQAJflfoqSgMWrSBk9Fg86q+sd6s7y6uJhIvvIPz++RElGlMtEqsdAR2oWwZ/WTEtp7P9xFbJRrT976oRgzJ/w==
+ dependencies:
+ google-p12-pem "^0.1.0"
+ jws "^3.0.0"
+ mime "^1.4.1"
+ request "^2.72.0"
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+ieee754@^1.1.13:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
+immediate@3.3.0, immediate@^3.2.3:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266"
+ integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==
+
+inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+isarray@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
+ integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+ integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+jsonwebtoken@^8.2.0, jsonwebtoken@^8.5.1:
+ version "8.5.1"
+ resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
+ integrity sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==
+ dependencies:
+ jws "^3.2.2"
+ lodash.includes "^4.3.0"
+ lodash.isboolean "^3.0.3"
+ lodash.isinteger "^4.0.4"
+ lodash.isnumber "^3.0.3"
+ lodash.isplainobject "^4.0.6"
+ lodash.isstring "^4.0.1"
+ lodash.once "^4.0.0"
+ ms "^2.1.1"
+ semver "^5.6.0"
+
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
+jwa@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.4.1.tgz#743c32985cb9e98655530d53641b66c8645b039a"
+ integrity sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==
+ dependencies:
+ buffer-equal-constant-time "1.0.1"
+ ecdsa-sig-formatter "1.0.11"
+ safe-buffer "^5.0.1"
+
+jws@^3.0.0, jws@^3.1.4, jws@^3.2.2:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/jws/-/jws-3.2.2.tgz#001099f3639468c9414000e99995fa52fb478304"
+ integrity sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==
+ dependencies:
+ jwa "^1.4.1"
+ safe-buffer "^5.0.1"
+
+koa-passport@^4.1.4:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/koa-passport/-/koa-passport-4.1.4.tgz#5f1665c1c2a37ace79af9f970b770885ca30ccfa"
+ integrity sha512-dJBCkl4X+zdYxbI2V2OtoGy0PUenpvp2ZLLWObc8UJhsId0iQpTFT8RVcuA0709AL2txGwRHnSPoT1bYNGa6Kg==
+ dependencies:
+ passport "^0.4.0"
+
+level-codec@9.0.2, level-codec@^9.0.0:
+ version "9.0.2"
+ resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc"
+ integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==
+ dependencies:
+ buffer "^5.6.0"
+
+level-concat-iterator@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263"
+ integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==
+
+level-errors@^2.0.0, level-errors@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8"
+ integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==
+ dependencies:
+ errno "~0.1.1"
+
+level-iterator-stream@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c"
+ integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+ xtend "^4.0.2"
+
+level-js@^5.0.0:
+ version "5.0.2"
+ resolved "https://registry.yarnpkg.com/level-js/-/level-js-5.0.2.tgz#5e280b8f93abd9ef3a305b13faf0b5397c969b55"
+ integrity sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==
+ dependencies:
+ abstract-leveldown "~6.2.3"
+ buffer "^5.5.0"
+ inherits "^2.0.3"
+ ltgt "^2.1.2"
+
+level-packager@^5.1.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939"
+ integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==
+ dependencies:
+ encoding-down "^6.3.0"
+ levelup "^4.3.2"
+
+level-supports@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d"
+ integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==
+ dependencies:
+ xtend "^4.0.2"
+
+level-write-stream@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/level-write-stream/-/level-write-stream-1.0.0.tgz#3f7fbb679a55137c0feb303dee766e12ee13c1dc"
+ integrity sha1-P3+7Z5pVE3wP6zA97nZuEu4Twdw=
+ dependencies:
+ end-stream "~0.1.0"
+
+level@6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/level/-/level-6.0.1.tgz#dc34c5edb81846a6de5079eac15706334b0d7cd6"
+ integrity sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==
+ dependencies:
+ level-js "^5.0.0"
+ level-packager "^5.1.0"
+ leveldown "^5.4.0"
+
+leveldown@5.6.0, leveldown@^5.4.0:
+ version "5.6.0"
+ resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98"
+ integrity sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==
+ dependencies:
+ abstract-leveldown "~6.2.1"
+ napi-macros "~2.0.0"
+ node-gyp-build "~4.1.0"
+
+levelup@4.4.0, levelup@^4.3.2:
+ version "4.4.0"
+ resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6"
+ integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==
+ dependencies:
+ deferred-leveldown "~5.3.0"
+ level-errors "~2.0.0"
+ level-iterator-stream "~4.0.0"
+ level-supports "~1.0.0"
+ xtend "~4.0.0"
+
+lodash.includes@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
+ integrity sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=
+
+lodash.isboolean@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
+ integrity sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=
+
+lodash.isinteger@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
+ integrity sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=
+
+lodash.isnumber@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
+ integrity sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=
+
+lodash.isplainobject@^4.0.6:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
+ integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=
+
+lodash.isstring@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
+ integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=
+
+lodash.noop@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/lodash.noop/-/lodash.noop-3.0.1.tgz#38188f4d650a3a474258439b96ec45b32617133c"
+ integrity sha1-OBiPTWUKOkdCWEObluxFsyYXEzw=
+
+lodash.once@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
+ integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
+
+lodash@^4.14.0:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+ltgt@2.2.1, ltgt@^2.1.2:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
+ integrity sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=
+
+mime-db@1.47.0:
+ version "1.47.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
+ integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==
+
+mime-types@^2.1.12, mime-types@~2.1.19:
+ version "2.1.30"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d"
+ integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==
+ dependencies:
+ mime-db "1.47.0"
+
+mime@^1.4.1:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+napi-macros@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b"
+ integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==
+
+node-fetch@2.6.0:
+ version "2.6.0"
+ resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
+ integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==
+
+node-forge@^0.7.1:
+ version "0.7.6"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.6.tgz#fdf3b418aee1f94f0ef642cd63486c77ca9724ac"
+ integrity sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==
+
+node-gyp-build@~4.1.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb"
+ integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+oauth@0.9.x:
+ version "0.9.15"
+ resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1"
+ integrity sha1-vR/vr2hslrdUda7VGWQS/2DPucE=
+
+passport-google-auth@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/passport-google-auth/-/passport-google-auth-1.0.2.tgz#8b300b5aa442ef433de1d832ed3112877d0b2938"
+ integrity sha1-izALWqRC70M94dgy7TESh30LKTg=
+ dependencies:
+ googleapis "^16.0.0"
+ passport-strategy "1.x"
+
+passport-google-oauth1@1.x.x:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/passport-google-oauth1/-/passport-google-oauth1-1.0.0.tgz#af74a803df51ec646f66a44d82282be6f108e0cc"
+ integrity sha1-r3SoA99R7GRvZqRNgigr5vEI4Mw=
+ dependencies:
+ passport-oauth1 "1.x.x"
+
+passport-google-oauth20@2.x.x:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz#0d241b2d21ebd3dc7f2b60669ec4d587e3a674ef"
+ integrity sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==
+ dependencies:
+ passport-oauth2 "1.x.x"
+
+passport-google-oauth@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/passport-google-oauth/-/passport-google-oauth-2.0.0.tgz#f6eb4bc96dd6c16ec0ecfdf4e05ec48ca54d4dae"
+ integrity sha512-JKxZpBx6wBQXX1/a1s7VmdBgwOugohH+IxCy84aPTZNq/iIPX6u7Mqov1zY7MKRz3niFPol0KJz8zPLBoHKtYA==
+ dependencies:
+ passport-google-oauth1 "1.x.x"
+ passport-google-oauth20 "2.x.x"
+
+passport-jwt@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/passport-jwt/-/passport-jwt-4.0.0.tgz#7f0be7ba942e28b9f5d22c2ebbb8ce96ef7cf065"
+ integrity sha512-BwC0n2GP/1hMVjR4QpnvqA61TxenUMlmfNjYNgK0ZAs0HK4SOQkHcSv4L328blNTLtHq7DbmvyNJiH+bn6C5Mg==
+ dependencies:
+ jsonwebtoken "^8.2.0"
+ passport-strategy "^1.0.0"
+
+passport-local@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/passport-local/-/passport-local-1.0.0.tgz#1fe63268c92e75606626437e3b906662c15ba6ee"
+ integrity sha1-H+YyaMkudWBmJkN+O5BmYsFbpu4=
+ dependencies:
+ passport-strategy "1.x.x"
+
+passport-oauth1@1.x.x:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/passport-oauth1/-/passport-oauth1-1.1.0.tgz#a7de988a211f9cf4687377130ea74df32730c918"
+ integrity sha1-p96YiiEfnPRoc3cTDqdN8ycwyRg=
+ dependencies:
+ oauth "0.9.x"
+ passport-strategy "1.x.x"
+ utils-merge "1.x.x"
+
+passport-oauth2@1.x.x:
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.5.0.tgz#64babbb54ac46a4dcab35e7f266ed5294e3c4108"
+ integrity sha512-kqBt6vR/5VlCK8iCx1/KpY42kQ+NEHZwsSyt4Y6STiNjU+wWICG1i8ucc1FapXDGO15C5O5VZz7+7vRzrDPXXQ==
+ dependencies:
+ base64url "3.x.x"
+ oauth "0.9.x"
+ passport-strategy "1.x.x"
+ uid2 "0.0.x"
+ utils-merge "1.x.x"
+
+passport-strategy@1.x, passport-strategy@1.x.x, passport-strategy@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/passport-strategy/-/passport-strategy-1.0.0.tgz#b5539aa8fc225a3d1ad179476ddf236b440f52e4"
+ integrity sha1-tVOaqPwiWj0a0XlHbd8ja0QPUuQ=
+
+passport@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/passport/-/passport-0.4.1.tgz#941446a21cb92fc688d97a0861c38ce9f738f270"
+ integrity sha512-IxXgZZs8d7uFSt3eqNjM9NQ3g3uQCW5avD8mRNoXV99Yig50vjuaez6dQK2qC0kVWPRTujxY0dWgGfT09adjYg==
+ dependencies:
+ passport-strategy "1.x.x"
+ pause "0.0.1"
+
+pause@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d"
+ integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+pouchdb@^7.2.2:
+ version "7.2.2"
+ resolved "https://registry.yarnpkg.com/pouchdb/-/pouchdb-7.2.2.tgz#fcae82862db527e4cf7576ed8549d1384961f364"
+ integrity sha512-5gf5nw5XH/2H/DJj8b0YkvG9fhA/4Jt6kL0Y8QjtztVjb1y4J19Rg4rG+fUbXu96gsUrlyIvZ3XfM0b4mogGmw==
+ dependencies:
+ abort-controller "3.0.0"
+ argsarray "0.0.1"
+ buffer-from "1.1.1"
+ clone-buffer "1.0.0"
+ double-ended-queue "2.1.0-0"
+ fetch-cookie "0.10.1"
+ immediate "3.3.0"
+ inherits "2.0.4"
+ level "6.0.1"
+ level-codec "9.0.2"
+ level-write-stream "1.0.0"
+ leveldown "5.6.0"
+ levelup "4.4.0"
+ ltgt "2.2.1"
+ node-fetch "2.6.0"
+ readable-stream "1.1.14"
+ spark-md5 "3.0.1"
+ through2 "3.0.2"
+ uuid "8.1.0"
+ vuvuzela "1.0.3"
+
+prr@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
+ integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
+
+psl@^1.1.28, psl@^1.1.33:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+readable-stream@1.1.14:
+ version "1.1.14"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
+ integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk=
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.1"
+ isarray "0.0.1"
+ string_decoder "~0.10.x"
+
+"readable-stream@2 || 3", readable-stream@^3.4.0:
+ version "3.6.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readable-stream@~0.0.2:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-0.0.4.tgz#f32d76e3fb863344a548d79923007173665b3b8d"
+ integrity sha1-8y124/uGM0SlSNeZIwBxc2ZbO40=
+
+request@^2.72.0, request@^2.74.0:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.8.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
+ forever-agent "~0.6.1"
+ form-data "~2.3.2"
+ har-validator "~5.1.3"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+semver@^5.6.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+spark-md5@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.1.tgz#83a0e255734f2ab4e5c466e5a2cfc9ba2aa2124d"
+ integrity sha512-0tF3AGSD1ppQeuffsLDIOWlKUd3lS92tFxcsrh5Pe3ZphhnoK+oXIBTzOAThZCiuINZLvpiLH/1VS1/ANEJVig==
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ bcrypt-pbkdf "^1.0.0"
+ dashdash "^1.12.0"
+ ecc-jsbn "~0.1.1"
+ getpass "^0.1.1"
+ jsbn "~0.1.0"
+ safer-buffer "^2.0.2"
+ tweetnacl "~0.14.0"
+
+string-template@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/string-template/-/string-template-1.0.0.tgz#9e9f2233dc00f218718ec379a28a5673ecca8b96"
+ integrity sha1-np8iM9wA8hhxjsN5oopWc+zKi5Y=
+
+string_decoder@^1.1.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
+ integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
+ dependencies:
+ safe-buffer "~5.2.0"
+
+string_decoder@~0.10.x:
+ version "0.10.31"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
+ integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+
+through2@3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4"
+ integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==
+ dependencies:
+ inherits "^2.0.4"
+ readable-stream "2 || 3"
+
+"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
+ integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
+ dependencies:
+ psl "^1.1.33"
+ punycode "^2.1.1"
+ universalify "^0.1.2"
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+uid2@0.0.x:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82"
+ integrity sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=
+
+universalify@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66"
+ integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+util-deprecate@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
+ integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
+
+utils-merge@1.x.x:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+
+uuid@8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.1.0.tgz#6f1536eb43249f473abc6bd58ff983da1ca30d8d"
+ integrity sha512-CI18flHDznR0lq54xBycOVmphdCYnQLKn8abKn7PXUiKUGdEd+/l9LWNJmugXel4hXq7S+RMNl34ecyC9TntWg==
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+vuvuzela@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/vuvuzela/-/vuvuzela-1.0.3.tgz#3be145e58271c73ca55279dd851f12a682114b0b"
+ integrity sha1-O+FF5YJxxzylUnndhR8SpoIRSws=
+
+write-stream@~0.4.3:
+ version "0.4.3"
+ resolved "https://registry.yarnpkg.com/write-stream/-/write-stream-0.4.3.tgz#83cc8c0347d0af6057a93862b4e3ae01de5c81c1"
+ integrity sha1-g8yMA0fQr2BXqThitOOuAd5cgcE=
+ dependencies:
+ readable-stream "~0.0.2"
+
+xtend@^4.0.2, xtend@~4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
+ integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
diff --git a/packages/server/package.json b/packages/server/package.json
index 36cd21542..cdaa94b7c 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -43,7 +43,6 @@
"electron": "electron src/electron.js",
"build:electron": "electron-builder --dir",
"publish:electron": "electron-builder -mwl --publish always",
- "postinstall": "electron-builder install-app-deps",
"lint": "eslint --fix src/",
"initialise": "node scripts/initialise.js"
},
diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock
index 599b64ca6..919dccf1a 100644
--- a/packages/server/yarn.lock
+++ b/packages/server/yarn.lock
@@ -7,11 +7,6 @@
resolved "https://registry.yarnpkg.com/7zip-bin/-/7zip-bin-5.0.3.tgz#bc5b5532ecafd923a61f2fb097e3b108c0106a3f"
integrity sha512-GLyWIFBbGvpKPGo55JyRZAo4lVbnBiD52cKlw/0Vt+wnmKvWJkpZvsjVoaIolyBXDeAQKSicRtqFNPem9w0WYA==
-"@adobe/spectrum-css-workflow-icons@^1.1.0":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@adobe/spectrum-css-workflow-icons/-/spectrum-css-workflow-icons-1.2.0.tgz#cda8bbe873ba9317160458858ae979e5393e5550"
- integrity sha512-STSQQHvoBM0kf1JrNL3KEt88RklIctaGyGOzwUTnhtTkT1jHLaF4FgxrPDCvr1AT8VOq1nGplKUCeyZ9vdUUmA==
-
"@azure/ms-rest-azure-env@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@azure/ms-rest-azure-env/-/ms-rest-azure-env-1.1.2.tgz#8505873afd4a1227ec040894a64fdd736b4a101f"
@@ -254,110 +249,6 @@
lodash "^4.17.19"
to-fast-properties "^2.0.0"
-"@budibase/bbui@^1.58.13":
- version "1.58.13"
- resolved "https://registry.yarnpkg.com/@budibase/bbui/-/bbui-1.58.13.tgz#59df9c73def2d81c75dcbd2266c52c19db88dbd7"
- integrity sha512-Zk6CKXdBfKsTVzA1Xs5++shdSSZLfphVpZuKVbjfzkgtuhyH7ruucexuSHEpFsxjW5rEKgKIBoRFzCK5vPvN0w==
- dependencies:
- markdown-it "^12.0.2"
- quill "^1.3.7"
- sirv-cli "^0.4.6"
- svelte-flatpickr "^2.4.0"
- svelte-portal "^1.0.0"
- turndown "^7.0.0"
-
-"@budibase/client@^0.8.9":
- version "0.8.10"
- resolved "https://registry.yarnpkg.com/@budibase/client/-/client-0.8.10.tgz#18cd929dddfd2fa65c15e23871a26bccaa03049f"
- integrity sha512-C/25rBAspQDk7Lp8w9icEcytgMAm8+7l+A4Lp7egpDJvrH+5jq2kVNuRRi3emAddCSTBmM0amIoS+PHUGvAa9Q==
- dependencies:
- "@budibase/string-templates" "^0.8.10"
- regexparam "^1.3.0"
- shortid "^2.2.15"
- svelte-spa-router "^3.0.5"
-
-"@budibase/handlebars-helpers@^0.11.3":
- version "0.11.3"
- resolved "https://registry.yarnpkg.com/@budibase/handlebars-helpers/-/handlebars-helpers-0.11.3.tgz#b6e5c91b83e8906e7d7ff10ddde277a3d561016e"
- integrity sha512-MS1ptZEYq8o9J3tNLM7cZ2RGSSJIer4GiMIUHtbBI3sC9UKqZebao1JYNfmZKpNjntuqhZKgjqc5GfnVIEjsYQ==
- dependencies:
- arr-flatten "^1.1.0"
- array-sort "^0.1.4"
- define-property "^1.0.0"
- extend-shallow "^3.0.2"
- "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-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"
- 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"
-
-"@budibase/standard-components@^0.8.9":
- version "0.8.10"
- resolved "https://registry.yarnpkg.com/@budibase/standard-components/-/standard-components-0.8.10.tgz#ffde4e3bfe5afe14c242d7066328066500333b62"
- integrity sha512-zXE9SbMFxrZ8tpYmTaBQEPwT+3xJ8p4QtDkSRfnEcxbWojNghh5ikn0897FpgnP7q9x+63tDQ0UCiUcNoiOk7w==
- dependencies:
- "@adobe/spectrum-css-workflow-icons" "^1.1.0"
- "@budibase/bbui" "^1.58.13"
- "@budibase/svelte-ag-grid" "^1.0.4"
- "@spectrum-css/actionbutton" "^1.0.0-beta.1"
- "@spectrum-css/button" "^3.0.0-beta.6"
- "@spectrum-css/checkbox" "^3.0.0-beta.6"
- "@spectrum-css/fieldlabel" "^3.0.0-beta.7"
- "@spectrum-css/icon" "^3.0.0-beta.2"
- "@spectrum-css/inputgroup" "^3.0.0-beta.7"
- "@spectrum-css/menu" "^3.0.0-beta.5"
- "@spectrum-css/page" "^3.0.0-beta.0"
- "@spectrum-css/picker" "^1.0.0-beta.3"
- "@spectrum-css/popover" "^3.0.0-beta.6"
- "@spectrum-css/stepper" "^3.0.0-beta.7"
- "@spectrum-css/textfield" "^3.0.0-beta.6"
- "@spectrum-css/vars" "^3.0.0-beta.2"
- apexcharts "^3.22.1"
- flatpickr "^4.6.6"
- loadicons "^1.0.0"
- lodash.debounce "^4.0.8"
- markdown-it "^12.0.2"
- quill "^1.3.7"
- remixicon "^2.5.0"
- svelte-apexcharts "^1.0.2"
- svelte-flatpickr "^3.1.0"
- turndown "^7.0.0"
-
-"@budibase/string-templates@^0.8.10", "@budibase/string-templates@^0.8.9":
- version "0.8.10"
- resolved "https://registry.yarnpkg.com/@budibase/string-templates/-/string-templates-0.8.10.tgz#57b1cfb44d4bdac0ab3ef9a4912a6185e972711b"
- integrity sha512-YUtbbAvLcxpeEiCs36cF5bkEDgpLaklvpuG/pcUIOxAPr1feqcN1KyFbuoSPihZOWXjXLgsujQerQ5xn8MUrhg==
- dependencies:
- "@budibase/handlebars-helpers" "^0.11.3"
- dayjs "^1.10.4"
- handlebars "^4.7.6"
- handlebars-utils "^1.0.6"
- lodash "^4.17.20"
-
-"@budibase/svelte-ag-grid@^1.0.4":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@budibase/svelte-ag-grid/-/svelte-ag-grid-1.0.4.tgz#41cceec4bde2c4aea8b9da8f610fe36055c7709f"
- integrity sha512-JZm6qujxnZpqw7Twbegr6se4sHhyWzN0Cibrk5bVBH32hBgzD6dd33fxwrjHKkWFxjys9wRT+cqYgYVlSt9E3w==
- dependencies:
- ag-grid-community "^24.0.0"
-
"@cnakazawa/watch@^1.0.3":
version "1.0.4"
resolved "https://registry.yarnpkg.com/@cnakazawa/watch/-/watch-1.0.4.tgz#f864ae85004d0fcab6f50be9141c4da368d1656a"
@@ -885,11 +776,6 @@
path-to-regexp "^1.1.1"
urijs "^1.19.0"
-"@polka/url@^0.5.0":
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/@polka/url/-/url-0.5.0.tgz#b21510597fd601e5d7c95008b76bf0d254ebfd31"
- integrity sha512-oZLYFEAzUKyi3SKnXvj32ZCEGH6RDnao7COuCVhDydMS9NrCSVXhM79VaKyP5+Zc33m0QXEd2DN3UkU7OsHcfw==
-
"@sendgrid/client@^7.1.1":
version "7.4.2"
resolved "https://registry.yarnpkg.com/@sendgrid/client/-/client-7.4.2.tgz#204a9fbb5dc05a721a5d8cd8930f57f9f8e612b1"
@@ -1002,73 +888,6 @@
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd"
integrity sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==
-"@spectrum-css/actionbutton@^1.0.0-beta.1":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@spectrum-css/actionbutton/-/actionbutton-1.0.1.tgz#9c75da37ea6915919fb574c74bd60dacc03b6577"
- integrity sha512-AUqtyNabHF451Aj9i3xz82TxS5Z6k1dttA68/1hMeU9kbPCSS4P6Viw3vaRGs9CSspuR8xnnhDgrq+F+zMy2Hw==
-
-"@spectrum-css/button@^3.0.0-beta.6":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@spectrum-css/button/-/button-3.0.1.tgz#6db8c3e851baecd0f1c2d88fef37d49d01c6e643"
- integrity sha512-YXrBtjIYisk4Vaxnp0RiE4gdElQX04P2mc4Pi2GlQ27dJKlHmufYcF+kAqGdtiyK5yjdN/vKRcC8y13aA4rusA==
-
-"@spectrum-css/checkbox@^3.0.0-beta.6":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@spectrum-css/checkbox/-/checkbox-3.0.1.tgz#6f36377d8bd556989ddd1dec2506dc295c5fcda8"
- integrity sha512-fI0q2Cp6yU4ORyE6JWUSMYNgEtGf6AjYViZ2Weg3UPTYBQuWdQd8J0ZTcH38pDMyARFPRdiXgQ3KnyX5Hk5huw==
-
-"@spectrum-css/fieldlabel@^3.0.0-beta.7":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@spectrum-css/fieldlabel/-/fieldlabel-3.0.1.tgz#39f7c0f25cc2ff402afeff005341b0832f7c588c"
- integrity sha512-LMfwrwIq8wEEvxFLobdLvXRwKrp8o9Fty4iJ9aYl2Rj1uXkfRd8qLz9HGZjLEE1OuJgoTBgamYABl7EvoA5PLw==
-
-"@spectrum-css/icon@^3.0.0-beta.2":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@spectrum-css/icon/-/icon-3.0.1.tgz#e300a6fc353c85c6b5d6e7a364408a940c31b177"
- integrity sha512-cGFtIrcQ/7tthdkHK1npuEFiCdYVHLqwmLxghUYQw8Tb8KgJaw3OBO1tpjgsUizexNgu26BjVRIbGxNWuBXIHQ==
-
-"@spectrum-css/inputgroup@^3.0.0-beta.7":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@spectrum-css/inputgroup/-/inputgroup-3.0.1.tgz#8c5b257b57b3b2cf04e99355709365fa0d6838cc"
- integrity sha512-asBRa1jTlld6plkcq4ySO+xl+OJlCMSOLoAFdSSIJowcSlCV0yDy7oeOhf5YQv9mMHFWTKlWUSoAKDZTguIPxA==
-
-"@spectrum-css/menu@^3.0.0-beta.5":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@spectrum-css/menu/-/menu-3.0.1.tgz#2a376f991acc24e12ec892bb6b9db2650fc41fbe"
- integrity sha512-Qjg0+1O0eC89sb/bRFq2AGnQ8XqhVy23TUXHyffNM8qdcMssnlny3QmhzjURCZKvx/Y5UytCpzhedPQqSpQwZg==
-
-"@spectrum-css/page@^3.0.0-beta.0":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@spectrum-css/page/-/page-3.0.1.tgz#5e1c3dd5b1a1ee591f9d636b75f03665f542d846"
- integrity sha512-LAlKF8km5BlsGPpZ2SNtwKOQIHn1lz0X93aczGZVZceOg73O4gyeoT5cx4vi1z+KtBRY5VMDWx3XgGtUwwjqwA==
- dependencies:
- "@spectrum-css/vars" "^3.0.1"
-
-"@spectrum-css/picker@^1.0.0-beta.3":
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/@spectrum-css/picker/-/picker-1.0.1.tgz#98991198576d26bd14160824e7b6f3c278ff930b"
- integrity sha512-Rv4/UBOdNW1gs7WVBCJnPD5VFly8MqP++psDX6kcugUIcfJy0GC3acvElotmKRlCDk8Qxks2W2A0jKeSgphTmA==
-
-"@spectrum-css/popover@^3.0.0-beta.6":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@spectrum-css/popover/-/popover-3.0.1.tgz#5863c1efc53f98f9aba2de9186666780041303fc"
- integrity sha512-LmOSj/yCwQQ9iGmCYnHiJsJR/HfPiGqI1Jl7pkKxBOCxYBMS/5+ans9vfCN2Qnd0eK7WSbfPg72S6mjye7db2Q==
-
-"@spectrum-css/stepper@^3.0.0-beta.7":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@spectrum-css/stepper/-/stepper-3.0.1.tgz#7f270f53505e7dbe082591e8ea1c4c8f397e045a"
- integrity sha512-IvZlGFJ8QPr9tUz5xvVN4hASaTRDPdKu9IIp25q/x0ecgSrKAM55e3EBWEYWy1H1JI3h+zlPnNRuK0VLhDbCYA==
-
-"@spectrum-css/textfield@^3.0.0-beta.6":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@spectrum-css/textfield/-/textfield-3.0.1.tgz#e875b8e37817378ad08fc4af7d53026df38911e5"
- integrity sha512-MUV5q87CVxbkNdSNoxGrFbgyKc51ft/WWf3aVEoPdPw5yBnXqFe1w1YmAit5zYDOOhhs58sCLAlUcCMlOpkgrA==
-
-"@spectrum-css/vars@^3.0.0-beta.2", "@spectrum-css/vars@^3.0.1":
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/@spectrum-css/vars/-/vars-3.0.1.tgz#561fd69098f896a647242dd8d6108af603bfa31e"
- integrity sha512-l4oRcCOqInChYXZN6OQhpe3isk6l4OE6Ys8cgdlsiKp53suNoQxyyd9p/eGRbCjZgH3xQ8nK0t4DHa7QYC0S6w==
-
"@szmarczak/http-timer@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
@@ -1353,11 +1172,6 @@ adal-node@^0.1.28:
xmldom ">= 0.1.x"
xpath.js "~1.1.0"
-ag-grid-community@^24.0.0:
- version "24.1.0"
- resolved "https://registry.yarnpkg.com/ag-grid-community/-/ag-grid-community-24.1.0.tgz#1e3cab51211822e08d56f03a491b7c0deaa398e6"
- integrity sha512-pWnWphuDcejZ8ahf6C734EpCx3XQ6dHEZWMWTlCdHNT0mZBLJ4YKCGACX+ttAEtSX2MGM3G13JncvuratUlYag==
-
agent-base@6:
version "6.0.1"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.1.tgz#808007e4e5867decb0ab6ab2f928fbdb5a596db4"
@@ -1403,130 +1217,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"
@@ -1539,62 +1229,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"
@@ -1615,20 +1249,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"
@@ -1643,32 +1263,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"
@@ -1695,18 +1289,6 @@ anymatch@~3.1.1:
normalize-path "^3.0.0"
picomatch "^2.0.4"
-apexcharts@^3.19.2, apexcharts@^3.22.1:
- version "3.26.0"
- resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-3.26.0.tgz#a78abc108b2e1b3086a738f0ec7c98e292f4a14b"
- integrity sha512-zdYHs3k3tgmCn1BpYLj7rhGEndBYF33Pq1+g0ora37xAr+3act5CJrpdXM2jx2boVUyXgavoSp6sa8WpK7RkSA==
- dependencies:
- svg.draggable.js "^2.2.2"
- svg.easing.js "^2.0.0"
- svg.filter.js "^2.0.2"
- svg.pathmorphing.js "^0.1.3"
- svg.resize.js "^1.4.3"
- svg.select.js "^3.0.1"
-
app-builder-bin@3.5.10:
version "3.5.10"
resolved "https://registry.yarnpkg.com/app-builder-bin/-/app-builder-bin-3.5.10.tgz#4a7f9999fccc0c435b6284ae1366bc76a17c4a7d"
@@ -1758,18 +1340,13 @@ 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==
dependencies:
sprintf-js "~1.0.2"
-argparse@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38"
- integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==
-
args@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/args/-/args-5.0.1.tgz#4bf298df90a4799a09521362c579278cc2fdd761"
@@ -1805,15 +1382,6 @@ array-equal@^1.0.0:
resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93"
integrity sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=
-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"
@@ -1891,13 +1459,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"
-
aws-sdk@^2.767.0:
version "2.771.0"
resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.771.0.tgz#ff4beb0a04d6ab1ae962c85dfb42e3e9bfe2b93b"
@@ -2493,11 +2054,6 @@ clone-response@1.0.2, clone-response@^1.0.2:
dependencies:
mimic-response "^1.0.0"
-clone@^2.1.1:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f"
- integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=
-
co-body@^5.1.1:
version "5.2.0"
resolved "https://registry.yarnpkg.com/co-body/-/co-body-5.2.0.tgz#5a0a658c46029131e0e3a306f67647302f71c124"
@@ -2562,11 +2118,6 @@ commander@^2.5.0, commander@^2.8.1:
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
-commander@^4.0.0:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068"
- integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==
-
commoner@^0.10.1:
version "0.10.8"
resolved "https://registry.yarnpkg.com/commoner/-/commoner-0.10.8.tgz#34fc3672cd24393e8bb47e70caa0293811f4f2c5"
@@ -2609,13 +2160,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"
@@ -2636,11 +2180,6 @@ configstore@^5.0.1:
write-file-atomic "^3.0.0"
xdg-basedir "^4.0.0"
-console-clear@^1.1.0:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/console-clear/-/console-clear-1.1.1.tgz#995e20cbfbf14dd792b672cde387bd128d674bf7"
- integrity sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==
-
content-disposition@^0.5.2, content-disposition@~0.5.2:
version "0.5.3"
resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd"
@@ -2719,15 +2258,6 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5:
shebang-command "^1.2.0"
which "^1.2.9"
-cross-spawn@^7.0.0:
- version "7.0.3"
- resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
- integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
- dependencies:
- path-key "^3.1.0"
- shebang-command "^2.0.0"
- which "^2.0.1"
-
crypto-random-string@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
@@ -2775,23 +2305,11 @@ 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"
integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
-dayjs@^1.10.4:
- version "1.10.4"
- resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.4.tgz#8e544a9b8683f61783f570980a8a80eaf54ab1e2"
- integrity sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==
-
debug@4, debug@^4.0.1:
version "4.2.0"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.2.0.tgz#7f150f93920e94c58f5574c2fd01a3110effe7f1"
@@ -2897,18 +2415,6 @@ decompress@^4.2.1:
pify "^2.3.0"
strip-dirs "^2.0.0"
-deep-equal@^1.0.1:
- version "1.1.1"
- resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz#b5c98c942ceffaf7cb051e24e1434a25a2e6076a"
- integrity sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==
- dependencies:
- is-arguments "^1.0.4"
- is-date-object "^1.0.1"
- is-regex "^1.0.4"
- object-is "^1.0.1"
- object-keys "^1.1.1"
- regexp.prototype.flags "^1.2.0"
-
deep-equal@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5"
@@ -2929,13 +2435,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"
@@ -3085,11 +2584,6 @@ domexception@^1.0.1:
dependencies:
webidl-conversions "^4.0.2"
-domino@^2.1.6:
- version "2.1.6"
- resolved "https://registry.yarnpkg.com/domino/-/domino-2.1.6.tgz#fe4ace4310526e5e7b9d12c7de01b7f485a57ffe"
- integrity sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==
-
dot-prop@^5.2.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
@@ -3306,24 +2800,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=
-
-entities@~2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5"
- integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==
-
-env-cmd@^10.1.0:
- version "10.1.0"
- resolved "https://registry.yarnpkg.com/env-cmd/-/env-cmd-10.1.0.tgz#c7f5d3b550c9519f137fdac4dd8fb6866a8c8c4b"
- integrity sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==
- dependencies:
- commander "^4.0.0"
- cross-spawn "^7.0.0"
-
env-paths@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.0.tgz#cdca557dc009152917d6166e2febe1f039685e43"
@@ -3348,11 +2824,6 @@ error-inject@^1.0.0:
resolved "https://registry.yarnpkg.com/error-inject/-/error-inject-1.0.0.tgz#e2b3d91b54aed672f309d950d154850fa11d4f37"
integrity sha1-4rPZG1Su1nLzCdlQ0VSFD6EdTzc=
-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.18.0-next.2:
version "1.18.0-next.3"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.3.tgz#56bc8b5cc36b2cca25a13be07f3c02c2343db6b7"
@@ -3595,11 +3066,6 @@ event-target-shim@^5.0.0:
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
-eventemitter3@^2.0.3:
- version "2.0.3"
- resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-2.0.3.tgz#b5e1079b59fb5e1ba2771c0a993be060a58c99ba"
- integrity sha1-teEHm1n7XhuidxwKmTvgYKWMmbo=
-
events@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
@@ -3701,7 +3167,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
assign-symbols "^1.0.0"
is-extendable "^1.0.1"
-extend@^3.0.0, extend@^3.0.2, extend@~3.0.2:
+extend@^3.0.0, extend@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
@@ -3759,23 +3225,11 @@ 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"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
-fast-diff@1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154"
- integrity sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==
-
fast-json-stable-stringify@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
@@ -3955,11 +3409,6 @@ flat-cache@^2.0.1:
rimraf "2.6.3"
write "1.0.3"
-flatpickr@^4.5.2, flatpickr@^4.6.6:
- version "4.6.9"
- resolved "https://registry.yarnpkg.com/flatpickr/-/flatpickr-4.6.9.tgz#9a13383e8a6814bda5d232eae3fcdccb97dc1499"
- integrity sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==
-
flatstr@^1.0.12:
version "1.0.12"
resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931"
@@ -3989,18 +3438,11 @@ for-each@^0.3.3:
dependencies:
is-callable "^1.1.3"
-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"
@@ -4059,11 +3501,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, fs-extra@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
@@ -4140,19 +3577,6 @@ get-intrinsic@^1.0.2, get-intrinsic@^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-port@^3.2.0:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc"
- integrity sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=
-
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"
@@ -4350,35 +3774,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-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.7"
- resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1"
- integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==
- 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"
@@ -4467,39 +3862,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"
@@ -4529,14 +3891,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"
@@ -4694,11 +4048,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"
@@ -4775,13 +4124,6 @@ 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"
@@ -4877,13 +4219,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"
@@ -4961,13 +4296,6 @@ is-number-object@^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"
@@ -4975,11 +4303,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"
@@ -4995,13 +4318,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"
@@ -5019,7 +4335,7 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
-is-regex@^1.0.4, is-regex@^1.1.2:
+is-regex@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251"
integrity sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==
@@ -5032,13 +4348,6 @@ 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-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
@@ -5117,11 +4426,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"
@@ -5798,7 +5102,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=
@@ -5812,7 +5116,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==
@@ -5822,7 +5126,7 @@ kind-of@^6.0.0, kind-of@^6.0.2:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
-kleur@^3.0.0, kleur@^3.0.3:
+kleur@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
@@ -5953,13 +5257,6 @@ latest-version@^5.0.0:
dependencies:
package-json "^6.3.0"
-lazy-cache@^2.0.1:
- 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"
@@ -6131,13 +5428,6 @@ lines-and-columns@^1.1.6:
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
-linkify-it@^3.0.1:
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.2.tgz#f55eeb8bc1d3ae754049e124ab3bb56d97797fb8"
- integrity sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==
- dependencies:
- uc.micro "^1.0.1"
-
load-bmfont@^1.3.1, load-bmfont@^1.4.0:
version "1.4.1"
resolved "https://registry.yarnpkg.com/load-bmfont/-/load-bmfont-1.4.1.tgz#c0f5f4711a1e2ccff725a7b6078087ccfcddd3e9"
@@ -6162,16 +5452,6 @@ load-json-file@^4.0.0:
pify "^3.0.0"
strip-bom "^3.0.0"
-loadicons@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/loadicons/-/loadicons-1.0.0.tgz#79fd9b08ef2933988c94068cbd246ef3f21cbd04"
- integrity sha512-KSywiudfuOK5sTdhNMM8hwRpMxZ5TbQlU4ZijMxUFwRW7jpxUmb9YJoLIzDn7+xuxeLzCZWBmLJS2JDjDWCpsw==
-
-local-access@^1.0.1:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/local-access/-/local-access-1.1.0.tgz#e007c76ba2ca83d5877ba1a125fc8dfe23ba4798"
- integrity sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==
-
locate-path@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e"
@@ -6187,11 +5467,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"
@@ -6262,21 +5537,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"
@@ -6297,40 +5557,11 @@ lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.3:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
-lodash@^4.17.19, lodash@^4.17.20:
+lodash@^4.17.19:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
-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"
@@ -6426,17 +5657,6 @@ map-visit@^1.0.0:
dependencies:
object-visit "^1.0.0"
-markdown-it@^12.0.2:
- version "12.0.4"
- resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.0.4.tgz#eec8247d296327eac3ba9746bdeec9cfcc751e33"
- integrity sha512-34RwOXZT8kyuOJy25oJNJoulO8L0bTHYWXcdZBYZqFnjIy3NgjeoM3FmPXIOFQ26/lSHYMr8oc62B6adxXcb3Q==
- dependencies:
- argparse "^2.0.1"
- entities "~2.1.0"
- linkify-it "^3.0.1"
- mdurl "^1.0.1"
- uc.micro "^1.0.5"
-
matcher@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca"
@@ -6444,11 +5664,6 @@ matcher@^3.0.0:
dependencies:
escape-string-regexp "^4.0.0"
-mdurl@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
- integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=
-
media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@@ -6558,11 +5773,6 @@ mime@^1.3.4, mime@^1.4.1:
resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
-mime@^2.3.1:
- version "2.5.2"
- resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
- integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==
-
mime@^2.4.6:
version "2.4.6"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz#e5b407c90db442f2beb5b162373d07b69affa4d1"
@@ -6617,11 +5827,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"
@@ -6640,11 +5845,6 @@ mri@1.1.4:
resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a"
integrity sha512-6y7IjGPm8AzlvoUrwAaw1tLnUBudaS3752vcd8JtrpGGQn+rXIe63LFVHm/YMwtqAuh+LJPCFdlLYPWM1nYn6w==
-mri@^1.1.0:
- version "1.1.6"
- resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.6.tgz#49952e1044db21dbf90f6cd92bc9c9a777d415a6"
- integrity sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==
-
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -6706,11 +5906,6 @@ nan@^2.12.1:
resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19"
integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==
-nanoid@^2.1.0:
- version "2.1.11"
- resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.1.11.tgz#ec24b8a758d591561531b4176a01e3ab4f0f0280"
- integrity sha512-s/snB+WGm6uwi0WjsZdaVcuf3KJXlfGl2LcxgwkEwJF0D/BWzVWAZW/XY4bFaiR7s0Jk3FPvlnepg1H1b1UwlA==
-
nanomatch@^1.2.9:
version "1.2.13"
resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
@@ -6758,11 +5953,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"
@@ -6927,14 +6117,6 @@ object-inspect@^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.0.1:
- version "1.1.5"
- resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.5.tgz#b9deeaa5fc7f1846a0faecdceec138e5778f53ac"
- integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==
- dependencies:
- call-bind "^1.0.2"
- 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"
@@ -7145,11 +6327,6 @@ pako@^1.0.5:
resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
-parchment@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/parchment/-/parchment-1.1.4.tgz#aeded7ab938fe921d4c34bc339ce1168bc2ffde5"
- integrity sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==
-
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
@@ -7233,11 +6410,6 @@ path-key@^2.0.0, path-key@^2.0.1:
resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
-path-key@^3.1.0:
- version "3.1.1"
- resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
- integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
-
path-parse@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
@@ -7823,27 +6995,6 @@ quick-format-unescaped@^4.0.1:
resolved "https://registry.yarnpkg.com/quick-format-unescaped/-/quick-format-unescaped-4.0.1.tgz#437a5ea1a0b61deb7605f8ab6a8fd3858dbeb701"
integrity sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A==
-quill-delta@^3.6.2:
- version "3.6.3"
- resolved "https://registry.yarnpkg.com/quill-delta/-/quill-delta-3.6.3.tgz#b19fd2b89412301c60e1ff213d8d860eac0f1032"
- integrity sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==
- dependencies:
- deep-equal "^1.0.1"
- extend "^3.0.2"
- fast-diff "1.1.2"
-
-quill@^1.3.7:
- version "1.3.7"
- resolved "https://registry.yarnpkg.com/quill/-/quill-1.3.7.tgz#da5b2f3a2c470e932340cdbf3668c9f21f9286e8"
- integrity sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==
- dependencies:
- clone "^2.1.1"
- deep-equal "^1.0.1"
- eventemitter3 "^2.0.3"
- extend "^3.0.2"
- parchment "^1.1.4"
- quill-delta "^3.6.2"
-
raw-body@^2.2.0:
version "2.4.1"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.1.tgz#30ac82f98bb5ae8c152e67149dac8d55153b168c"
@@ -8020,19 +7171,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.2.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"
@@ -8052,26 +7190,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"
-
-remixicon@^2.5.0:
- version "2.5.0"
- resolved "https://registry.yarnpkg.com/remixicon/-/remixicon-2.5.0.tgz#b5e245894a1550aa23793f95daceadbf96ad1a41"
- integrity sha512-q54ra2QutYDZpuSnFjmeagmEiN9IMo56/zz5dDNitzKD23oFRw77cWo4TsrAdmdkPiEn8mxlrTqxnkujDbEGww==
-
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"
@@ -8258,13 +7376,6 @@ rxjs@^6.6.0:
dependencies:
tslib "^1.9.0"
-sade@^1.4.0:
- version "1.7.4"
- resolved "https://registry.yarnpkg.com/sade/-/sade-1.7.4.tgz#ea681e0c65d248d2095c90578c03ca0bb1b54691"
- integrity sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==
- dependencies:
- mri "^1.1.0"
-
safe-buffer@*, safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
@@ -8343,11 +7454,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"
@@ -8399,13 +7505,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"
@@ -8438,23 +7537,11 @@ shebang-command@^1.2.0:
dependencies:
shebang-regex "^1.0.0"
-shebang-command@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
- integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
- dependencies:
- shebang-regex "^3.0.0"
-
shebang-regex@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
-shebang-regex@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
- integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
-
shell-env@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/shell-env/-/shell-env-0.3.0.tgz#2250339022989165bda4eb7bf383afeaaa92dc34"
@@ -8476,39 +7563,11 @@ shellwords@^0.1.1:
resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
-shortid@^2.2.15:
- version "2.2.16"
- resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.16.tgz#b742b8f0cb96406fd391c76bfc18a67a57fe5608"
- integrity sha512-Ugt+GIZqvGXCIItnsL+lvFJOiN7RYqlGy7QE41O3YC1xbNSeDGIRO7xg2JJXIAj1cAGnOeC1r7/T9pgrtQbv4g==
- dependencies:
- nanoid "^2.1.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"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
-sirv-cli@^0.4.6:
- version "0.4.6"
- resolved "https://registry.yarnpkg.com/sirv-cli/-/sirv-cli-0.4.6.tgz#c28ab20deb3b34637f5a60863dc350f055abca04"
- integrity sha512-/Vj85/kBvPL+n9ibgX6FicLE8VjidC1BhlX67PYPBfbBAphzR6i0k0HtU5c2arejfU3uzq8l3SYPCwl1x7z6Ww==
- dependencies:
- console-clear "^1.1.0"
- get-port "^3.2.0"
- kleur "^3.0.0"
- local-access "^1.0.1"
- sade "^1.4.0"
- sirv "^0.4.6"
- tinydate "^1.0.0"
-
-sirv@^0.4.6:
- version "0.4.6"
- resolved "https://registry.yarnpkg.com/sirv/-/sirv-0.4.6.tgz#185e44eb93d24009dd183b7494285c5180b81f22"
- integrity sha512-rYpOXlNbpHiY4nVXxuDf4mXPvKz1reZGap/LkWp9TvcZ84qD/nPBjjH/6GZsgIjVMbOslnY8YYULAyP8jMn1GQ==
- dependencies:
- "@polka/url" "^0.5.0"
- mime "^2.3.1"
-
sisteransi@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
@@ -8899,11 +7958,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"
@@ -8914,11 +7968,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"
@@ -8971,99 +8020,11 @@ supports-color@^7.1.0:
dependencies:
has-flag "^4.0.0"
-svelte-apexcharts@^1.0.2:
- version "1.0.2"
- resolved "https://registry.yarnpkg.com/svelte-apexcharts/-/svelte-apexcharts-1.0.2.tgz#4e000f8b8f7c901c05658c845457dfc8314d54c1"
- integrity sha512-6qlx4rE+XsonZ0FZudfwqOQ34Pq+3wpxgAD75zgEmGoYhYBJcwmikTuTf3o8ZBsZue9U/pAwhNy3ed1Bkq1gmA==
- dependencies:
- apexcharts "^3.19.2"
-
-svelte-flatpickr@^2.4.0:
- version "2.4.0"
- resolved "https://registry.yarnpkg.com/svelte-flatpickr/-/svelte-flatpickr-2.4.0.tgz#190871fc3305956c8c8fd3601cd036b8ac71ef49"
- integrity sha512-UUC5Te+b0qi4POg7VDwfGh0m5W3Hf64OwkfOTj6FEe/dYZN4cBzpQ82EuuQl0CTbbBAsMkcjJcixV1d2V6EHCQ==
- dependencies:
- flatpickr "^4.5.2"
-
-svelte-flatpickr@^3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/svelte-flatpickr/-/svelte-flatpickr-3.1.0.tgz#ad83588430dbd55196a1a258b8ba27e7f9c1ee37"
- integrity sha512-zKyV+ukeVuJ8CW0Ing3T19VSekc4bPkou/5Riutt1yATrLvSsanNqcgqi7Q5IePvIoOF9GJ5OtHvn1qK9Wx9BQ==
- dependencies:
- flatpickr "^4.5.2"
-
-svelte-portal@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/svelte-portal/-/svelte-portal-1.0.0.tgz#36a47c5578b1a4d9b4dc60fa32a904640ec4cdd3"
- integrity sha512-nHf+DS/jZ6jjnZSleBMSaZua9JlG5rZv9lOGKgJuaZStfevtjIlUJrkLc3vbV8QdBvPPVmvcjTlazAzfKu0v3Q==
-
-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.30.0"
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.30.0.tgz#cbde341e96bf34f4ac73c8f14f8a014e03bfb7d6"
integrity sha512-z+hdIACb9TROGvJBQWcItMtlr4s0DBUgJss6qWrtFkOoIInkG+iAMo/FJZQFyDBQZc+dul2+TzYSi/tpTT5/Ag==
-svg.draggable.js@^2.2.2:
- version "2.2.2"
- resolved "https://registry.yarnpkg.com/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz#c514a2f1405efb6f0263e7958f5b68fce50603ba"
- integrity sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==
- dependencies:
- svg.js "^2.0.1"
-
-svg.easing.js@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/svg.easing.js/-/svg.easing.js-2.0.0.tgz#8aa9946b0a8e27857a5c40a10eba4091e5691f12"
- integrity sha1-iqmUawqOJ4V6XEChDrpAkeVpHxI=
- dependencies:
- svg.js ">=2.3.x"
-
-svg.filter.js@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/svg.filter.js/-/svg.filter.js-2.0.2.tgz#91008e151389dd9230779fcbe6e2c9a362d1c203"
- integrity sha1-kQCOFROJ3ZIwd5/L5uLJo2LRwgM=
- dependencies:
- svg.js "^2.2.5"
-
-svg.js@>=2.3.x, svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5:
- version "2.7.1"
- resolved "https://registry.yarnpkg.com/svg.js/-/svg.js-2.7.1.tgz#eb977ed4737001eab859949b4a398ee1bb79948d"
- integrity sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==
-
-svg.pathmorphing.js@^0.1.3:
- version "0.1.3"
- resolved "https://registry.yarnpkg.com/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz#c25718a1cc7c36e852ecabc380e758ac09bb2b65"
- integrity sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==
- dependencies:
- svg.js "^2.4.0"
-
-svg.resize.js@^1.4.3:
- version "1.4.3"
- resolved "https://registry.yarnpkg.com/svg.resize.js/-/svg.resize.js-1.4.3.tgz#885abd248e0cd205b36b973c4b578b9a36f23332"
- integrity sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==
- dependencies:
- svg.js "^2.6.5"
- svg.select.js "^2.1.2"
-
-svg.select.js@^2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/svg.select.js/-/svg.select.js-2.1.2.tgz#e41ce13b1acff43a7441f9f8be87a2319c87be73"
- integrity sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==
- dependencies:
- svg.js "^2.2.5"
-
-svg.select.js@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/svg.select.js/-/svg.select.js-3.0.1.tgz#a4198e359f3825739226415f82176a90ea5cc917"
- integrity sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==
- dependencies:
- svg.js "^2.6.5"
-
symbol-tree@^3.2.2:
version "3.2.4"
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
@@ -9218,11 +8179,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"
@@ -9243,11 +8199,6 @@ tinycolor2@^1.4.1:
resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.2.tgz#3f6a4d1071ad07676d7fa472e1fac40a719d8803"
integrity sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA==
-tinydate@^1.0.0:
- version "1.3.0"
- resolved "https://registry.yarnpkg.com/tinydate/-/tinydate-1.3.0.tgz#e6ca8e5a22b51bb4ea1c3a2a4fd1352dbd4c57fb"
- integrity sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==
-
tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
@@ -9270,11 +8221,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"
@@ -9391,13 +8337,6 @@ tunnel@0.0.6, tunnel@^0.0.6:
resolved "https://registry.yarnpkg.com/tunnel/-/tunnel-0.0.6.tgz#72f1314b34a5b192db012324df2cc587ca47f92c"
integrity sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==
-turndown@^7.0.0:
- version "7.0.0"
- resolved "https://registry.yarnpkg.com/turndown/-/turndown-7.0.0.tgz#19b2a6a2d1d700387a1e07665414e4af4fec5225"
- integrity sha512-G1FfxfR0mUNMeGjszLYl3kxtopC4O9DRRiMlMDDVHvU1jaBkGFg4qxIyjIk2aiKLHyDyZvZyu4qBO2guuYBy3Q==
- dependencies:
- domino "^2.1.6"
-
tweetnacl@^0.14.3, tweetnacl@~0.14.0:
version "0.14.5"
resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
@@ -9450,23 +8389,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"
-
-uc.micro@^1.0.1, uc.micro@^1.0.5:
- version "1.0.6"
- resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
- integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
-
-uglify-js@^3.1.4:
- version "3.13.2"
- resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.2.tgz#fe10319861bccc8682bfe2e8151fbdd8aa921c44"
- integrity sha512-SbMu4D2Vo95LMC/MetNaso1194M1htEA+JrqE9Hk+G2DhI+itfS9TRu9ZKeCahLDNa/J3n4MqUJ/fOHMzQpRWw==
-
unbox-primitive@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.0.tgz#eeacbc4affa28e9b3d36b5eaeccc50b3251b1d3f"
@@ -9711,11 +8633,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"
@@ -9774,13 +8691,6 @@ which@^1.2.9, which@^1.3.0:
dependencies:
isexe "^2.0.0"
-which@^2.0.1:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
- integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
- dependencies:
- isexe "^2.0.0"
-
widest-line@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
@@ -9793,11 +8703,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"
@@ -10036,11 +8941,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"
diff --git a/packages/worker/package.json b/packages/worker/package.json
index 8f9e30139..5ab414dab 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -19,6 +19,7 @@
"author": "Budibase",
"license": "AGPL-3.0-or-later",
"dependencies": {
+ "@budibase/auth": "0.0.1",
"@koa/router": "^8.0.0",
"aws-sdk": "^2.811.0",
"bcryptjs": "^2.4.3",
diff --git a/packages/worker/src/api/controllers/admin/auth.js b/packages/worker/src/api/controllers/admin/auth.js
index f6b25091a..07b08c7d1 100644
--- a/packages/worker/src/api/controllers/admin/auth.js
+++ b/packages/worker/src/api/controllers/admin/auth.js
@@ -1,9 +1,15 @@
const jwt = require("jsonwebtoken")
const CouchDB = require("../../../db")
-const passport = require("koa-passport")
+const passport = require("@budibase/auth")
exports.authenticate = async (ctx, next) => {
- return passport.authenticate("local", (err, user, info, status) => {
+ return passport.authenticate("local", async (err, user, info, status) => {
+ // TODO: better
+ if (err) {
+ ctx.throw(err)
+ }
+
+ // await ctx.login(user)
ctx.body = {
err,
user,
diff --git a/packages/worker/src/api/routes/admin/auth.js b/packages/worker/src/api/routes/admin/auth.js
deleted file mode 100644
index ca41e9e19..000000000
--- a/packages/worker/src/api/routes/admin/auth.js
+++ /dev/null
@@ -1,8 +0,0 @@
-// const Router = require("@koa/router")
-// const controller = require("../controllers/auth")
-
-// const router = Router()
-
-// router.post("/api/authenticate", controller.authenticate)
-
-// module.exports = router
diff --git a/packages/worker/src/api/routes/admin/index.js b/packages/worker/src/api/routes/admin/index.js
index cf3a5c021..5a6aaf77e 100644
--- a/packages/worker/src/api/routes/admin/index.js
+++ b/packages/worker/src/api/routes/admin/index.js
@@ -1,15 +1,16 @@
const Router = require("@koa/router")
+const passport = require("@budibase/auth")
const controller = require("../../controllers/admin")
const authController = require("../../controllers/admin/auth")
-const authorized = require("../../../middleware/authorized")
+const authenticated = require("../../../middleware/authenticated")
const router = Router()
router
- .post("/api/admin/users", authorized, controller.userSave)
+ .post("/api/admin/users", authenticated, controller.userSave)
.post("/api/admin/authenticate", authController.authenticate)
- .delete("/api/admin/users/:email", authorized, controller.userDelete)
- .get("/api/admin/users", authorized, controller.userFetch)
- .get("/api/admin/users/:email", authorized, controller.userFind)
+ .delete("/api/admin/users/:email", authenticated, controller.userDelete)
+ .get("/api/admin/users", passport.authenticate("jwt"), controller.userFetch)
+ .get("/api/admin/users/:email", authenticated, controller.userFind)
module.exports = router
diff --git a/packages/worker/src/index.js b/packages/worker/src/index.js
index 199bb1d31..aad8bf54f 100644
--- a/packages/worker/src/index.js
+++ b/packages/worker/src/index.js
@@ -1,7 +1,7 @@
const Koa = require("koa")
const destroyable = require("server-destroy")
const koaBody = require("koa-body")
-const passport = require("koa-passport")
+const passport = require("@budibase/auth")
const logger = require("koa-pino-logger")
const http = require("http")
const api = require("./api")
@@ -26,7 +26,6 @@ app.use(
)
// authentication
-require("./middleware/auth")
app.use(passport.initialize())
app.use(passport.session())
diff --git a/packages/worker/src/middleware/auth/google.js b/packages/worker/src/middleware/auth/google.js
deleted file mode 100644
index fd33bc89a..000000000
--- a/packages/worker/src/middleware/auth/google.js
+++ /dev/null
@@ -1,13 +0,0 @@
-// const GoogleStrategy = require("passport-google-auth").Strategy
-
-exports.options = {
- clientId: "your-client-id",
- clientSecret: "your-secret",
- callbackURL:
- "http://localhost:" + (process.env.PORT || 3000) + "/auth/google/callback",
-}
-
-exports.authenticate = async function(token, tokenSecret, profile, done) {
- // retrieve user ...
- // fetchUser().then(user => done(null, user))
-}
diff --git a/packages/worker/src/middleware/auth/index.js b/packages/worker/src/middleware/auth/index.js
deleted file mode 100644
index 3eac2badb..000000000
--- a/packages/worker/src/middleware/auth/index.js
+++ /dev/null
@@ -1,20 +0,0 @@
-const passport = require("koa-passport")
-const LocalStrategy = require("passport-local").Strategy
-const JwtStrategy = require("passport-jwt").Strategy
-const GoogleStrategy = require("passport-google-oauth").Strategy
-const jwt = require("./jwt")
-const local = require("./local")
-const google = require("./google")
-
-// Strategies
-passport.use(new LocalStrategy(local.options, local.authenticate))
-passport.use(new JwtStrategy(jwt.options, jwt.authenticate))
-// passport.use(new GoogleStrategy(google.options, google.authenticate))
-
-// exports.middleware = async (ctx, next) => {
-// if (ctx.isAuthenticated()) {
-// return next()
-// } else {
-// ctx.throw(403, "Not Authenticated")
-// }
-// }
diff --git a/packages/worker/src/middleware/auth/jwt.js b/packages/worker/src/middleware/auth/jwt.js
deleted file mode 100644
index 8313d5abc..000000000
--- a/packages/worker/src/middleware/auth/jwt.js
+++ /dev/null
@@ -1,38 +0,0 @@
-const jwt = require("passport-jwt")
-const env = require("../../environment")
-const { getCookieName } = require("../../../../server/src/utilities")
-
-const ExtractJWT = jwt.ExtractJwt
-
-exports.options = {
- jwtFromRequest: function(ctx) {
- return ctx.cookies.get("budibase")
- },
- // TODO: fix
- secretOrKey: env.JWT_SECRET || "funky",
-}
-
-exports.authenticate = async function(jwt, done) {
- console.log(jwt)
- done({ name: "joe" })
- // const appId = ctx.appId
- // if (!appId) ctx.throw(400, "No appId")
-
- // const { email, password } = ctx.request.body
-
- // if (!email) ctx.throw(400, "Email Required.")
- // if (!password) ctx.throw(400, "Password Required.")
-
- // // Check the user exists in the instance DB by email
- // const db = new CouchDB(appId)
- // const app = await db.get(appId)
-
- // let dbUser
- // try {
- // dbUser = await db.get(generateUserID(email))
- // } catch (_) {
- // // do not want to throw a 404 - as this could be
- // // used to determine valid emails
- // ctx.throw(401, INVALID_ERR)
- // }
-}
diff --git a/packages/worker/src/middleware/authorized.js b/packages/worker/src/middleware/authorized.js
index 86a5ab27d..716f55fbd 100644
--- a/packages/worker/src/middleware/authorized.js
+++ b/packages/worker/src/middleware/authorized.js
@@ -3,5 +3,5 @@
* a global user record.
*/
module.exports = async (ctx, next) => {
- next()
+ return next()
}
From 46ddcdce2c450bc604061001eea2c91873eaf4a7 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Wed, 7 Apr 2021 15:15:05 +0100
Subject: [PATCH 017/135] JWT auth on admin endpoints
---
packages/auth/src/index.js | 3 +--
packages/auth/src/middleware/authenticated.js | 2 +-
packages/auth/src/middleware/index.js | 6 ++---
.../src/middleware/{ => passport}/google.js | 2 +-
.../auth/src/middleware/{ => passport}/jwt.js | 5 +---
.../src/middleware/{ => passport}/local.js | 8 +++---
.../worker/src/api/controllers/admin/auth.js | 25 ++++++++++---------
packages/worker/src/api/routes/admin/index.js | 15 ++++++++---
8 files changed, 35 insertions(+), 31 deletions(-)
rename packages/auth/src/middleware/{ => passport}/google.js (91%)
rename packages/auth/src/middleware/{ => passport}/jwt.js (71%)
rename packages/auth/src/middleware/{ => passport}/local.js (88%)
diff --git a/packages/auth/src/index.js b/packages/auth/src/index.js
index 778d4fb32..308800808 100644
--- a/packages/auth/src/index.js
+++ b/packages/auth/src/index.js
@@ -5,7 +5,6 @@ const JwtStrategy = require("passport-jwt").Strategy
const CouchDB = require("./db")
const { StaticDatabases } = require("./db/utils")
const { jwt, local, google } = require("./middleware")
-const hashing = require("./hashing")
// Strategies
passport.use(new LocalStrategy(local.options, local.authenticate))
@@ -26,6 +25,6 @@ passport.deserializeUser(async (user, done) => {
}
})
-// exports.hashing = hashing
+// exports.Cookies = Cookies
module.exports = passport
diff --git a/packages/auth/src/middleware/authenticated.js b/packages/auth/src/middleware/authenticated.js
index f7ff086b6..7797649b1 100644
--- a/packages/auth/src/middleware/authenticated.js
+++ b/packages/auth/src/middleware/authenticated.js
@@ -22,7 +22,7 @@ module.exports = async (ctx, next) => {
const cookieAppId = ctx.cookies.get(Cookies.CurrentApp)
// const builtinRoles = getBuiltinRoles()
if (appId && cookieAppId !== appId) {
- setCookie(ctx, appId, "currentapp")
+ setCookie(ctx, appId, Cookies.CurrentApp)
} else if (cookieAppId) {
appId = cookieAppId
}
diff --git a/packages/auth/src/middleware/index.js b/packages/auth/src/middleware/index.js
index a9d07516e..9d822e593 100644
--- a/packages/auth/src/middleware/index.js
+++ b/packages/auth/src/middleware/index.js
@@ -1,6 +1,6 @@
-const jwt = require("./jwt")
-const local = require("./local")
-const google = require("./google")
+const jwt = require("./passport/jwt")
+const local = require("./passport/local")
+const google = require("./passport/google")
module.exports = {
google,
diff --git a/packages/auth/src/middleware/google.js b/packages/auth/src/middleware/passport/google.js
similarity index 91%
rename from packages/auth/src/middleware/google.js
rename to packages/auth/src/middleware/passport/google.js
index 008d4a681..1ee6583b5 100644
--- a/packages/auth/src/middleware/google.js
+++ b/packages/auth/src/middleware/passport/google.js
@@ -1,4 +1,4 @@
-const CouchDB = require("../db")
+// const CouchDB = require("../db")
exports.options = {
clientId: process.env.GOOGLE_CLIENT_ID,
diff --git a/packages/auth/src/middleware/jwt.js b/packages/auth/src/middleware/passport/jwt.js
similarity index 71%
rename from packages/auth/src/middleware/jwt.js
rename to packages/auth/src/middleware/passport/jwt.js
index 5d36f0b91..a619ab994 100644
--- a/packages/auth/src/middleware/jwt.js
+++ b/packages/auth/src/middleware/passport/jwt.js
@@ -1,7 +1,4 @@
-// const jwt = require("passport-jwt")
-const { Cookies } = require("../constants")
-
-// const ExtractJWT = jwt.ExtractJwt
+const { Cookies } = require("../../constants")
exports.options = {
jwtFromRequest: function(ctx) {
diff --git a/packages/auth/src/middleware/local.js b/packages/auth/src/middleware/passport/local.js
similarity index 88%
rename from packages/auth/src/middleware/local.js
rename to packages/auth/src/middleware/passport/local.js
index 85a68af87..379ec58db 100644
--- a/packages/auth/src/middleware/local.js
+++ b/packages/auth/src/middleware/passport/local.js
@@ -1,8 +1,8 @@
const jwt = require("jsonwebtoken")
-const { UserStatus } = require("../constants")
-const CouchDB = require("../db")
-const { StaticDatabases, generateUserID } = require("../db/utils")
-const { compare } = require("../hashing")
+const { UserStatus } = require("../../constants")
+const CouchDB = require("../../db")
+const { StaticDatabases, generateUserID } = require("../../db/utils")
+const { compare } = require("../../hashing")
const INVALID_ERR = "Invalid Credentials"
diff --git a/packages/worker/src/api/controllers/admin/auth.js b/packages/worker/src/api/controllers/admin/auth.js
index 07b08c7d1..2c41c1f47 100644
--- a/packages/worker/src/api/controllers/admin/auth.js
+++ b/packages/worker/src/api/controllers/admin/auth.js
@@ -1,20 +1,21 @@
-const jwt = require("jsonwebtoken")
-const CouchDB = require("../../../db")
const passport = require("@budibase/auth")
exports.authenticate = async (ctx, next) => {
- return passport.authenticate("local", async (err, user, info, status) => {
- // TODO: better
+ return passport.authenticate("local", async (err, user) => {
if (err) {
- ctx.throw(err)
+ return ctx.throw(err)
}
- // await ctx.login(user)
- ctx.body = {
- err,
- user,
- info,
- status,
- }
+ const expires = new Date()
+ expires.setDate(expires.getDate() + 1)
+
+ ctx.cookies.set("budibase:auth", user.token, {
+ expires,
+ path: "/",
+ httpOnly: false,
+ overwrite: true,
+ })
+
+ ctx.body = { success: true }
})(ctx, next)
}
diff --git a/packages/worker/src/api/routes/admin/index.js b/packages/worker/src/api/routes/admin/index.js
index 5a6aaf77e..c87e395a2 100644
--- a/packages/worker/src/api/routes/admin/index.js
+++ b/packages/worker/src/api/routes/admin/index.js
@@ -2,15 +2,22 @@ const Router = require("@koa/router")
const passport = require("@budibase/auth")
const controller = require("../../controllers/admin")
const authController = require("../../controllers/admin/auth")
-const authenticated = require("../../../middleware/authenticated")
const router = Router()
router
- .post("/api/admin/users", authenticated, controller.userSave)
+ .post("/api/admin/users", passport.authenticate("jwt"), controller.userSave)
.post("/api/admin/authenticate", authController.authenticate)
- .delete("/api/admin/users/:email", authenticated, controller.userDelete)
+ .delete(
+ "/api/admin/users/:email",
+ passport.authenticate("jwt"),
+ controller.userDelete
+ )
.get("/api/admin/users", passport.authenticate("jwt"), controller.userFetch)
- .get("/api/admin/users/:email", authenticated, controller.userFind)
+ .get(
+ "/api/admin/users/:email",
+ passport.authenticate("jwt"),
+ controller.userFind
+ )
module.exports = router
From 1f473c0649848aac48aff4cf829462fb667f2a65 Mon Sep 17 00:00:00 2001
From: Theo Melo <9499829+theomelo@users.noreply.github.com>
Date: Wed, 7 Apr 2021 15:27:06 -0700
Subject: [PATCH 018/135] fix(README): References to HEAD
---
README.md | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index d3db6144b..5ecf9d3ec 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,7 @@
-
+
@@ -93,7 +93,7 @@ Watch "releases" of this repo to get notified of major updates, and give the sta
[](https://starchart.cc/Budibase/budibase)
-If you are having issues between updates of the builder, please use the guide [here](https://github.com/Budibase/budibase/blob/next/.github/CONTRIBUTING.md#troubleshooting) to clear down your environment.
+If you are having issues between updates of the builder, please use the guide [here](https://github.com/Budibase/budibase/blob/HEAD/.github/CONTRIBUTING.md#troubleshooting) to clear down your environment.
## 🏁 Getting Started with Budibase
@@ -131,7 +131,7 @@ Checkout our [Public Roadmap](https://github.com/Budibase/budibase/projects/10).
## ❗ Code of Conduct
-Budibase is dedicated to providing a welcoming, diverse, and harrassment-free experience for everyone. We expect everyone in the Budibase community to abide by our [**Code of Conduct**](https://github.com/Budibase/budibase/blob/next/.github/CODE_OF_CONDUCT.md). Please read it.
+Budibase is dedicated to providing a welcoming, diverse, and harrassment-free experience for everyone. We expect everyone in the Budibase community to abide by our [**Code of Conduct**](https://github.com/Budibase/budibase/blob/HEAD/.github/CODE_OF_CONDUCT.md). Please read it.
## 🙌 Contributing to Budibase
@@ -143,13 +143,13 @@ A good place to start contributing, is the [First time issues project](https://g
### How the repository is organized
Budibase is a monorepo managed by lerna. Lerna manages the building and publishing of the budibase packages. At a high level, here are the packages that make up Budibase.
-- [packages/builder](https://github.com/Budibase/budibase/tree/next/packages/builder) - contains code for the budibase builder client side svelte application.
+- [packages/builder](https://github.com/Budibase/budibase/tree/HEAD/packages/builder) - contains code for the budibase builder client side svelte application.
-- [packages/client](https://github.com/Budibase/budibase/tree/next/packages/client) - A module that runs in the browser responsible for reading JSON definition and creating living, breathing web apps from it.
+- [packages/client](https://github.com/Budibase/budibase/tree/HEAD/packages/client) - A module that runs in the browser responsible for reading JSON definition and creating living, breathing web apps from it.
-- [packages/server](https://github.com/Budibase/budibase/tree/next/packages/server) - The budibase server. This Koa app is responsible for serving the JS for the builder and budibase apps, as well as providing the API for interaction with the database and file system.
+- [packages/server](https://github.com/Budibase/budibase/tree/HEAD/packages/server) - The budibase server. This Koa app is responsible for serving the JS for the builder and budibase apps, as well as providing the API for interaction with the database and file system.
-For more information, see [CONTRIBUTING.md](https://github.com/Budibase/budibase/blob/next/.github/CONTRIBUTING.md)
+For more information, see [CONTRIBUTING.md](https://github.com/Budibase/budibase/blob/HEAD/.github/CONTRIBUTING.md)
## 📝 License
From 73dfad300119e0c64f4e2f121abd611dd627aa5d Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Thu, 8 Apr 2021 11:20:37 +0100
Subject: [PATCH 019/135] encapsulate more auth functionality into shared
module and use in worker
---
packages/auth/src/db/utils.js | 2 +
packages/auth/src/index.js | 15 +++-
packages/auth/src/middleware/authenticated.js | 73 -----------------
packages/auth/src/utils.js | 79 ++++++++++++++++++
.../src/api/controllers/search/index.js | 2 +-
.../worker/src/api/controllers/admin/auth.js | 2 +-
packages/worker/src/api/routes/admin/index.js | 17 ++--
packages/worker/src/db/utils.js | 3 +
packages/worker/src/index.js | 2 +-
.../worker/src/middleware/authenticated.js | 44 ++++++++++
packages/worker/src/utils.js | 81 +++++++++++++++++--
11 files changed, 222 insertions(+), 98 deletions(-)
delete mode 100644 packages/auth/src/middleware/authenticated.js
create mode 100644 packages/auth/src/utils.js
create mode 100644 packages/worker/src/middleware/authenticated.js
diff --git a/packages/auth/src/db/utils.js b/packages/auth/src/db/utils.js
index cda770882..17d09ceae 100644
--- a/packages/auth/src/db/utils.js
+++ b/packages/auth/src/db/utils.js
@@ -8,6 +8,8 @@ const DocumentTypes = {
USER: "us",
}
+exports.DocumentTypes = DocumentTypes
+
const UNICODE_MAX = "\ufff0"
const SEPARATOR = "_"
diff --git a/packages/auth/src/index.js b/packages/auth/src/index.js
index 308800808..84e3fe659 100644
--- a/packages/auth/src/index.js
+++ b/packages/auth/src/index.js
@@ -5,6 +5,9 @@ const JwtStrategy = require("passport-jwt").Strategy
const CouchDB = require("./db")
const { StaticDatabases } = require("./db/utils")
const { jwt, local, google } = require("./middleware")
+const { Cookies, UserStatus } = require("./constants")
+const { hash, compare } = require("./hashing")
+const { getAppId, setCookie } = require("./utils")
// Strategies
passport.use(new LocalStrategy(local.options, local.authenticate))
@@ -25,6 +28,12 @@ passport.deserializeUser(async (user, done) => {
}
})
-// exports.Cookies = Cookies
-
-module.exports = passport
+module.exports = {
+ passport,
+ Cookies,
+ UserStatus,
+ hash,
+ compare,
+ getAppId,
+ setCookie,
+}
diff --git a/packages/auth/src/middleware/authenticated.js b/packages/auth/src/middleware/authenticated.js
deleted file mode 100644
index 7797649b1..000000000
--- a/packages/auth/src/middleware/authenticated.js
+++ /dev/null
@@ -1,73 +0,0 @@
-const jwt = require("jsonwebtoken")
-const STATUS_CODES = require("../utilities/statusCodes")
-const { getRole, getBuiltinRoles } = require("../utilities/security/roles")
-const { AuthTypes, Cookies } = require("../constants")
-const {
- getAppId,
- getCookieName,
- clearCookie,
- setCookie,
- isClient,
-} = require("../utilities")
-
-module.exports = async (ctx, next) => {
- // if (ctx.path === "/_builder") {
- // await next()
- // return
- // }
-
- // do everything we can to make sure the appId is held correctly
- // we hold it in state as a
- let appId = getAppId(ctx)
- const cookieAppId = ctx.cookies.get(Cookies.CurrentApp)
- // const builtinRoles = getBuiltinRoles()
- if (appId && cookieAppId !== appId) {
- setCookie(ctx, appId, Cookies.CurrentApp)
- } else if (cookieAppId) {
- appId = cookieAppId
- }
- let token, authType
- // if (!isClient(ctx)) {
- // token = ctx.cookies.get(getCookieName())
- // authType = AuthTypes.BUILDER
- // }
-
- if (!token && appId) {
- token = ctx.cookies.get(getCookieName(appId))
- // authType = AuthTypes.APP
- }
-
- // if (!token) {
- // ctx.auth.authenticated = false
- // ctx.appId = appId
- // ctx.user = {
- // role: builtinRoles.PUBLIC,
- // }
- // await next()
- // return
- // }
-
- try {
- // ctx.auth.authenticated = authType
- const jwtPayload = jwt.verify(token, ctx.config.jwtSecret)
- ctx.appId = appId
- // ctx.auth.apiKey = jwtPayload.apiKey
- ctx.user = {
- ...jwtPayload,
- role: await getRole(appId, jwtPayload.roleId),
- }
- // appId no longer carried in user, make sure
- delete ctx.user.appId
- } catch (err) {
- console.log(err)
- // if (authType === AuthTypes.BUILDER) {
- // clearCookie(ctx)
- // ctx.status = 200
- // return
- // } else {
- ctx.throw(err.status || STATUS_CODES.FORBIDDEN, err.text)
- // }
- }
-
- await next()
-}
diff --git a/packages/auth/src/utils.js b/packages/auth/src/utils.js
new file mode 100644
index 000000000..7eb39a300
--- /dev/null
+++ b/packages/auth/src/utils.js
@@ -0,0 +1,79 @@
+const { DocumentTypes, SEPARATOR } = require("./db/utils")
+
+const APP_PREFIX = DocumentTypes.APP + SEPARATOR
+
+function confirmAppId(possibleAppId) {
+ return possibleAppId && possibleAppId.startsWith(APP_PREFIX)
+ ? possibleAppId
+ : undefined
+}
+
+/**
+ * Given a request tries to find the appId, which can be located in various places
+ * @param {object} ctx The main request body to look through.
+ * @returns {string|undefined} If an appId was found it will be returned.
+ */
+exports.getAppId = ctx => {
+ const options = [ctx.headers["x-budibase-app-id"], ctx.params.appId]
+ if (ctx.subdomains) {
+ options.push(ctx.subdomains[1])
+ }
+ let appId
+ for (let option of options) {
+ appId = confirmAppId(option)
+ if (appId) {
+ break
+ }
+ }
+
+ // look in body if can't find it in subdomain
+ if (!appId && ctx.request.body && ctx.request.body.appId) {
+ appId = confirmAppId(ctx.request.body.appId)
+ }
+ let appPath =
+ ctx.request.headers.referrer ||
+ ctx.path.split("/").filter(subPath => subPath.startsWith(APP_PREFIX))
+ if (!appId && appPath.length !== 0) {
+ appId = confirmAppId(appPath[0])
+ }
+ return appId
+}
+
+/**
+ * Store a cookie for the request, has a hardcoded expiry.
+ * @param {object} ctx The request which is to be manipulated.
+ * @param {string} name The name of the cookie to set.
+ * @param {string|object} value The value of cookie which will be set.
+ */
+exports.setCookie = (ctx, value, name = "builder") => {
+ const expires = new Date()
+ expires.setDate(expires.getDate() + 1)
+
+ if (!value) {
+ ctx.cookies.set(name)
+ } else {
+ ctx.cookies.set(name, value, {
+ expires,
+ path: "/",
+ httpOnly: false,
+ overwrite: true,
+ })
+ }
+}
+
+/**
+ * Utility function, simply calls setCookie with an empty string for value
+ */
+exports.clearCookie = (ctx, name) => {
+ exports.setCookie(ctx, "", name)
+}
+
+/**
+ * Checks if the API call being made (based on the provided ctx object) is from the client. If
+ * the call is not from a client app then it is from the builder.
+ * @param {object} ctx The koa context object to be tested.
+ * @return {boolean} returns true if the call is from the client lib (a built app rather than the builder).
+ */
+exports.isClient = ctx => {
+ return ctx.headers["x-budibase-type"] === "client"
+}
diff --git a/packages/server/src/api/controllers/search/index.js b/packages/server/src/api/controllers/search/index.js
index d3c588d07..234c7eb25 100644
--- a/packages/server/src/api/controllers/search/index.js
+++ b/packages/server/src/api/controllers/search/index.js
@@ -1,7 +1,7 @@
const { QueryBuilder, buildSearchUrl, search } = require("./utils")
exports.rowSearch = async ctx => {
- const appId = ctx.user.appId
+ const appId = ctx.appId
const { tableId } = ctx.params
const { bookmark, query, raw } = ctx.request.body
let url
diff --git a/packages/worker/src/api/controllers/admin/auth.js b/packages/worker/src/api/controllers/admin/auth.js
index 2c41c1f47..62128efed 100644
--- a/packages/worker/src/api/controllers/admin/auth.js
+++ b/packages/worker/src/api/controllers/admin/auth.js
@@ -1,4 +1,4 @@
-const passport = require("@budibase/auth")
+const { passport } = require("@budibase/auth")
exports.authenticate = async (ctx, next) => {
return passport.authenticate("local", async (err, user) => {
diff --git a/packages/worker/src/api/routes/admin/index.js b/packages/worker/src/api/routes/admin/index.js
index c87e395a2..1c64110d2 100644
--- a/packages/worker/src/api/routes/admin/index.js
+++ b/packages/worker/src/api/routes/admin/index.js
@@ -2,22 +2,15 @@ const Router = require("@koa/router")
const passport = require("@budibase/auth")
const controller = require("../../controllers/admin")
const authController = require("../../controllers/admin/auth")
+const authenticated = require("../../../middleware/authenticated")
const router = Router()
router
- .post("/api/admin/users", passport.authenticate("jwt"), controller.userSave)
+ .post("/api/admin/users", authenticated, controller.userSave)
.post("/api/admin/authenticate", authController.authenticate)
- .delete(
- "/api/admin/users/:email",
- passport.authenticate("jwt"),
- controller.userDelete
- )
- .get("/api/admin/users", passport.authenticate("jwt"), controller.userFetch)
- .get(
- "/api/admin/users/:email",
- passport.authenticate("jwt"),
- controller.userFind
- )
+ .delete("/api/admin/users/:email", authenticated, controller.userDelete)
+ .get("/api/admin/users", authenticated, controller.userFetch)
+ .get("/api/admin/users/:email", authenticated, controller.userFind)
module.exports = router
diff --git a/packages/worker/src/db/utils.js b/packages/worker/src/db/utils.js
index cda770882..b250b895b 100644
--- a/packages/worker/src/db/utils.js
+++ b/packages/worker/src/db/utils.js
@@ -6,8 +6,11 @@ exports.StaticDatabases = {
const DocumentTypes = {
USER: "us",
+ APP: "app",
}
+exports.DocumentTypes = DocumentTypes
+
const UNICODE_MAX = "\ufff0"
const SEPARATOR = "_"
diff --git a/packages/worker/src/index.js b/packages/worker/src/index.js
index aad8bf54f..2e031b9f6 100644
--- a/packages/worker/src/index.js
+++ b/packages/worker/src/index.js
@@ -1,7 +1,7 @@
const Koa = require("koa")
const destroyable = require("server-destroy")
const koaBody = require("koa-body")
-const passport = require("@budibase/auth")
+const { passport } = require("@budibase/auth")
const logger = require("koa-pino-logger")
const http = require("http")
const api = require("./api")
diff --git a/packages/worker/src/middleware/authenticated.js b/packages/worker/src/middleware/authenticated.js
new file mode 100644
index 000000000..8701da731
--- /dev/null
+++ b/packages/worker/src/middleware/authenticated.js
@@ -0,0 +1,44 @@
+const { passport, getAppId, setCookie, Cookies } = require("@budibase/auth")
+
+module.exports = async (ctx, next) => {
+ // do everything we can to make sure the appId is held correctly
+ let appId = getAppId(ctx)
+ const cookieAppId = ctx.cookies.get(Cookies.CurrentApp)
+ // const builtinRoles = getBuiltinRoles()
+ if (appId && cookieAppId !== appId) {
+ setCookie(ctx, appId, Cookies.CurrentApp)
+ } else if (cookieAppId) {
+ appId = cookieAppId
+ }
+
+ let token
+ if (appId) {
+ token = ctx.cookies.get(Cookies.Auth)
+ }
+
+ if (!token) {
+ ctx.auth = {
+ authenticated: true,
+ }
+ ctx.appId = appId
+ // ctx.user = {
+ // // TODO: introduce roles again
+ // // role: builtinRoles.PUBLIC,
+ // }
+ return await next()
+ }
+
+ return passport.authenticate("jwt", async (err, user) => {
+ if (err) {
+ return ctx.throw(err)
+ }
+
+ try {
+ ctx.user = user
+ await next()
+ } catch (err) {
+ console.log(err)
+ ctx.throw(err.status || 403, err.text)
+ }
+ })(ctx, next)
+}
diff --git a/packages/worker/src/utils.js b/packages/worker/src/utils.js
index 0711ae67b..260a64cda 100644
--- a/packages/worker/src/utils.js
+++ b/packages/worker/src/utils.js
@@ -1,13 +1,80 @@
-const bcrypt = require("bcryptjs")
const env = require("./environment")
+const { DocumentTypes, SEPARATOR } = require("./db/utils")
-const SALT_ROUNDS = env.SALT_ROUNDS || 10
+const APP_PREFIX = DocumentTypes.APP + SEPARATOR
-exports.hash = async data => {
- const salt = await bcrypt.genSalt(SALT_ROUNDS)
- return bcrypt.hash(data, salt)
+function confirmAppId(possibleAppId) {
+ return possibleAppId && possibleAppId.startsWith(APP_PREFIX)
+ ? possibleAppId
+ : undefined
}
-exports.compare = async (data, encrypted) => {
- return bcrypt.compare(data, encrypted)
+/**
+ * Given a request tries to find the appId, which can be located in various places
+ * @param {object} ctx The main request body to look through.
+ * @returns {string|undefined} If an appId was found it will be returned.
+ */
+exports.getAppId = ctx => {
+ const options = [ctx.headers["x-budibase-app-id"], ctx.params.appId]
+ if (ctx.subdomains) {
+ options.push(ctx.subdomains[1])
+ }
+ let appId
+ for (let option of options) {
+ appId = confirmAppId(option)
+ if (appId) {
+ break
+ }
+ }
+
+ // look in body if can't find it in subdomain
+ if (!appId && ctx.request.body && ctx.request.body.appId) {
+ appId = confirmAppId(ctx.request.body.appId)
+ }
+ let appPath =
+ ctx.request.headers.referrer ||
+ ctx.path.split("/").filter(subPath => subPath.startsWith(APP_PREFIX))
+ if (!appId && appPath.length !== 0) {
+ appId = confirmAppId(appPath[0])
+ }
+ return appId
+}
+
+/**
+ * Store a cookie for the request, has a hardcoded expiry.
+ * @param {object} ctx The request which is to be manipulated.
+ * @param {string} name The name of the cookie to set.
+ * @param {string|object} value The value of cookie which will be set.
+ */
+exports.setCookie = (ctx, value, name = "builder") => {
+ const expires = new Date()
+ expires.setDate(expires.getDate() + 1)
+
+ if (!value) {
+ ctx.cookies.set(name)
+ } else {
+ ctx.cookies.set(name, value, {
+ expires,
+ path: "/",
+ httpOnly: false,
+ overwrite: true,
+ })
+ }
+}
+
+/**
+ * Utility function, simply calls setCookie with an empty string for value
+ */
+exports.clearCookie = (ctx, name) => {
+ exports.setCookie(ctx, "", name)
+}
+
+/**
+ * Checks if the API call being made (based on the provided ctx object) is from the client. If
+ * the call is not from a client app then it is from the builder.
+ * @param {object} ctx The koa context object to be tested.
+ * @return {boolean} returns true if the call is from the client lib (a built app rather than the builder).
+ */
+exports.isClient = ctx => {
+ return ctx.headers["x-budibase-type"] === "client"
}
From 1054e25c84c517ee8f447cad31b1a5612cb1acb1 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Thu, 8 Apr 2021 11:21:52 +0100
Subject: [PATCH 020/135] flip auth boolean
---
hosting/generated-envoy.dev.yaml | 125 ++++++++++++++++++
.../worker/src/middleware/authenticated.js | 2 +-
2 files changed, 126 insertions(+), 1 deletion(-)
create mode 100644 hosting/generated-envoy.dev.yaml
diff --git a/hosting/generated-envoy.dev.yaml b/hosting/generated-envoy.dev.yaml
new file mode 100644
index 000000000..72cad3410
--- /dev/null
+++ b/hosting/generated-envoy.dev.yaml
@@ -0,0 +1,125 @@
+static_resources:
+ listeners:
+ - name: main_listener
+ address:
+ socket_address: { address: 0.0.0.0, port_value: 10000 }
+ filter_chains:
+ - filters:
+ - name: envoy.filters.network.http_connection_manager
+ typed_config:
+ "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
+ stat_prefix: ingress
+ codec_type: auto
+ route_config:
+ name: local_route
+ virtual_hosts:
+ - name: local_services
+ domains: ["*"]
+ routes:
+ - match: { prefix: "/db/" }
+ route:
+ cluster: couchdb-service
+ prefix_rewrite: "/"
+
+ - match: { prefix: "/cache/" }
+ route:
+ cluster: redis-service
+ prefix_rewrite: "/"
+
+ - match: { prefix: "/api/" }
+ route:
+ cluster: server-dev
+
+ - match: { prefix: "/app_" }
+ route:
+ cluster: server-dev
+
+ - match: { prefix: "/builder/" }
+ route:
+ cluster: builder-dev
+
+ - match: { prefix: "/builder" }
+ route:
+ cluster: builder-dev
+ prefix_rewrite: "/builder/"
+
+ # minio is on the default route because this works
+ # best, minio + AWS SDK doesn't handle path proxy
+ - match: { prefix: "/" }
+ route:
+ cluster: minio-service
+
+ http_filters:
+ - name: envoy.filters.http.router
+
+ clusters:
+ - name: minio-service
+ connect_timeout: 0.25s
+ type: strict_dns
+ lb_policy: round_robin
+ load_assignment:
+ cluster_name: minio-service
+ endpoints:
+ - lb_endpoints:
+ - endpoint:
+ address:
+ socket_address:
+ address: minio-service
+ port_value: 9000
+
+ - name: couchdb-service
+ connect_timeout: 0.25s
+ type: strict_dns
+ lb_policy: round_robin
+ load_assignment:
+ cluster_name: couchdb-service
+ endpoints:
+ - lb_endpoints:
+ - endpoint:
+ address:
+ socket_address:
+ address: couchdb-service
+ port_value: 5984
+
+ - name: redis-service
+ connect_timeout: 0.25s
+ type: strict_dns
+ lb_policy: round_robin
+ load_assignment:
+ cluster_name: redis-service
+ endpoints:
+ - lb_endpoints:
+ - endpoint:
+ address:
+ socket_address:
+ address: redis-service
+ port_value: 6379
+
+ - name: server-dev
+ connect_timeout: 0.25s
+ type: strict_dns
+ lb_policy: round_robin
+ load_assignment:
+ cluster_name: server-dev
+ endpoints:
+ - lb_endpoints:
+ - endpoint:
+ address:
+ socket_address:
+ address: host.docker.internal
+ port_value: 4001
+
+ - name: builder-dev
+ connect_timeout: 15s
+ type: strict_dns
+ lb_policy: round_robin
+ load_assignment:
+ cluster_name: builder-dev
+ endpoints:
+ - lb_endpoints:
+ - endpoint:
+ address:
+ socket_address:
+ address: host.docker.internal
+ port_value: 3000
+
diff --git a/packages/worker/src/middleware/authenticated.js b/packages/worker/src/middleware/authenticated.js
index 8701da731..dd7e1d974 100644
--- a/packages/worker/src/middleware/authenticated.js
+++ b/packages/worker/src/middleware/authenticated.js
@@ -18,7 +18,7 @@ module.exports = async (ctx, next) => {
if (!token) {
ctx.auth = {
- authenticated: true,
+ authenticated: false,
}
ctx.appId = appId
// ctx.user = {
From 4390bc5c0c267b3c0e2bca645243c31b8fb43a48 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Thu, 8 Apr 2021 11:26:08 +0100
Subject: [PATCH 021/135] encapsulate db ID generation functions
---
packages/auth/src/index.js | 4 +
.../worker/src/api/controllers/admin/index.js | 6 +-
packages/worker/src/utils.js | 80 -------------------
3 files changed, 7 insertions(+), 83 deletions(-)
delete mode 100644 packages/worker/src/utils.js
diff --git a/packages/auth/src/index.js b/packages/auth/src/index.js
index 84e3fe659..51431e424 100644
--- a/packages/auth/src/index.js
+++ b/packages/auth/src/index.js
@@ -8,6 +8,7 @@ const { jwt, local, google } = require("./middleware")
const { Cookies, UserStatus } = require("./constants")
const { hash, compare } = require("./hashing")
const { getAppId, setCookie } = require("./utils")
+const { generateUserID, getUserParams } = require("./db/utils")
// Strategies
passport.use(new LocalStrategy(local.options, local.authenticate))
@@ -32,6 +33,9 @@ module.exports = {
passport,
Cookies,
UserStatus,
+ StaticDatabases,
+ generateUserID,
+ getUserParams,
hash,
compare,
getAppId,
diff --git a/packages/worker/src/api/controllers/admin/index.js b/packages/worker/src/api/controllers/admin/index.js
index b6531174b..515feb842 100644
--- a/packages/worker/src/api/controllers/admin/index.js
+++ b/packages/worker/src/api/controllers/admin/index.js
@@ -1,10 +1,10 @@
const CouchDB = require("../../../db")
const {
- StaticDatabases,
+ hash,
generateUserID,
getUserParams,
-} = require("../../../db/utils")
-const { hash } = require("../../../utils")
+ StaticDatabases,
+} = require("@budibase/auth")
const { UserStatus } = require("../../../constants")
const USER_DB = StaticDatabases.USER.name
diff --git a/packages/worker/src/utils.js b/packages/worker/src/utils.js
deleted file mode 100644
index 260a64cda..000000000
--- a/packages/worker/src/utils.js
+++ /dev/null
@@ -1,80 +0,0 @@
-const env = require("./environment")
-const { DocumentTypes, SEPARATOR } = require("./db/utils")
-
-const APP_PREFIX = DocumentTypes.APP + SEPARATOR
-
-function confirmAppId(possibleAppId) {
- return possibleAppId && possibleAppId.startsWith(APP_PREFIX)
- ? possibleAppId
- : undefined
-}
-
-/**
- * Given a request tries to find the appId, which can be located in various places
- * @param {object} ctx The main request body to look through.
- * @returns {string|undefined} If an appId was found it will be returned.
- */
-exports.getAppId = ctx => {
- const options = [ctx.headers["x-budibase-app-id"], ctx.params.appId]
- if (ctx.subdomains) {
- options.push(ctx.subdomains[1])
- }
- let appId
- for (let option of options) {
- appId = confirmAppId(option)
- if (appId) {
- break
- }
- }
-
- // look in body if can't find it in subdomain
- if (!appId && ctx.request.body && ctx.request.body.appId) {
- appId = confirmAppId(ctx.request.body.appId)
- }
- let appPath =
- ctx.request.headers.referrer ||
- ctx.path.split("/").filter(subPath => subPath.startsWith(APP_PREFIX))
- if (!appId && appPath.length !== 0) {
- appId = confirmAppId(appPath[0])
- }
- return appId
-}
-
-/**
- * Store a cookie for the request, has a hardcoded expiry.
- * @param {object} ctx The request which is to be manipulated.
- * @param {string} name The name of the cookie to set.
- * @param {string|object} value The value of cookie which will be set.
- */
-exports.setCookie = (ctx, value, name = "builder") => {
- const expires = new Date()
- expires.setDate(expires.getDate() + 1)
-
- if (!value) {
- ctx.cookies.set(name)
- } else {
- ctx.cookies.set(name, value, {
- expires,
- path: "/",
- httpOnly: false,
- overwrite: true,
- })
- }
-}
-
-/**
- * Utility function, simply calls setCookie with an empty string for value
- */
-exports.clearCookie = (ctx, name) => {
- exports.setCookie(ctx, "", name)
-}
-
-/**
- * Checks if the API call being made (based on the provided ctx object) is from the client. If
- * the call is not from a client app then it is from the builder.
- * @param {object} ctx The koa context object to be tested.
- * @return {boolean} returns true if the call is from the client lib (a built app rather than the builder).
- */
-exports.isClient = ctx => {
- return ctx.headers["x-budibase-type"] === "client"
-}
From edfda5ca4a6736386189ff4a6d92d45682cc2575 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Thu, 8 Apr 2021 11:53:40 +0100
Subject: [PATCH 022/135] further simplification of jwt auth
---
.../worker/src/middleware/authenticated.js | 22 ++++---------------
1 file changed, 4 insertions(+), 18 deletions(-)
diff --git a/packages/worker/src/middleware/authenticated.js b/packages/worker/src/middleware/authenticated.js
index dd7e1d974..751e10ee9 100644
--- a/packages/worker/src/middleware/authenticated.js
+++ b/packages/worker/src/middleware/authenticated.js
@@ -11,29 +11,15 @@ module.exports = async (ctx, next) => {
appId = cookieAppId
}
- let token
- if (appId) {
- token = ctx.cookies.get(Cookies.Auth)
- }
-
- if (!token) {
- ctx.auth = {
- authenticated: false,
- }
- ctx.appId = appId
- // ctx.user = {
- // // TODO: introduce roles again
- // // role: builtinRoles.PUBLIC,
- // }
- return await next()
- }
-
return passport.authenticate("jwt", async (err, user) => {
if (err) {
- return ctx.throw(err)
+ return ctx.throw(err.status || 403, err)
}
try {
+ ctx.appId = appId
+ ctx.isAuthenticated = true
+ // TODO: introduce roles again
ctx.user = user
await next()
} catch (err) {
From 1306f4cd684d4abd6ca47ddcbe1de4e209fee2fe Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Thu, 8 Apr 2021 11:57:23 +0100
Subject: [PATCH 023/135] move auth controller into it's own dir
---
packages/worker/src/api/controllers/{admin => }/auth.js | 0
packages/worker/src/api/routes/admin/index.js | 3 ---
packages/worker/src/api/routes/auth.js | 8 ++++++++
packages/worker/src/api/routes/index.js | 3 ++-
4 files changed, 10 insertions(+), 4 deletions(-)
rename packages/worker/src/api/controllers/{admin => }/auth.js (100%)
create mode 100644 packages/worker/src/api/routes/auth.js
diff --git a/packages/worker/src/api/controllers/admin/auth.js b/packages/worker/src/api/controllers/auth.js
similarity index 100%
rename from packages/worker/src/api/controllers/admin/auth.js
rename to packages/worker/src/api/controllers/auth.js
diff --git a/packages/worker/src/api/routes/admin/index.js b/packages/worker/src/api/routes/admin/index.js
index 1c64110d2..2c56f67f3 100644
--- a/packages/worker/src/api/routes/admin/index.js
+++ b/packages/worker/src/api/routes/admin/index.js
@@ -1,14 +1,11 @@
const Router = require("@koa/router")
-const passport = require("@budibase/auth")
const controller = require("../../controllers/admin")
-const authController = require("../../controllers/admin/auth")
const authenticated = require("../../../middleware/authenticated")
const router = Router()
router
.post("/api/admin/users", authenticated, controller.userSave)
- .post("/api/admin/authenticate", authController.authenticate)
.delete("/api/admin/users/:email", authenticated, controller.userDelete)
.get("/api/admin/users", authenticated, controller.userFetch)
.get("/api/admin/users/:email", authenticated, controller.userFind)
diff --git a/packages/worker/src/api/routes/auth.js b/packages/worker/src/api/routes/auth.js
new file mode 100644
index 000000000..d40071b77
--- /dev/null
+++ b/packages/worker/src/api/routes/auth.js
@@ -0,0 +1,8 @@
+const Router = require("@koa/router")
+const authController = require("../controllers/auth")
+
+const router = Router()
+
+router.post("/api/auth/authenticate", authController.authenticate)
+
+module.exports = router
diff --git a/packages/worker/src/api/routes/index.js b/packages/worker/src/api/routes/index.js
index 076710b21..c6bacc81e 100644
--- a/packages/worker/src/api/routes/index.js
+++ b/packages/worker/src/api/routes/index.js
@@ -1,4 +1,5 @@
const adminRoutes = require("./admin")
+const authRoutes = require("./auth")
const appRoutes = require("./app")
-exports.routes = [adminRoutes, appRoutes]
+exports.routes = [adminRoutes, authRoutes, appRoutes]
From 792114ef46fb2afd76790bfd817c4afe7cf077f4 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Thu, 8 Apr 2021 16:58:33 +0100
Subject: [PATCH 024/135] First pass of global user configuration through
existing user API with role mappings.
---
hosting/envoy.dev.yaml.hbs | 18 ++
hosting/envoy.yaml | 5 +
packages/auth/src/db/utils.js | 4 +
packages/auth/src/index.js | 3 +-
packages/server/package.json | 1 +
packages/server/src/api/controllers/auth.js | 2 +-
packages/server/src/api/controllers/row.js | 8 +-
packages/server/src/api/controllers/user.js | 170 ++++++++++--------
packages/server/src/api/routes/user.js | 20 +--
.../src/automations/steps/createUser.js | 2 +-
packages/server/src/constants/index.js | 8 +-
packages/server/src/db/utils.js | 6 +-
.../src/tests/utilities/TestConfiguration.js | 6 +-
packages/worker/package.json | 2 +-
packages/worker/src/api/routes/admin/index.js | 19 +-
.../worker/src/middleware/joi-validator.js | 28 +++
packages/worker/yarn.lock | 8 +-
17 files changed, 206 insertions(+), 104 deletions(-)
create mode 100644 packages/worker/src/middleware/joi-validator.js
diff --git a/hosting/envoy.dev.yaml.hbs b/hosting/envoy.dev.yaml.hbs
index f7f642a24..c2795fdb5 100644
--- a/hosting/envoy.dev.yaml.hbs
+++ b/hosting/envoy.dev.yaml.hbs
@@ -26,6 +26,10 @@ static_resources:
cluster: redis-service
prefix_rewrite: "/"
+ - match: { prefix: "/api/admin" }
+ route:
+ cluster: worker-dev
+
- match: { prefix: "/api/" }
route:
cluster: server-dev
@@ -123,3 +127,17 @@ static_resources:
address: {{ address }}
port_value: 3000
+ - name: worker-dev
+ connect_timeout: 0.25s
+ type: strict_dns
+ lb_policy: round_robin
+ load_assignment:
+ cluster_name: worker-dev
+ endpoints:
+ - lb_endpoints:
+ - endpoint:
+ address:
+ socket_address:
+ address: {{ address }}
+ port_value: 4002
+
diff --git a/hosting/envoy.yaml b/hosting/envoy.yaml
index 8c6081d1a..1fbd2070f 100644
--- a/hosting/envoy.yaml
+++ b/hosting/envoy.yaml
@@ -25,6 +25,11 @@ static_resources:
- match: { path: "/" }
route:
cluster: app-service
+
+ # special case for worker admin API
+ - match: { path: "/api/admin" }
+ route:
+ cluster: worker-service
# special case for when API requests are made, can just forward, not to minio
- match: { prefix: "/api/" }
diff --git a/packages/auth/src/db/utils.js b/packages/auth/src/db/utils.js
index 17d09ceae..9b6f5d710 100644
--- a/packages/auth/src/db/utils.js
+++ b/packages/auth/src/db/utils.js
@@ -32,3 +32,7 @@ exports.getUserParams = (email = "", otherProps = {}) => {
endkey: `${DocumentTypes.USER}${SEPARATOR}${email}${UNICODE_MAX}`,
}
}
+
+exports.getEmailFromUserID = id => {
+ return id.split(`${DocumentTypes.USER}${SEPARATOR}`)[1]
+}
\ No newline at end of file
diff --git a/packages/auth/src/index.js b/packages/auth/src/index.js
index 51431e424..b65690b06 100644
--- a/packages/auth/src/index.js
+++ b/packages/auth/src/index.js
@@ -8,7 +8,7 @@ const { jwt, local, google } = require("./middleware")
const { Cookies, UserStatus } = require("./constants")
const { hash, compare } = require("./hashing")
const { getAppId, setCookie } = require("./utils")
-const { generateUserID, getUserParams } = require("./db/utils")
+const { generateUserID, getUserParams, getEmailFromUserID } = require("./db/utils")
// Strategies
passport.use(new LocalStrategy(local.options, local.authenticate))
@@ -36,6 +36,7 @@ module.exports = {
StaticDatabases,
generateUserID,
getUserParams,
+ getEmailFromUserID,
hash,
compare,
getAppId,
diff --git a/packages/server/package.json b/packages/server/package.json
index 42ecbe39e..3ff599798 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -79,6 +79,7 @@
"author": "Budibase",
"license": "AGPL-3.0-or-later",
"dependencies": {
+ "@budibase/auth": "^0.0.1",
"@budibase/client": "^0.8.9",
"@budibase/string-templates": "^0.8.9",
"@elastic/elasticsearch": "7.10.0",
diff --git a/packages/server/src/api/controllers/auth.js b/packages/server/src/api/controllers/auth.js
index 43f787810..da68aa485 100644
--- a/packages/server/src/api/controllers/auth.js
+++ b/packages/server/src/api/controllers/auth.js
@@ -7,7 +7,7 @@ const { generateUserID } = require("../../db/utils")
const { setCookie } = require("../../utilities")
const { outputProcessing } = require("../../utilities/rowProcessor")
const { ViewNames } = require("../../db/utils")
-const { UserStatus } = require("../../constants")
+const { UserStatus } = require("@budibase/auth")
const setBuilderToken = require("../../utilities/builder/setBuilderToken")
const INVALID_ERR = "Invalid Credentials"
diff --git a/packages/server/src/api/controllers/row.js b/packages/server/src/api/controllers/row.js
index 3f531d7e5..1b3e795f8 100644
--- a/packages/server/src/api/controllers/row.js
+++ b/packages/server/src/api/controllers/row.js
@@ -48,7 +48,7 @@ async function findRow(db, appId, tableId, rowId) {
appId,
},
}
- await usersController.find(ctx)
+ await usersController.findMetadata(ctx)
row = ctx.body
} else {
row = await db.get(rowId)
@@ -103,7 +103,7 @@ exports.patch = async function(ctx) {
...row,
password: ctx.request.body.password,
}
- await usersController.update(ctx)
+ await usersController.updateMetadata(ctx)
return
}
@@ -179,7 +179,7 @@ exports.save = async function(ctx) {
if (row.tableId === ViewNames.USERS) {
// the row has been updated, need to put it into the ctx
ctx.request.body = row
- await usersController.create(ctx)
+ await usersController.createMetadata(ctx)
return
}
@@ -310,7 +310,7 @@ exports.fetchTableRows = async function(ctx) {
let rows,
table = await db.get(ctx.params.tableId)
if (ctx.params.tableId === ViewNames.USERS) {
- await usersController.fetch(ctx)
+ await usersController.fetchMetadata(ctx)
rows = ctx.body
} else {
const response = await db.allDocs(
diff --git a/packages/server/src/api/controllers/user.js b/packages/server/src/api/controllers/user.js
index d9a4af971..92b038d05 100644
--- a/packages/server/src/api/controllers/user.js
+++ b/packages/server/src/api/controllers/user.js
@@ -1,109 +1,137 @@
const CouchDB = require("../../db")
-const bcrypt = require("../../utilities/bcrypt")
-const { generateUserID, getUserParams, ViewNames } = require("../../db/utils")
+const {
+ generateUserID,
+ getUserParams,
+ getEmailFromUserID,
+} = require("@budibase/auth")
+const { InternalTables } = require("../../db/utils")
const { getRole } = require("../../utilities/security/roles")
-const { UserStatus } = require("../../constants")
+const { checkSlashesInUrl } = require("../../utilities")
+const env = require("../../environment")
+const fetch = require("node-fetch")
-exports.fetch = async function(ctx) {
+async function deleteGlobalUser(email) {
+ const endpoint = `/api/admin/users/${email}`
+ const reqCfg = { method: "DELETE" }
+ const response = await fetch(
+ checkSlashesInUrl(env.WORKER_URL + endpoint),
+ reqCfg
+ )
+ return response.json()
+}
+
+async function getGlobalUsers(email = null) {
+ const endpoint = email ? `/api/admin/users/${email}` : `/api/admin/users`
+ const reqCfg = { method: "GET" }
+ const response = await fetch(
+ checkSlashesInUrl(env.WORKER_URL + endpoint),
+ reqCfg
+ )
+ return response.json()
+}
+
+async function saveGlobalUser(appId, email, body) {
+ const globalUser = await getGlobalUsers(email)
+ const roles = globalUser.roles || {}
+ if (body.roleId) {
+ roles.appId = body.roleId
+ }
+ const endpoint = `/api/admin/users`
+ const reqCfg = {
+ method: "POST",
+ body: {
+ ...globalUser,
+ email,
+ password: body.password,
+ status: body.status,
+ roles,
+ },
+ }
+
+ const response = await fetch(
+ checkSlashesInUrl(env.WORKER_URL + endpoint),
+ reqCfg
+ )
+ await response.json()
+ delete body.email
+ delete body.password
+ delete body.roleId
+ delete body.status
+ return body
+}
+
+exports.fetchMetadata = async function(ctx) {
const database = new CouchDB(ctx.appId)
- const users = (
+ const global = await getGlobalUsers()
+ const metadata = (
await database.allDocs(
getUserParams(null, {
include_docs: true,
})
)
).rows.map(row => row.doc)
- // user hashed password shouldn't ever be returned
- for (let user of users) {
- delete user.password
+ const users = []
+ for (let user of global) {
+ const info = metadata.find(meta => meta._id.includes(user.email))
+ users.push({
+ ...user,
+ ...info,
+ })
}
ctx.body = users
}
-// TODO: need to replace this with something that purely manages metadata
-exports.create = async function(ctx) {
- const db = new CouchDB(ctx.appId)
- const { email, password, roleId } = ctx.request.body
-
- if (!email || !password) {
- ctx.throw(400, "email and Password Required.")
- }
-
- const role = await getRole(ctx.appId, roleId)
+exports.createMetadata = async function(ctx) {
+ const appId = ctx.appId
+ const db = new CouchDB(appId)
+ const { email, roleId } = ctx.request.body
+ // check role valid
+ const role = await getRole(appId, roleId)
if (!role) ctx.throw(400, "Invalid Role")
- const hashedPassword = await bcrypt.hash(password)
+ const metadata = await saveGlobalUser(appId, email, ctx.request.body)
+
const user = {
- ...ctx.request.body,
- // these must all be after the object spread, make sure
- // any values are overwritten, generateUserID will always
- // generate the same ID for the user as it is not UUID based
+ ...metadata,
_id: generateUserID(email),
type: "user",
- password: hashedPassword,
- tableId: ViewNames.USERS,
- }
- // add the active status to a user if its not provided
- if (user.status == null) {
- user.status = UserStatus.ACTIVE
+ tableId: InternalTables.USER_METADATA,
}
- try {
- const response = await db.post(user)
- ctx.status = 200
- ctx.message = "User created successfully."
- ctx.userId = response.id
- ctx.body = {
- _rev: response.rev,
- email,
- }
- } catch (err) {
- if (err.status === 409) {
- ctx.throw(400, "User exists already")
- } else {
- ctx.throw(err.status, err)
- }
+ const response = await db.post(user)
+ ctx.body = {
+ _rev: response.rev,
+ email,
}
}
-exports.update = async function(ctx) {
- const db = new CouchDB(ctx.appId)
+exports.updateMetadata = async function(ctx) {
+ const appId = ctx.appId
+ const db = new CouchDB(appId)
const user = ctx.request.body
- let dbUser
- if (user.email && !user._id) {
- user._id = generateUserID(user.email)
- }
- // get user incase password removed
- if (user._id) {
- dbUser = await db.get(user._id)
- }
- if (user.password) {
- user.password = await bcrypt.hash(user.password)
- } else {
- delete user.password
- }
+ let email = user.email || getEmailFromUserID(user._id)
+ const metadata = await saveGlobalUser(appId, email, ctx.request.body)
- const response = await db.put({
- password: dbUser.password,
- ...user,
+ if (!metadata._id) {
+ user._id = generateUserID(email)
+ }
+ ctx.body = await db.put({
+ ...metadata,
})
- user._rev = response.rev
-
- ctx.status = 200
- ctx.body = response
}
-exports.destroy = async function(ctx) {
- const database = new CouchDB(ctx.appId)
- await database.destroy(generateUserID(ctx.params.email))
+exports.destroyMetadata = async function(ctx) {
+ const db = new CouchDB(ctx.appId)
+ const email = ctx.params.email
+ await deleteGlobalUser(email)
+ await db.destroy(generateUserID(email))
ctx.body = {
message: `User ${ctx.params.email} deleted.`,
}
- ctx.status = 200
}
-exports.find = async function(ctx) {
+exports.findMetadata = async function(ctx) {
const database = new CouchDB(ctx.appId)
let lookup = ctx.params.email
? generateUserID(ctx.params.email)
diff --git a/packages/server/src/api/routes/user.js b/packages/server/src/api/routes/user.js
index cdaab0cc5..b0450b72c 100644
--- a/packages/server/src/api/routes/user.js
+++ b/packages/server/src/api/routes/user.js
@@ -11,31 +11,31 @@ const router = Router()
router
.get(
- "/api/users",
+ "/api/users/metadata",
authorized(PermissionTypes.USER, PermissionLevels.READ),
- controller.fetch
+ controller.fetchMetadata
)
.get(
- "/api/users/:email",
+ "/api/users/metadata/:email",
authorized(PermissionTypes.USER, PermissionLevels.READ),
- controller.find
+ controller.findMetadata
)
.put(
- "/api/users",
+ "/api/users/metadata",
authorized(PermissionTypes.USER, PermissionLevels.WRITE),
- controller.update
+ controller.updateMetadata
)
.post(
- "/api/users",
+ "/api/users/metadata",
authorized(PermissionTypes.USER, PermissionLevels.WRITE),
usage,
- controller.create
+ controller.createMetadata
)
.delete(
- "/api/users/:email",
+ "/api/users/metadata/:email",
authorized(PermissionTypes.USER, PermissionLevels.WRITE),
usage,
- controller.destroy
+ controller.destroyMetadata
)
module.exports = router
diff --git a/packages/server/src/automations/steps/createUser.js b/packages/server/src/automations/steps/createUser.js
index 147a3f786..8849415c5 100644
--- a/packages/server/src/automations/steps/createUser.js
+++ b/packages/server/src/automations/steps/createUser.js
@@ -75,7 +75,7 @@ module.exports.run = async function({ inputs, appId, apiKey, emitter }) {
if (env.isProd()) {
await usage.update(apiKey, usage.Properties.USER, 1)
}
- await userController.create(ctx)
+ await userController.createMetadata(ctx)
return {
response: ctx.body,
// internal property not returned through the API
diff --git a/packages/server/src/constants/index.js b/packages/server/src/constants/index.js
index 1e8ebb272..940c1100d 100644
--- a/packages/server/src/constants/index.js
+++ b/packages/server/src/constants/index.js
@@ -1,4 +1,5 @@
const { BUILTIN_ROLE_IDS } = require("../utilities/security/roles")
+const { UserStatus } = require("@budibase/auth")
exports.LOGO_URL =
"https://d33wubrfki0l68.cloudfront.net/aac32159d7207b5085e74a7ef67afbb7027786c5/2b1fd/img/logo/bb-emblem.svg"
@@ -27,11 +28,6 @@ exports.AuthTypes = {
EXTERNAL: "external",
}
-exports.UserStatus = {
- ACTIVE: "active",
- INACTIVE: "inactive",
-}
-
exports.USERS_TABLE_SCHEMA = {
_id: "ta_users",
type: "table",
@@ -68,7 +64,7 @@ exports.USERS_TABLE_SCHEMA = {
constraints: {
type: exports.FieldTypes.STRING,
presence: false,
- inclusion: Object.values(exports.UserStatus),
+ inclusion: Object.values(UserStatus),
},
},
},
diff --git a/packages/server/src/db/utils.js b/packages/server/src/db/utils.js
index 4c31f0398..8623b99f2 100644
--- a/packages/server/src/db/utils.js
+++ b/packages/server/src/db/utils.js
@@ -34,7 +34,10 @@ const DocumentTypes = {
const ViewNames = {
LINK: "by_link",
ROUTING: "screen_routes",
- USERS: "ta_users",
+}
+
+const InternalTables = {
+ USER_METADATA: "ta_users",
}
const SearchIndexes = {
@@ -43,6 +46,7 @@ const SearchIndexes = {
exports.StaticDatabases = StaticDatabases
exports.ViewNames = ViewNames
+exports.InternalTables = InternalTables
exports.DocumentTypes = DocumentTypes
exports.SEPARATOR = SEPARATOR
exports.UNICODE_MAX = UNICODE_MAX
diff --git a/packages/server/src/tests/utilities/TestConfiguration.js b/packages/server/src/tests/utilities/TestConfiguration.js
index 433cec4a0..002cf4d00 100644
--- a/packages/server/src/tests/utilities/TestConfiguration.js
+++ b/packages/server/src/tests/utilities/TestConfiguration.js
@@ -279,7 +279,7 @@ class TestConfiguration {
roleId,
},
null,
- controllers.user.create
+ controllers.user.createMetadata
)
}
@@ -289,7 +289,7 @@ class TestConfiguration {
{
email,
},
- controllers.user.find
+ controllers.user.findMetadata
)
return this._req(
{
@@ -297,7 +297,7 @@ class TestConfiguration {
status: "inactive",
},
null,
- controllers.user.update
+ controllers.user.updateMetadata
)
}
diff --git a/packages/worker/package.json b/packages/worker/package.json
index 5ab414dab..37b743506 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -25,7 +25,7 @@
"bcryptjs": "^2.4.3",
"dotenv": "^8.2.0",
"got": "^11.8.1",
- "joi": "^17.2.1",
+ "joi": "^17.4.0",
"koa": "^2.7.0",
"koa-body": "^4.2.0",
"koa-compress": "^4.0.1",
diff --git a/packages/worker/src/api/routes/admin/index.js b/packages/worker/src/api/routes/admin/index.js
index 1c64110d2..97924ce7c 100644
--- a/packages/worker/src/api/routes/admin/index.js
+++ b/packages/worker/src/api/routes/admin/index.js
@@ -3,11 +3,28 @@ const passport = require("@budibase/auth")
const controller = require("../../controllers/admin")
const authController = require("../../controllers/admin/auth")
const authenticated = require("../../../middleware/authenticated")
+const joiValidator = require("../../../middleware/joi-validator")
+const Joi = require("joi")
const router = Router()
+function buildUserSaveValidation() {
+ // prettier-ignore
+ return joiValidator.body(Joi.object({
+ _id: Joi.string(),
+ _rev: Joi.string(),
+ email: Joi.string(),
+ password: Joi.string(),
+ // maps appId -> roleId for the user
+ roles: Joi.object()
+ .pattern(/.*/, Joi.string())
+ .required()
+ .unknown(true)
+ }).required().unknown(true))
+}
+
router
- .post("/api/admin/users", authenticated, controller.userSave)
+ .post("/api/admin/users", buildUserSaveValidation(), authenticated, controller.userSave)
.post("/api/admin/authenticate", authController.authenticate)
.delete("/api/admin/users/:email", authenticated, controller.userDelete)
.get("/api/admin/users", authenticated, controller.userFetch)
diff --git a/packages/worker/src/middleware/joi-validator.js b/packages/worker/src/middleware/joi-validator.js
new file mode 100644
index 000000000..1686b0e72
--- /dev/null
+++ b/packages/worker/src/middleware/joi-validator.js
@@ -0,0 +1,28 @@
+function validate(schema, property) {
+ // Return a Koa middleware function
+ return (ctx, next) => {
+ if (!schema) {
+ return next()
+ }
+ let params = null
+ if (ctx[property] != null) {
+ params = ctx[property]
+ } else if (ctx.request[property] != null) {
+ params = ctx.request[property]
+ }
+ const { error } = schema.validate(params)
+ if (error) {
+ ctx.throw(400, `Invalid ${property} - ${error.message}`)
+ return
+ }
+ return next()
+ }
+}
+
+module.exports.body = schema => {
+ return validate(schema, "body")
+}
+
+module.exports.params = schema => {
+ return validate(schema, "params")
+}
diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock
index df8965f51..6515c5967 100644
--- a/packages/worker/yarn.lock
+++ b/packages/worker/yarn.lock
@@ -1261,10 +1261,10 @@ jmespath@0.15.0, jmespath@^0.15.0:
resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217"
integrity sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=
-joi@^17.2.1:
- version "17.3.0"
- resolved "https://registry.yarnpkg.com/joi/-/joi-17.3.0.tgz#f1be4a6ce29bc1716665819ac361dfa139fff5d2"
- integrity sha512-Qh5gdU6niuYbUIUV5ejbsMiiFmBdw8Kcp8Buj2JntszCkCfxJ9Cz76OtHxOZMPXrt5810iDIXs+n1nNVoquHgg==
+joi@^17.4.0:
+ version "17.4.0"
+ resolved "https://registry.yarnpkg.com/joi/-/joi-17.4.0.tgz#b5c2277c8519e016316e49ababd41a1908d9ef20"
+ integrity sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==
dependencies:
"@hapi/hoek" "^9.0.0"
"@hapi/topo" "^5.0.0"
From 13c368109e733984cc110120f2cd0b09791c1229 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Thu, 8 Apr 2021 17:39:46 +0100
Subject: [PATCH 025/135] Some changes after trying system for first time.
---
hosting/docker-compose.yaml | 1 +
hosting/envoy.dev.yaml.hbs | 4 ++++
packages/server/scripts/dev/manage.js | 3 ---
packages/server/src/app.js | 3 ++-
packages/worker/scripts/dev/manage.js | 4 +---
packages/worker/src/index.js | 3 ++-
6 files changed, 10 insertions(+), 8 deletions(-)
diff --git a/hosting/docker-compose.yaml b/hosting/docker-compose.yaml
index 49f8cddcc..5e21cc9ef 100644
--- a/hosting/docker-compose.yaml
+++ b/hosting/docker-compose.yaml
@@ -35,6 +35,7 @@ services:
environment:
SELF_HOSTED: 1
PORT: 4003
+ JWT_SECRET: ${JWT_SECRET}
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY}
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY}
MINIO_URL: http://minio-service:9000
diff --git a/hosting/envoy.dev.yaml.hbs b/hosting/envoy.dev.yaml.hbs
index c2795fdb5..40cfc551e 100644
--- a/hosting/envoy.dev.yaml.hbs
+++ b/hosting/envoy.dev.yaml.hbs
@@ -46,6 +46,10 @@ static_resources:
route:
cluster: builder-dev
prefix_rewrite: "/builder/"
+
+ # special case in dev to redirect no path to builder
+ - match: { path: "/" }
+ redirect: { path_redirect: "/builder/" }
# minio is on the default route because this works
# best, minio + AWS SDK doesn't handle path proxy
diff --git a/packages/server/scripts/dev/manage.js b/packages/server/scripts/dev/manage.js
index 7a318ff6f..20037c7e3 100644
--- a/packages/server/scripts/dev/manage.js
+++ b/packages/server/scripts/dev/manage.js
@@ -33,9 +33,6 @@ async function init() {
fs.writeFileSync(envoyOutputPath, processStringSync(contents, config))
const envFilePath = path.join(process.cwd(), ".env")
- if (fs.existsSync(envFilePath)) {
- return
- }
const envFileJson = {
PORT: 4001,
MINIO_URL: "http://localhost:10000/",
diff --git a/packages/server/src/app.js b/packages/server/src/app.js
index e5e9b7708..88776fada 100644
--- a/packages/server/src/app.js
+++ b/packages/server/src/app.js
@@ -1,3 +1,5 @@
+// need to load environment first
+const env = require("./environment")
const Koa = require("koa")
const destroyable = require("server-destroy")
const electron = require("electron")
@@ -5,7 +7,6 @@ const koaBody = require("koa-body")
const logger = require("koa-pino-logger")
const http = require("http")
const api = require("./api")
-const env = require("./environment")
const eventEmitter = require("./events")
const automations = require("./automations/index")
const Sentry = require("@sentry/node")
diff --git a/packages/worker/scripts/dev/manage.js b/packages/worker/scripts/dev/manage.js
index b7e92f6d1..f363bd05a 100644
--- a/packages/worker/scripts/dev/manage.js
+++ b/packages/worker/scripts/dev/manage.js
@@ -4,12 +4,10 @@ const fs = require("fs")
async function init() {
const envFilePath = path.join(process.cwd(), ".env")
- if (fs.existsSync(envFilePath)) {
- return
- }
const envFileJson = {
SELF_HOSTED: 1,
PORT: 4002,
+ JWT_SECRET: "testsecret",
MINIO_ACCESS_KEY: "budibase",
MINIO_SECRET_KEY: "budibase",
COUCH_DB_USER: "budibase",
diff --git a/packages/worker/src/index.js b/packages/worker/src/index.js
index 2e031b9f6..55f2705ed 100644
--- a/packages/worker/src/index.js
+++ b/packages/worker/src/index.js
@@ -1,3 +1,5 @@
+// need to load environment first
+const env = require("./environment")
const Koa = require("koa")
const destroyable = require("server-destroy")
const koaBody = require("koa-body")
@@ -5,7 +7,6 @@ const { passport } = require("@budibase/auth")
const logger = require("koa-pino-logger")
const http = require("http")
const api = require("./api")
-const env = require("./environment")
const app = new Koa()
From 5cf3740fea42a9a69576ddfaa2f2c8e5eb0d5d03 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Thu, 8 Apr 2021 18:18:53 +0100
Subject: [PATCH 026/135] Making sure volumes are removed when nuking.
---
packages/server/scripts/dev/manage.js | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/packages/server/scripts/dev/manage.js b/packages/server/scripts/dev/manage.js
index 20037c7e3..4e170d1c6 100644
--- a/packages/server/scripts/dev/manage.js
+++ b/packages/server/scripts/dev/manage.js
@@ -67,7 +67,11 @@ async function nuke() {
console.log(
"Clearing down your budibase dev environment, including all containers and volumes... 💥"
)
- await compose.down(CONFIG)
+ await compose.down({
+ ...CONFIG,
+ // stop containers, delete volumes
+ commandOptions: ["-v", "--remove-orphans"],
+ })
}
const managementCommand = process.argv.slice(2)[0]
From 164ef9a22ed12ada6198836b9bae2261c4bcf00e Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Fri, 9 Apr 2021 15:11:49 +0100
Subject: [PATCH 027/135] Global users now working through the server, all
requests proxied.
---
package.json | 2 +-
packages/auth/src/db/utils.js | 7 +-
.../src/components/backend/DataTable/api.js | 5 +-
.../components/start/CreateAppModal.svelte | 2 +-
.../server/src/api/controllers/application.js | 2 +-
packages/server/src/api/controllers/auth.js | 4 +-
.../server/src/api/controllers/hosting.js | 2 +-
packages/server/src/api/controllers/role.js | 4 +-
packages/server/src/api/controllers/row.js | 18 +--
.../src/api/controllers/static/index.js | 2 +-
packages/server/src/api/controllers/user.js | 98 ++++-----------
packages/server/src/db/utils.js | 21 +++-
.../server/src/utilities/builder/hosting.js | 29 +----
.../server/src/utilities/workerRequests.js | 116 ++++++++++++++++++
.../worker/src/api/controllers/admin/index.js | 31 +++--
packages/worker/src/api/routes/app.js | 4 +-
.../worker/src/middleware/authenticated.js | 32 ++---
17 files changed, 219 insertions(+), 160 deletions(-)
create mode 100644 packages/server/src/utilities/workerRequests.js
diff --git a/package.json b/package.json
index b2f572d20..a4b0993fd 100644
--- a/package.json
+++ b/package.json
@@ -29,7 +29,7 @@
"clean": "lerna clean",
"kill-port": "kill-port 4001",
"dev": "yarn run kill-port && lerna link && lerna run --parallel dev:builder --concurrency 1",
- "dev:noserver": "lerna link && lerna run --parallel dev:builder --concurrency 1 --ignore @budibase/server",
+ "dev:noserver": "lerna link && lerna run dev:stack:up && lerna run --parallel dev:builder --concurrency 1 --ignore @budibase/server --ignore @budibase/worker",
"test": "lerna run test",
"lint": "eslint packages",
"lint:fix": "eslint --fix packages",
diff --git a/packages/auth/src/db/utils.js b/packages/auth/src/db/utils.js
index 9b6f5d710..871423df0 100644
--- a/packages/auth/src/db/utils.js
+++ b/packages/auth/src/db/utils.js
@@ -26,13 +26,12 @@ exports.generateUserID = email => {
* Gets parameters for retrieving users, this is a utility function for the getDocParams function.
*/
exports.getUserParams = (email = "", otherProps = {}) => {
+ if (!email) {
+ email = ""
+ }
return {
...otherProps,
startkey: `${DocumentTypes.USER}${SEPARATOR}${email}`,
endkey: `${DocumentTypes.USER}${SEPARATOR}${email}${UNICODE_MAX}`,
}
}
-
-exports.getEmailFromUserID = id => {
- return id.split(`${DocumentTypes.USER}${SEPARATOR}`)[1]
-}
\ No newline at end of file
diff --git a/packages/builder/src/components/backend/DataTable/api.js b/packages/builder/src/components/backend/DataTable/api.js
index 91ebc19b2..43c685654 100644
--- a/packages/builder/src/components/backend/DataTable/api.js
+++ b/packages/builder/src/components/backend/DataTable/api.js
@@ -1,7 +1,7 @@
import api from "builderStore/api"
export async function createUser(user) {
- const CREATE_USER_URL = `/api/users`
+ const CREATE_USER_URL = `/api/users/metadata`
const response = await api.post(CREATE_USER_URL, user)
return await response.json()
}
@@ -15,8 +15,7 @@ export async function saveRow(row, tableId) {
export async function deleteRow(row) {
const DELETE_ROWS_URL = `/api/${row.tableId}/rows/${row._id}/${row._rev}`
- const response = await api.delete(DELETE_ROWS_URL)
- return response
+ return api.delete(DELETE_ROWS_URL)
}
export async function fetchDataForView(view) {
diff --git a/packages/builder/src/components/start/CreateAppModal.svelte b/packages/builder/src/components/start/CreateAppModal.svelte
index babe7bd0d..c727283b2 100644
--- a/packages/builder/src/components/start/CreateAppModal.svelte
+++ b/packages/builder/src/components/start/CreateAppModal.svelte
@@ -157,7 +157,7 @@
password: $createAppStore.values.password,
roleId: $createAppStore.values.roleId,
}
- const userResp = await api.post(`/api/users`, user)
+ const userResp = await api.post(`/api/users/metadata`, user)
const json = await userResp.json()
$goto(`./${appJson._id}`)
} catch (error) {
diff --git a/packages/server/src/api/controllers/application.js b/packages/server/src/api/controllers/application.js
index cacde4bb0..042474c5b 100644
--- a/packages/server/src/api/controllers/application.js
+++ b/packages/server/src/api/controllers/application.js
@@ -74,7 +74,7 @@ async function getAppUrlIfNotInUse(ctx) {
if (!env.SELF_HOSTED) {
return url
}
- const deployedApps = await getDeployedApps()
+ const deployedApps = await getDeployedApps(ctx)
if (
deployedApps[url] != null &&
deployedApps[url].appId !== ctx.params.appId
diff --git a/packages/server/src/api/controllers/auth.js b/packages/server/src/api/controllers/auth.js
index da68aa485..6e662f7b9 100644
--- a/packages/server/src/api/controllers/auth.js
+++ b/packages/server/src/api/controllers/auth.js
@@ -3,7 +3,7 @@ const CouchDB = require("../../db")
const bcrypt = require("../../utilities/bcrypt")
const env = require("../../environment")
const { getAPIKey } = require("../../utilities/usageQuota")
-const { generateUserID } = require("../../db/utils")
+const { generateUserMetadataID } = require("../../db/utils")
const { setCookie } = require("../../utilities")
const { outputProcessing } = require("../../utilities/rowProcessor")
const { ViewNames } = require("../../db/utils")
@@ -27,7 +27,7 @@ exports.authenticate = async ctx => {
let dbUser
try {
- dbUser = await db.get(generateUserID(email))
+ dbUser = await db.get(generateUserMetadataID(email))
} catch (_) {
// do not want to throw a 404 - as this could be
// used to determine valid emails
diff --git a/packages/server/src/api/controllers/hosting.js b/packages/server/src/api/controllers/hosting.js
index 4b070cf75..8b7b31e00 100644
--- a/packages/server/src/api/controllers/hosting.js
+++ b/packages/server/src/api/controllers/hosting.js
@@ -40,5 +40,5 @@ exports.fetchUrls = async ctx => {
}
exports.getDeployedApps = async ctx => {
- ctx.body = await getDeployedApps()
+ ctx.body = await getDeployedApps(ctx)
}
diff --git a/packages/server/src/api/controllers/role.js b/packages/server/src/api/controllers/role.js
index 11f81c121..d27272a21 100644
--- a/packages/server/src/api/controllers/role.js
+++ b/packages/server/src/api/controllers/role.js
@@ -10,7 +10,7 @@ const {
const {
generateRoleID,
getRoleParams,
- getUserParams,
+ getUserMetadataParams,
ViewNames,
} = require("../../db/utils")
@@ -112,7 +112,7 @@ exports.destroy = async function(ctx) {
// first check no users actively attached to role
const users = (
await db.allDocs(
- getUserParams(null, {
+ getUserMetadataParams(null, {
include_docs: true,
})
)
diff --git a/packages/server/src/api/controllers/row.js b/packages/server/src/api/controllers/row.js
index 1b3e795f8..8b4a461d2 100644
--- a/packages/server/src/api/controllers/row.js
+++ b/packages/server/src/api/controllers/row.js
@@ -6,8 +6,8 @@ const {
generateRowID,
DocumentTypes,
SEPARATOR,
- ViewNames,
- generateUserID,
+ InternalTables,
+ generateUserMetadataID,
} = require("../../db/utils")
const usersController = require("./user")
const {
@@ -39,7 +39,7 @@ validateJs.extend(validateJs.validators.datetime, {
async function findRow(db, appId, tableId, rowId) {
let row
- if (tableId === ViewNames.USERS) {
+ if (tableId === InternalTables.USER_METADATA) {
let ctx = {
params: {
userId: rowId,
@@ -97,7 +97,7 @@ exports.patch = async function(ctx) {
})
// Creation of a new user goes to the user controller
- if (row.tableId === ViewNames.USERS) {
+ if (row.tableId === InternalTables.USER_METADATA) {
// the row has been updated, need to put it into the ctx
ctx.request.body = {
...row,
@@ -142,8 +142,8 @@ exports.save = async function(ctx) {
}
if (!inputs._rev && !inputs._id) {
- if (inputs.tableId === ViewNames.USERS) {
- inputs._id = generateUserID(inputs.email)
+ if (inputs.tableId === InternalTables.USER_METADATA) {
+ inputs._id = generateUserMetadataID(inputs.email)
} else {
inputs._id = generateRowID(inputs.tableId)
}
@@ -176,7 +176,7 @@ exports.save = async function(ctx) {
})
// Creation of a new user goes to the user controller
- if (row.tableId === ViewNames.USERS) {
+ if (row.tableId === InternalTables.USER_METADATA) {
// the row has been updated, need to put it into the ctx
ctx.request.body = row
await usersController.createMetadata(ctx)
@@ -289,7 +289,7 @@ exports.search = async function(ctx) {
const response = await search(searchString)
// delete passwords from users
- if (tableId === ViewNames.USERS) {
+ if (tableId === InternalTables.USER_METADATA) {
for (let row of response.rows) {
delete row.password
}
@@ -309,7 +309,7 @@ exports.fetchTableRows = async function(ctx) {
// special case for users, fetch through the user controller
let rows,
table = await db.get(ctx.params.tableId)
- if (ctx.params.tableId === ViewNames.USERS) {
+ if (ctx.params.tableId === InternalTables.USER_METADATA) {
await usersController.fetchMetadata(ctx)
rows = ctx.body
} else {
diff --git a/packages/server/src/api/controllers/static/index.js b/packages/server/src/api/controllers/static/index.js
index 69a12d573..71e20923a 100644
--- a/packages/server/src/api/controllers/static/index.js
+++ b/packages/server/src/api/controllers/static/index.js
@@ -22,7 +22,7 @@ const { objectStoreUrl, clientLibraryPath } = require("../../../utilities")
async function checkForSelfHostedURL(ctx) {
// the "appId" component of the URL may actually be a specific self hosted URL
let possibleAppUrl = `/${encodeURI(ctx.params.appId).toLowerCase()}`
- const apps = await getDeployedApps()
+ const apps = await getDeployedApps(ctx)
if (apps[possibleAppUrl] && apps[possibleAppUrl].appId) {
return apps[possibleAppUrl].appId
} else {
diff --git a/packages/server/src/api/controllers/user.js b/packages/server/src/api/controllers/user.js
index 92b038d05..c526050cd 100644
--- a/packages/server/src/api/controllers/user.js
+++ b/packages/server/src/api/controllers/user.js
@@ -1,71 +1,23 @@
const CouchDB = require("../../db")
const {
- generateUserID,
- getUserParams,
- getEmailFromUserID,
-} = require("@budibase/auth")
+ generateUserMetadataID,
+ getUserMetadataParams,
+ getEmailFromUserMetadataID,
+} = require("../../db/utils")
const { InternalTables } = require("../../db/utils")
const { getRole } = require("../../utilities/security/roles")
-const { checkSlashesInUrl } = require("../../utilities")
-const env = require("../../environment")
-const fetch = require("node-fetch")
-
-async function deleteGlobalUser(email) {
- const endpoint = `/api/admin/users/${email}`
- const reqCfg = { method: "DELETE" }
- const response = await fetch(
- checkSlashesInUrl(env.WORKER_URL + endpoint),
- reqCfg
- )
- return response.json()
-}
-
-async function getGlobalUsers(email = null) {
- const endpoint = email ? `/api/admin/users/${email}` : `/api/admin/users`
- const reqCfg = { method: "GET" }
- const response = await fetch(
- checkSlashesInUrl(env.WORKER_URL + endpoint),
- reqCfg
- )
- return response.json()
-}
-
-async function saveGlobalUser(appId, email, body) {
- const globalUser = await getGlobalUsers(email)
- const roles = globalUser.roles || {}
- if (body.roleId) {
- roles.appId = body.roleId
- }
- const endpoint = `/api/admin/users`
- const reqCfg = {
- method: "POST",
- body: {
- ...globalUser,
- email,
- password: body.password,
- status: body.status,
- roles,
- },
- }
-
- const response = await fetch(
- checkSlashesInUrl(env.WORKER_URL + endpoint),
- reqCfg
- )
- await response.json()
- delete body.email
- delete body.password
- delete body.roleId
- delete body.status
- return body
-}
+const {
+ getGlobalUsers,
+ saveGlobalUser,
+ deleteGlobalUser,
+} = require("../../utilities/workerRequests")
exports.fetchMetadata = async function(ctx) {
const database = new CouchDB(ctx.appId)
- const global = await getGlobalUsers()
+ const global = await getGlobalUsers(ctx, ctx.appId)
const metadata = (
await database.allDocs(
- getUserParams(null, {
+ getUserMetadataParams(null, {
include_docs: true,
})
)
@@ -90,11 +42,11 @@ exports.createMetadata = async function(ctx) {
const role = await getRole(appId, roleId)
if (!role) ctx.throw(400, "Invalid Role")
- const metadata = await saveGlobalUser(appId, email, ctx.request.body)
+ const metadata = await saveGlobalUser(ctx, appId, email, ctx.request.body)
const user = {
...metadata,
- _id: generateUserID(email),
+ _id: generateUserMetadataID(email),
type: "user",
tableId: InternalTables.USER_METADATA,
}
@@ -110,11 +62,11 @@ exports.updateMetadata = async function(ctx) {
const appId = ctx.appId
const db = new CouchDB(appId)
const user = ctx.request.body
- let email = user.email || getEmailFromUserID(user._id)
- const metadata = await saveGlobalUser(appId, email, ctx.request.body)
+ let email = user.email || getEmailFromUserMetadataID(user._id)
+ const metadata = await saveGlobalUser(ctx, appId, email, ctx.request.body)
if (!metadata._id) {
- user._id = generateUserID(email)
+ user._id = generateUserMetadataID(email)
}
ctx.body = await db.put({
...metadata,
@@ -124,8 +76,8 @@ exports.updateMetadata = async function(ctx) {
exports.destroyMetadata = async function(ctx) {
const db = new CouchDB(ctx.appId)
const email = ctx.params.email
- await deleteGlobalUser(email)
- await db.destroy(generateUserID(email))
+ await deleteGlobalUser(ctx, email)
+ await db.destroy(generateUserMetadataID(email))
ctx.body = {
message: `User ${ctx.params.email} deleted.`,
}
@@ -133,12 +85,12 @@ exports.destroyMetadata = async function(ctx) {
exports.findMetadata = async function(ctx) {
const database = new CouchDB(ctx.appId)
- let lookup = ctx.params.email
- ? generateUserID(ctx.params.email)
- : ctx.params.userId
- const user = await database.get(lookup)
- if (user) {
- delete user.password
+ const email =
+ ctx.params.email || getEmailFromUserMetadataID(ctx.params.userId)
+ const global = await getGlobalUsers(ctx, ctx.appId, email)
+ const user = await database.get(generateUserMetadataID(email))
+ ctx.body = {
+ ...global,
+ ...user,
}
- ctx.body = user
}
diff --git a/packages/server/src/db/utils.js b/packages/server/src/db/utils.js
index 8623b99f2..63d4e30d6 100644
--- a/packages/server/src/db/utils.js
+++ b/packages/server/src/db/utils.js
@@ -116,16 +116,18 @@ exports.getRowParams = (tableId = null, rowId = null, otherProps = {}) => {
/**
* Gets a new row ID for the specified table.
* @param {string} tableId The table which the row is being created for.
+ * @param {string|null} id If an ID is to be used then the UUID can be substituted for this.
* @returns {string} The new ID which a row doc can be stored under.
*/
-exports.generateRowID = tableId => {
- return `${DocumentTypes.ROW}${SEPARATOR}${tableId}${SEPARATOR}${newid()}`
+exports.generateRowID = (tableId, id = null) => {
+ id = id || newid()
+ return `${DocumentTypes.ROW}${SEPARATOR}${tableId}${SEPARATOR}${id}`
}
/**
* Gets parameters for retrieving users, this is a utility function for the getDocParams function.
*/
-exports.getUserParams = (email = "", otherProps = {}) => {
+exports.getUserMetadataParams = (email = "", otherProps = {}) => {
return exports.getRowParams(ViewNames.USERS, email, otherProps)
}
@@ -134,8 +136,17 @@ exports.getUserParams = (email = "", otherProps = {}) => {
* @param {string} email The email which the ID is going to be built up of.
* @returns {string} The new user ID which the user doc can be stored under.
*/
-exports.generateUserID = email => {
- return `${DocumentTypes.ROW}${SEPARATOR}${ViewNames.USERS}${SEPARATOR}${DocumentTypes.USER}${SEPARATOR}${email}`
+exports.generateUserMetadataID = email => {
+ return exports.generateRowID(InternalTables.USER_METADATA, email)
+}
+
+/**
+ * Breaks up the ID to get the email address back out of it.
+ */
+exports.getEmailFromUserMetadataID = id => {
+ return id.split(
+ `${DocumentTypes.ROW}${SEPARATOR}${InternalTables.USER_METADATA}${SEPARATOR}`
+ )[1]
}
/**
diff --git a/packages/server/src/utilities/builder/hosting.js b/packages/server/src/utilities/builder/hosting.js
index f852cefec..328e98ee9 100644
--- a/packages/server/src/utilities/builder/hosting.js
+++ b/packages/server/src/utilities/builder/hosting.js
@@ -2,6 +2,7 @@ const CouchDB = require("../../db")
const { StaticDatabases } = require("../../db/utils")
const fetch = require("node-fetch")
const env = require("../../environment")
+const { getDeployedApps } = require("../../utilities/workerRequests")
const PROD_HOSTING_URL = "app.budi.live"
@@ -84,30 +85,4 @@ exports.getTemplatesUrl = async (appId, type, name) => {
return `${protocol}${hostingInfo.templatesUrl}/${path}`
}
-exports.getDeployedApps = async () => {
- if (!env.SELF_HOSTED) {
- throw "Can only check apps for self hosted environments"
- }
- const workerUrl = env.WORKER_URL
- const hostingKey = env.HOSTING_KEY
- try {
- const response = await fetch(`${workerUrl}/api/apps`, {
- method: "GET",
- headers: {
- "x-budibase-auth": hostingKey,
- },
- })
- const json = await response.json()
- const apps = {}
- for (let [key, value] of Object.entries(json)) {
- if (value.url) {
- value.url = value.url.toLowerCase()
- apps[key] = value
- }
- }
- return apps
- } catch (err) {
- // error, cannot determine deployed apps, don't stop app creation - sort this later
- return {}
- }
-}
+exports.getDeployedApps = getDeployedApps
diff --git a/packages/server/src/utilities/workerRequests.js b/packages/server/src/utilities/workerRequests.js
new file mode 100644
index 000000000..f3bf97125
--- /dev/null
+++ b/packages/server/src/utilities/workerRequests.js
@@ -0,0 +1,116 @@
+const fetch = require("node-fetch")
+const env = require("../environment")
+const { checkSlashesInUrl } = require("./index")
+const { BUILTIN_ROLE_IDS } = require("./security/roles")
+
+function getAppRole(appId, user) {
+ if (!user.roles) {
+ return user
+ }
+ user.roleId = user.roles[appId]
+ if (!user.roleId) {
+ user.roleId = BUILTIN_ROLE_IDS.PUBLIC
+ }
+ delete user.roles
+ return user
+}
+
+function prepRequest(ctx, request) {
+ if (!request.headers) {
+ request.headers = {}
+ }
+ if (request.body) {
+ request.headers["Content-Type"] = "application/json"
+ request.body =
+ typeof request.body === "object"
+ ? JSON.stringify(request.body)
+ : request.body
+ }
+ request.headers.cookie = ctx.headers.cookie
+ return request
+}
+
+exports.getDeployedApps = async ctx => {
+ if (!env.SELF_HOSTED) {
+ throw "Can only check apps for self hosted environments"
+ }
+ try {
+ const response = await fetch(
+ checkSlashesInUrl(env.WORKER_URL + `/api/apps`),
+ prepRequest(ctx, {
+ method: "GET",
+ })
+ )
+ const json = await response.json()
+ const apps = {}
+ for (let [key, value] of Object.entries(json)) {
+ if (value.url) {
+ value.url = value.url.toLowerCase()
+ apps[key] = value
+ }
+ }
+ return apps
+ } catch (err) {
+ // error, cannot determine deployed apps, don't stop app creation - sort this later
+ return {}
+ }
+}
+
+exports.deleteGlobalUser = async (ctx, email) => {
+ const endpoint = `/api/admin/users/${email}`
+ const reqCfg = { method: "DELETE" }
+ const response = await fetch(
+ checkSlashesInUrl(env.WORKER_URL + endpoint),
+ prepRequest(ctx, reqCfg)
+ )
+ return response.json()
+}
+
+exports.getGlobalUsers = async (ctx, appId, email = null) => {
+ const endpoint = email ? `/api/admin/users/${email}` : `/api/admin/users`
+ const reqCfg = { method: "GET" }
+ const response = await fetch(
+ checkSlashesInUrl(env.WORKER_URL + endpoint),
+ prepRequest(ctx, reqCfg)
+ )
+ let users = await response.json()
+ if (Array.isArray(users)) {
+ users = users.map(user => getAppRole(appId, user))
+ } else {
+ users = getAppRole(appId, users)
+ }
+ return users
+}
+
+exports.saveGlobalUser = async (ctx, appId, email, body) => {
+ const globalUser = await exports.getGlobalUsers(ctx, appId, email)
+ const roles = globalUser.roles || {}
+ if (body.roleId) {
+ roles[appId] = body.roleId
+ }
+ const endpoint = `/api/admin/users`
+ const reqCfg = {
+ method: "POST",
+ body: {
+ ...globalUser,
+ email,
+ password: body.password,
+ status: body.status,
+ roles,
+ },
+ }
+
+ const response = await fetch(
+ checkSlashesInUrl(env.WORKER_URL + endpoint),
+ prepRequest(ctx, reqCfg)
+ )
+ const json = await response.json()
+ if (json.status !== 200 && response.status !== 200) {
+ ctx.throw(400, "Unable to save global user.")
+ }
+ delete body.email
+ delete body.password
+ delete body.roleId
+ delete body.status
+ return body
+}
diff --git a/packages/worker/src/api/controllers/admin/index.js b/packages/worker/src/api/controllers/admin/index.js
index 515feb842..305686a3b 100644
--- a/packages/worker/src/api/controllers/admin/index.js
+++ b/packages/worker/src/api/controllers/admin/index.js
@@ -14,11 +14,11 @@ exports.userSave = async ctx => {
const { email, password, _id } = ctx.request.body
const hashedPassword = password ? await hash(password) : null
let user = {
- ...ctx.request.body,
- _id: generateUserID(email),
- password: hashedPassword,
- },
- dbUser
+ ...ctx.request.body,
+ _id: generateUserID(email),
+ password: hashedPassword,
+ }
+ let dbUser
// in-case user existed already
if (_id) {
dbUser = await db.get(_id)
@@ -57,13 +57,12 @@ exports.userDelete = async ctx => {
// called internally by app server user fetch
exports.userFetch = async ctx => {
const db = new CouchDB(USER_DB)
- const users = (
- await db.allDocs(
- getUserParams(null, {
- include_docs: true,
- })
- )
- ).rows.map(row => row.doc)
+ const response = await db.allDocs(
+ getUserParams(null, {
+ include_docs: true,
+ })
+ )
+ const users = response.rows.map(row => row.doc)
// user hashed password shouldn't ever be returned
for (let user of users) {
if (user) {
@@ -76,7 +75,13 @@ exports.userFetch = async ctx => {
// called internally by app server user find
exports.userFind = async ctx => {
const db = new CouchDB(USER_DB)
- const user = await db.get(generateUserID(ctx.params.email))
+ let user
+ try {
+ user = await db.get(generateUserID(ctx.params.email))
+ } catch (err) {
+ // no user found, just return nothing
+ user = {}
+ }
if (user) {
delete user.password
}
diff --git a/packages/worker/src/api/routes/app.js b/packages/worker/src/api/routes/app.js
index 10656e536..75fa7164b 100644
--- a/packages/worker/src/api/routes/app.js
+++ b/packages/worker/src/api/routes/app.js
@@ -1,9 +1,9 @@
const Router = require("@koa/router")
const controller = require("../controllers/app")
-const checkKey = require("../../middleware/check-key")
+const authenticated = require("../../middleware/authenticated")
const router = Router()
-router.get("/api/apps", checkKey, controller.getApps)
+router.get("/api/apps", authenticated, controller.getApps)
module.exports = router
diff --git a/packages/worker/src/middleware/authenticated.js b/packages/worker/src/middleware/authenticated.js
index 751e10ee9..b13ff5c1b 100644
--- a/packages/worker/src/middleware/authenticated.js
+++ b/packages/worker/src/middleware/authenticated.js
@@ -11,20 +11,22 @@ module.exports = async (ctx, next) => {
appId = cookieAppId
}
- return passport.authenticate("jwt", async (err, user) => {
- if (err) {
- return ctx.throw(err.status || 403, err)
- }
+ return next()
- try {
- ctx.appId = appId
- ctx.isAuthenticated = true
- // TODO: introduce roles again
- ctx.user = user
- await next()
- } catch (err) {
- console.log(err)
- ctx.throw(err.status || 403, err.text)
- }
- })(ctx, next)
+ // return passport.authenticate("jwt", async (err, user) => {
+ // if (err) {
+ // return ctx.throw(err.status || 403, err)
+ // }
+ //
+ // try {
+ // ctx.appId = appId
+ // ctx.isAuthenticated = true
+ // // TODO: introduce roles again
+ // ctx.user = user
+ // await next()
+ // } catch (err) {
+ // console.log(err)
+ // ctx.throw(err.status || 403, err.text)
+ // }
+ // })(ctx, next)
}
From dc62087dada6b1575b1ba3bf16ff2009ef772202 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Fri, 9 Apr 2021 16:55:56 +0100
Subject: [PATCH 028/135] Global user management now functioning as expected,
there were some errant db.destroy functions from the system previously, this
is now cleaned up.
---
packages/server/src/api/controllers/row.js | 71 ++++++++++---------
packages/server/src/api/controllers/user.js | 14 +++-
.../worker/src/api/controllers/admin/index.js | 3 +-
packages/worker/src/api/controllers/app.js | 7 +-
4 files changed, 59 insertions(+), 36 deletions(-)
diff --git a/packages/server/src/api/controllers/row.js b/packages/server/src/api/controllers/row.js
index 8b4a461d2..1e32c24c1 100644
--- a/packages/server/src/api/controllers/row.js
+++ b/packages/server/src/api/controllers/row.js
@@ -9,7 +9,7 @@ const {
InternalTables,
generateUserMetadataID,
} = require("../../db/utils")
-const usersController = require("./user")
+const userController = require("./user")
const {
inputProcessing,
outputProcessing,
@@ -37,18 +37,14 @@ validateJs.extend(validateJs.validators.datetime, {
},
})
-async function findRow(db, appId, tableId, rowId) {
+async function findRow(ctx, db, tableId, rowId) {
let row
+ // TODO remove special user case in future
if (tableId === InternalTables.USER_METADATA) {
- let ctx = {
- params: {
- userId: rowId,
- },
- user: {
- appId,
- },
+ ctx.params = {
+ userId: rowId,
}
- await usersController.findMetadata(ctx)
+ await userController.findMetadata(ctx)
row = ctx.body
} else {
row = await db.get(rowId)
@@ -96,14 +92,14 @@ exports.patch = async function(ctx) {
table,
})
- // Creation of a new user goes to the user controller
+ // TODO remove special user case in future
if (row.tableId === InternalTables.USER_METADATA) {
// the row has been updated, need to put it into the ctx
ctx.request.body = {
...row,
password: ctx.request.body.password,
}
- await usersController.updateMetadata(ctx)
+ await userController.updateMetadata(ctx)
return
}
@@ -142,6 +138,7 @@ exports.save = async function(ctx) {
}
if (!inputs._rev && !inputs._id) {
+ // TODO remove special user case in future
if (inputs.tableId === InternalTables.USER_METADATA) {
inputs._id = generateUserMetadataID(inputs.email)
} else {
@@ -175,11 +172,11 @@ exports.save = async function(ctx) {
table,
})
- // Creation of a new user goes to the user controller
+ // TODO remove special user case in future
if (row.tableId === InternalTables.USER_METADATA) {
// the row has been updated, need to put it into the ctx
ctx.request.body = row
- await usersController.createMetadata(ctx)
+ await userController.createMetadata(ctx)
return
}
@@ -287,14 +284,6 @@ exports.search = async function(ctx) {
}
const response = await search(searchString)
-
- // delete passwords from users
- if (tableId === InternalTables.USER_METADATA) {
- for (let row of response.rows) {
- delete row.password
- }
- }
-
const table = await db.get(tableId)
ctx.body = {
rows: await outputProcessing(appId, table, response.rows),
@@ -306,11 +295,11 @@ exports.fetchTableRows = async function(ctx) {
const appId = ctx.appId
const db = new CouchDB(appId)
- // special case for users, fetch through the user controller
+ // TODO remove special user case in future
let rows,
table = await db.get(ctx.params.tableId)
if (ctx.params.tableId === InternalTables.USER_METADATA) {
- await usersController.fetchMetadata(ctx)
+ await userController.fetchMetadata(ctx)
rows = ctx.body
} else {
const response = await db.allDocs(
@@ -328,7 +317,7 @@ exports.find = async function(ctx) {
const db = new CouchDB(appId)
try {
const table = await db.get(ctx.params.tableId)
- const row = await findRow(db, appId, ctx.params.tableId, ctx.params.rowId)
+ const row = await findRow(ctx, db, ctx.params.tableId, ctx.params.rowId)
ctx.body = await outputProcessing(appId, table, row)
} catch (err) {
ctx.throw(400, err)
@@ -348,8 +337,15 @@ exports.destroy = async function(ctx) {
row,
tableId: row.tableId,
})
- ctx.body = await db.remove(ctx.params.rowId, ctx.params.revId)
- ctx.status = 200
+ // TODO remove special user case in future
+ if (ctx.params.tableId === InternalTables.USER_METADATA) {
+ ctx.params = {
+ userId: ctx.params.rowId,
+ }
+ await userController.destroyMetadata(ctx)
+ } else {
+ ctx.body = await db.remove(ctx.params.rowId, ctx.params.revId)
+ }
// for automations include the row that was deleted
ctx.row = row
@@ -395,7 +391,7 @@ exports.fetchEnrichedRow = async function(ctx) {
// need table to work out where links go in row
let [table, row] = await Promise.all([
db.get(tableId),
- findRow(db, appId, tableId, rowId),
+ findRow(ctx, db, tableId, rowId),
])
// get the link docs
const linkVals = await linkRows.getLinkDocuments({
@@ -437,7 +433,7 @@ async function bulkDelete(ctx) {
const { rows } = ctx.request.body
const db = new CouchDB(appId)
- const linkUpdates = rows.map(row =>
+ let updates = rows.map(row =>
linkRows.updateLinks({
appId,
eventType: linkRows.EventType.ROW_DELETE,
@@ -445,9 +441,20 @@ async function bulkDelete(ctx) {
tableId: row.tableId,
})
)
-
- await db.bulkDocs(rows.map(row => ({ ...row, _deleted: true })))
- await Promise.all(linkUpdates)
+ // TODO remove special user case in future
+ if (ctx.params.tableId === InternalTables.USER_METADATA) {
+ updates = updates.concat(
+ rows.map(row => {
+ ctx.params = {
+ userId: row._id,
+ }
+ return userController.destroyMetadata(ctx)
+ })
+ )
+ } else {
+ await db.bulkDocs(rows.map(row => ({ ...row, _deleted: true })))
+ }
+ await Promise.all(updates)
rows.forEach(row => {
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, row)
diff --git a/packages/server/src/api/controllers/user.js b/packages/server/src/api/controllers/user.js
index c526050cd..93e6dec1d 100644
--- a/packages/server/src/api/controllers/user.js
+++ b/packages/server/src/api/controllers/user.js
@@ -28,6 +28,8 @@ exports.fetchMetadata = async function(ctx) {
users.push({
...user,
...info,
+ // make sure the ID is always a local ID, not a global one
+ _id: generateUserMetadataID(user.email),
})
}
ctx.body = users
@@ -75,9 +77,15 @@ exports.updateMetadata = async function(ctx) {
exports.destroyMetadata = async function(ctx) {
const db = new CouchDB(ctx.appId)
- const email = ctx.params.email
+ const email =
+ ctx.params.email || getEmailFromUserMetadataID(ctx.params.userId)
await deleteGlobalUser(ctx, email)
- await db.destroy(generateUserMetadataID(email))
+ try {
+ const dbUser = await db.get(generateUserMetadataID(email))
+ await db.remove(dbUser._id, dbUser._rev)
+ } catch (err) {
+ // error just means the global user has no config in this app
+ }
ctx.body = {
message: `User ${ctx.params.email} deleted.`,
}
@@ -92,5 +100,7 @@ exports.findMetadata = async function(ctx) {
ctx.body = {
...global,
...user,
+ // make sure the ID is always a local ID, not a global one
+ _id: generateUserMetadataID(email),
}
}
diff --git a/packages/worker/src/api/controllers/admin/index.js b/packages/worker/src/api/controllers/admin/index.js
index 305686a3b..ff0d2997e 100644
--- a/packages/worker/src/api/controllers/admin/index.js
+++ b/packages/worker/src/api/controllers/admin/index.js
@@ -48,7 +48,8 @@ exports.userSave = async ctx => {
exports.userDelete = async ctx => {
const db = new CouchDB(USER_DB)
- await db.destroy(generateUserID(ctx.params.email))
+ const dbUser = await db.get(generateUserID(ctx.params.email))
+ await db.remove(dbUser._id, dbUser._rev)
ctx.body = {
message: `User ${ctx.params.email} deleted.`,
}
diff --git a/packages/worker/src/api/controllers/app.js b/packages/worker/src/api/controllers/app.js
index eac0c47c1..bed3b5594 100644
--- a/packages/worker/src/api/controllers/app.js
+++ b/packages/worker/src/api/controllers/app.js
@@ -15,9 +15,14 @@ exports.getApps = async ctx => {
}
const appDbNames = allDbs.filter(dbName => dbName.startsWith(APP_PREFIX))
const appPromises = appDbNames.map(db => new CouchDB(db).get(db))
- const apps = await Promise.all(appPromises)
+
+ const apps = await Promise.allSettled(appPromises)
const body = {}
for (let app of apps) {
+ if (app.status !== "fulfilled") {
+ continue
+ }
+ app = app.value
let url = app.url || encodeURI(`${app.name}`)
url = `/${url.replace(URL_REGEX_SLASH, "")}`
body[url] = {
From ac1f39138351946b15964eb8b352886e29ef2515 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Fri, 9 Apr 2021 16:56:42 +0100
Subject: [PATCH 029/135] Formatting.
---
packages/auth/src/index.js | 6 +++++-
packages/worker/src/api/routes/admin/index.js | 7 ++++++-
2 files changed, 11 insertions(+), 2 deletions(-)
diff --git a/packages/auth/src/index.js b/packages/auth/src/index.js
index b65690b06..f42b2d842 100644
--- a/packages/auth/src/index.js
+++ b/packages/auth/src/index.js
@@ -8,7 +8,11 @@ const { jwt, local, google } = require("./middleware")
const { Cookies, UserStatus } = require("./constants")
const { hash, compare } = require("./hashing")
const { getAppId, setCookie } = require("./utils")
-const { generateUserID, getUserParams, getEmailFromUserID } = require("./db/utils")
+const {
+ generateUserID,
+ getUserParams,
+ getEmailFromUserID,
+} = require("./db/utils")
// Strategies
passport.use(new LocalStrategy(local.options, local.authenticate))
diff --git a/packages/worker/src/api/routes/admin/index.js b/packages/worker/src/api/routes/admin/index.js
index 558c6e2c2..6a89a41dd 100644
--- a/packages/worker/src/api/routes/admin/index.js
+++ b/packages/worker/src/api/routes/admin/index.js
@@ -22,7 +22,12 @@ function buildUserSaveValidation() {
}
router
- .post("/api/admin/users", buildUserSaveValidation(), authenticated, controller.userSave)
+ .post(
+ "/api/admin/users",
+ buildUserSaveValidation(),
+ authenticated,
+ controller.userSave
+ )
.delete("/api/admin/users/:email", authenticated, controller.userDelete)
.get("/api/admin/users", authenticated, controller.userFetch)
.get("/api/admin/users/:email", authenticated, controller.userFind)
From dccd559b561f827159a3246394f5d0ab207f82ca Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Fri, 9 Apr 2021 17:33:21 +0100
Subject: [PATCH 030/135] Updating some test cases to work with new system.
---
packages/server/__mocks__/node-fetch.js | 6 ++++++
packages/server/src/api/controllers/auth.js | 4 ++--
packages/server/src/api/controllers/role.js | 4 ++--
packages/server/src/api/controllers/row.js | 1 +
packages/server/src/api/controllers/table/utils.js | 8 ++++++--
packages/server/src/api/controllers/user.js | 3 +++
packages/server/src/automations/steps/createRow.js | 2 +-
packages/server/src/automations/steps/createUser.js | 6 ++----
packages/server/src/automations/steps/deleteRow.js | 2 +-
packages/server/src/automations/steps/updateRow.js | 2 +-
packages/server/src/automations/tests/automation.spec.js | 2 +-
packages/server/src/automations/tests/createRow.spec.js | 1 +
packages/server/src/automations/tests/createUser.spec.js | 6 ++----
packages/server/src/db/utils.js | 2 +-
packages/server/src/middleware/tests/usageQuota.spec.js | 4 +---
packages/server/src/utilities/workerRequests.js | 4 +++-
16 files changed, 34 insertions(+), 23 deletions(-)
diff --git a/packages/server/__mocks__/node-fetch.js b/packages/server/__mocks__/node-fetch.js
index d02380258..33b6e2345 100644
--- a/packages/server/__mocks__/node-fetch.js
+++ b/packages/server/__mocks__/node-fetch.js
@@ -41,6 +41,12 @@ module.exports = async (url, opts) => {
],
bookmark: "test",
})
+ } else if (url.includes("/api/admin")) {
+ return json({
+ email: "test@test.com",
+ _id: "us_test@test.com",
+ status: "active",
+ })
}
return fetch(url, opts)
}
diff --git a/packages/server/src/api/controllers/auth.js b/packages/server/src/api/controllers/auth.js
index 6e662f7b9..3c61142d6 100644
--- a/packages/server/src/api/controllers/auth.js
+++ b/packages/server/src/api/controllers/auth.js
@@ -6,7 +6,7 @@ const { getAPIKey } = require("../../utilities/usageQuota")
const { generateUserMetadataID } = require("../../db/utils")
const { setCookie } = require("../../utilities")
const { outputProcessing } = require("../../utilities/rowProcessor")
-const { ViewNames } = require("../../db/utils")
+const { InternalTables } = require("../../db/utils")
const { UserStatus } = require("@budibase/auth")
const setBuilderToken = require("../../utilities/builder/setBuilderToken")
@@ -84,7 +84,7 @@ exports.fetchSelf = async ctx => {
}
const db = new CouchDB(appId)
const user = await db.get(userId)
- const userTable = await db.get(ViewNames.USERS)
+ const userTable = await db.get(InternalTables.USER_METADATA)
if (user) {
delete user.password
}
diff --git a/packages/server/src/api/controllers/role.js b/packages/server/src/api/controllers/role.js
index d27272a21..42213b010 100644
--- a/packages/server/src/api/controllers/role.js
+++ b/packages/server/src/api/controllers/role.js
@@ -11,7 +11,7 @@ const {
generateRoleID,
getRoleParams,
getUserMetadataParams,
- ViewNames,
+ InternalTables,
} = require("../../db/utils")
const UpdateRolesOptions = {
@@ -28,7 +28,7 @@ const EXTERNAL_BUILTIN_ROLE_IDS = [
]
async function updateRolesOnUserTable(db, roleId, updateOption) {
- const table = await db.get(ViewNames.USERS)
+ const table = await db.get(InternalTables.USER_METADATA)
const schema = table.schema
const remove = updateOption === UpdateRolesOptions.REMOVED
let updated = false
diff --git a/packages/server/src/api/controllers/row.js b/packages/server/src/api/controllers/row.js
index 1e32c24c1..9f59eb46f 100644
--- a/packages/server/src/api/controllers/row.js
+++ b/packages/server/src/api/controllers/row.js
@@ -349,6 +349,7 @@ exports.destroy = async function(ctx) {
// for automations include the row that was deleted
ctx.row = row
+ ctx.status = 200
ctx.eventEmitter && ctx.eventEmitter.emitRow(`row:delete`, appId, row)
}
diff --git a/packages/server/src/api/controllers/table/utils.js b/packages/server/src/api/controllers/table/utils.js
index 0302ca18a..3cf64e8e3 100644
--- a/packages/server/src/api/controllers/table/utils.js
+++ b/packages/server/src/api/controllers/table/utils.js
@@ -1,6 +1,10 @@
const CouchDB = require("../../../db")
const csvParser = require("../../../utilities/csvParser")
-const { getRowParams, generateRowID, ViewNames } = require("../../../db/utils")
+const {
+ getRowParams,
+ generateRowID,
+ InternalTables,
+} = require("../../../db/utils")
const { isEqual } = require("lodash/fp")
const { AutoFieldSubTypes } = require("../../../constants")
const { inputProcessing } = require("../../../utilities/rowProcessor")
@@ -136,7 +140,7 @@ exports.handleSearchIndexes = async (appId, table) => {
exports.checkStaticTables = table => {
// check user schema has all required elements
- if (table._id === ViewNames.USERS) {
+ if (table._id === InternalTables.USER_METADATA) {
for (let [key, schema] of Object.entries(USERS_TABLE_SCHEMA.schema)) {
// check if the schema exists on the table to be created/updated
if (table.schema[key] == null) {
diff --git a/packages/server/src/api/controllers/user.js b/packages/server/src/api/controllers/user.js
index 93e6dec1d..2ef875384 100644
--- a/packages/server/src/api/controllers/user.js
+++ b/packages/server/src/api/controllers/user.js
@@ -54,7 +54,10 @@ exports.createMetadata = async function(ctx) {
}
const response = await db.post(user)
+ // for automations to make it obvious was successful
+ ctx.status = 200
ctx.body = {
+ _id: response.id,
_rev: response.rev,
email,
}
diff --git a/packages/server/src/automations/steps/createRow.js b/packages/server/src/automations/steps/createRow.js
index aa910dbb4..9ab70d316 100644
--- a/packages/server/src/automations/steps/createRow.js
+++ b/packages/server/src/automations/steps/createRow.js
@@ -75,7 +75,7 @@ module.exports.run = async function({ inputs, appId, apiKey, emitter }) {
request: {
body: inputs.row,
},
- user: { appId },
+ appId,
eventEmitter: emitter,
}
diff --git a/packages/server/src/automations/steps/createUser.js b/packages/server/src/automations/steps/createUser.js
index 8849415c5..21f02eedc 100644
--- a/packages/server/src/automations/steps/createUser.js
+++ b/packages/server/src/automations/steps/createUser.js
@@ -62,9 +62,7 @@ module.exports.definition = {
module.exports.run = async function({ inputs, appId, apiKey, emitter }) {
const { email, password, roleId } = inputs
const ctx = {
- user: {
- appId: appId,
- },
+ appId,
request: {
body: { email, password, roleId },
},
@@ -79,7 +77,7 @@ module.exports.run = async function({ inputs, appId, apiKey, emitter }) {
return {
response: ctx.body,
// internal property not returned through the API
- id: ctx.userId,
+ id: ctx.body._id,
revision: ctx.body._rev,
success: ctx.status === 200,
}
diff --git a/packages/server/src/automations/steps/deleteRow.js b/packages/server/src/automations/steps/deleteRow.js
index 57555ddaa..4d6fbb2a7 100644
--- a/packages/server/src/automations/steps/deleteRow.js
+++ b/packages/server/src/automations/steps/deleteRow.js
@@ -65,7 +65,7 @@ module.exports.run = async function({ inputs, appId, apiKey, emitter }) {
rowId: inputs.id,
revId: inputs.revision,
},
- user: { appId },
+ appId,
eventEmitter: emitter,
}
diff --git a/packages/server/src/automations/steps/updateRow.js b/packages/server/src/automations/steps/updateRow.js
index a545662cf..78c11a421 100644
--- a/packages/server/src/automations/steps/updateRow.js
+++ b/packages/server/src/automations/steps/updateRow.js
@@ -78,7 +78,7 @@ module.exports.run = async function({ inputs, appId, emitter }) {
request: {
body: inputs.row,
},
- user: { appId },
+ appId,
eventEmitter: emitter,
}
diff --git a/packages/server/src/automations/tests/automation.spec.js b/packages/server/src/automations/tests/automation.spec.js
index 2e9bb16e5..7a01b64dc 100644
--- a/packages/server/src/automations/tests/automation.spec.js
+++ b/packages/server/src/automations/tests/automation.spec.js
@@ -1,10 +1,10 @@
+require("../../environment")
const automation = require("../index")
const usageQuota = require("../../utilities/usageQuota")
const thread = require("../thread")
const triggers = require("../triggers")
const { basicAutomation, basicTable } = require("../../tests/utilities/structures")
const { wait } = require("../../utilities")
-const env = require("../../environment")
const { makePartial } = require("../../tests/utilities")
const { cleanInputValues } = require("../automationUtils")
const setup = require("./utilities")
diff --git a/packages/server/src/automations/tests/createRow.spec.js b/packages/server/src/automations/tests/createRow.spec.js
index c01d630be..d31ba5f8d 100644
--- a/packages/server/src/automations/tests/createRow.spec.js
+++ b/packages/server/src/automations/tests/createRow.spec.js
@@ -26,6 +26,7 @@ describe("test the create row action", () => {
})
expect(res.id).toBeDefined()
expect(res.revision).toBeDefined()
+ expect(res.success).toEqual(true)
const gottenRow = await config.getRow(table._id, res.id)
expect(gottenRow.name).toEqual("test")
expect(gottenRow.description).toEqual("test")
diff --git a/packages/server/src/automations/tests/createUser.spec.js b/packages/server/src/automations/tests/createUser.spec.js
index f188c31aa..f085d5271 100644
--- a/packages/server/src/automations/tests/createUser.spec.js
+++ b/packages/server/src/automations/tests/createUser.spec.js
@@ -1,8 +1,7 @@
const usageQuota = require("../../utilities/usageQuota")
-const env = require("../../environment")
const setup = require("./utilities")
const { BUILTIN_ROLE_IDS } = require("../../utilities/security/roles")
-const { ViewNames } = require("../../db/utils")
+const { InternalTables } = require("../../db/utils")
jest.mock("../../utilities/usageQuota")
@@ -25,8 +24,7 @@ describe("test the create user action", () => {
const res = await setup.runStep(setup.actions.CREATE_USER.stepId, user)
expect(res.id).toBeDefined()
expect(res.revision).toBeDefined()
- const userDoc = await config.getRow(ViewNames.USERS, res.id)
- expect(userDoc.email).toEqual(user.email)
+ const userDoc = await config.getRow(InternalTables.USER_METADATA, res.id)
})
it("should return an error if no inputs provided", async () => {
diff --git a/packages/server/src/db/utils.js b/packages/server/src/db/utils.js
index 63d4e30d6..5cd9e1b31 100644
--- a/packages/server/src/db/utils.js
+++ b/packages/server/src/db/utils.js
@@ -128,7 +128,7 @@ exports.generateRowID = (tableId, id = null) => {
* Gets parameters for retrieving users, this is a utility function for the getDocParams function.
*/
exports.getUserMetadataParams = (email = "", otherProps = {}) => {
- return exports.getRowParams(ViewNames.USERS, email, otherProps)
+ return exports.getRowParams(InternalTables.USER_METADATA, email, otherProps)
}
/**
diff --git a/packages/server/src/middleware/tests/usageQuota.spec.js b/packages/server/src/middleware/tests/usageQuota.spec.js
index 9ab17ef99..646f49232 100644
--- a/packages/server/src/middleware/tests/usageQuota.spec.js
+++ b/packages/server/src/middleware/tests/usageQuota.spec.js
@@ -20,9 +20,7 @@ class TestConfiguration {
this.ctx = {
throw: this.throw,
next: this.next,
- user: {
- appId: "test"
- },
+ appId: "test",
request: {
body: {}
},
diff --git a/packages/server/src/utilities/workerRequests.js b/packages/server/src/utilities/workerRequests.js
index f3bf97125..b081762e1 100644
--- a/packages/server/src/utilities/workerRequests.js
+++ b/packages/server/src/utilities/workerRequests.js
@@ -26,7 +26,9 @@ function prepRequest(ctx, request) {
? JSON.stringify(request.body)
: request.body
}
- request.headers.cookie = ctx.headers.cookie
+ if (ctx.headers) {
+ request.headers.cookie = ctx.headers.cookie
+ }
return request
}
From b5a5df7f60d81fdb21b591d7620d64c9839fb837 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Sun, 11 Apr 2021 11:35:55 +0100
Subject: [PATCH 031/135] login page
---
hosting/generated-envoy.dev.yaml | 125 ------------------
packages/auth/src/index.js | 9 +-
packages/auth/src/middleware/authenticated.js | 53 ++++++++
packages/auth/src/middleware/index.js | 2 +
packages/auth/src/utils.js | 24 ++++
packages/builder/src/builderStore/api.js | 8 +-
packages/builder/src/builderStore/index.js | 4 +-
.../src/components/login/LoginForm.svelte | 31 +++++
.../builder/src/components/login/index.js | 1 +
.../builder/src/pages/builder/_layout.svelte | 75 +++++++----
packages/builder/src/stores/backend/auth.js | 22 +++
packages/builder/src/stores/backend/index.js | 1 +
packages/server/src/api/controllers/auth.js | 8 +-
packages/server/src/api/index.js | 2 +-
packages/server/src/api/routes/auth.js | 2 +-
packages/server/src/middleware/authorized.js | 13 +-
packages/worker/src/api/controllers/auth.js | 8 +-
packages/worker/src/api/routes/admin/index.js | 9 +-
packages/worker/src/api/routes/auth.js | 12 +-
.../worker/src/middleware/authenticated.js | 30 -----
packages/worker/src/middleware/authorized.js | 7 -
21 files changed, 231 insertions(+), 215 deletions(-)
delete mode 100644 hosting/generated-envoy.dev.yaml
create mode 100644 packages/auth/src/middleware/authenticated.js
create mode 100644 packages/builder/src/components/login/LoginForm.svelte
create mode 100644 packages/builder/src/components/login/index.js
create mode 100644 packages/builder/src/stores/backend/auth.js
delete mode 100644 packages/worker/src/middleware/authenticated.js
delete mode 100644 packages/worker/src/middleware/authorized.js
diff --git a/hosting/generated-envoy.dev.yaml b/hosting/generated-envoy.dev.yaml
deleted file mode 100644
index 72cad3410..000000000
--- a/hosting/generated-envoy.dev.yaml
+++ /dev/null
@@ -1,125 +0,0 @@
-static_resources:
- listeners:
- - name: main_listener
- address:
- socket_address: { address: 0.0.0.0, port_value: 10000 }
- filter_chains:
- - filters:
- - name: envoy.filters.network.http_connection_manager
- typed_config:
- "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
- stat_prefix: ingress
- codec_type: auto
- route_config:
- name: local_route
- virtual_hosts:
- - name: local_services
- domains: ["*"]
- routes:
- - match: { prefix: "/db/" }
- route:
- cluster: couchdb-service
- prefix_rewrite: "/"
-
- - match: { prefix: "/cache/" }
- route:
- cluster: redis-service
- prefix_rewrite: "/"
-
- - match: { prefix: "/api/" }
- route:
- cluster: server-dev
-
- - match: { prefix: "/app_" }
- route:
- cluster: server-dev
-
- - match: { prefix: "/builder/" }
- route:
- cluster: builder-dev
-
- - match: { prefix: "/builder" }
- route:
- cluster: builder-dev
- prefix_rewrite: "/builder/"
-
- # minio is on the default route because this works
- # best, minio + AWS SDK doesn't handle path proxy
- - match: { prefix: "/" }
- route:
- cluster: minio-service
-
- http_filters:
- - name: envoy.filters.http.router
-
- clusters:
- - name: minio-service
- connect_timeout: 0.25s
- type: strict_dns
- lb_policy: round_robin
- load_assignment:
- cluster_name: minio-service
- endpoints:
- - lb_endpoints:
- - endpoint:
- address:
- socket_address:
- address: minio-service
- port_value: 9000
-
- - name: couchdb-service
- connect_timeout: 0.25s
- type: strict_dns
- lb_policy: round_robin
- load_assignment:
- cluster_name: couchdb-service
- endpoints:
- - lb_endpoints:
- - endpoint:
- address:
- socket_address:
- address: couchdb-service
- port_value: 5984
-
- - name: redis-service
- connect_timeout: 0.25s
- type: strict_dns
- lb_policy: round_robin
- load_assignment:
- cluster_name: redis-service
- endpoints:
- - lb_endpoints:
- - endpoint:
- address:
- socket_address:
- address: redis-service
- port_value: 6379
-
- - name: server-dev
- connect_timeout: 0.25s
- type: strict_dns
- lb_policy: round_robin
- load_assignment:
- cluster_name: server-dev
- endpoints:
- - lb_endpoints:
- - endpoint:
- address:
- socket_address:
- address: host.docker.internal
- port_value: 4001
-
- - name: builder-dev
- connect_timeout: 15s
- type: strict_dns
- lb_policy: round_robin
- load_assignment:
- cluster_name: builder-dev
- endpoints:
- - lb_endpoints:
- - endpoint:
- address:
- socket_address:
- address: host.docker.internal
- port_value: 3000
-
diff --git a/packages/auth/src/index.js b/packages/auth/src/index.js
index b65690b06..b3b60b2cc 100644
--- a/packages/auth/src/index.js
+++ b/packages/auth/src/index.js
@@ -4,11 +4,15 @@ const JwtStrategy = require("passport-jwt").Strategy
// const GoogleStrategy = require("passport-google-oauth").Strategy
const CouchDB = require("./db")
const { StaticDatabases } = require("./db/utils")
-const { jwt, local, google } = require("./middleware")
+const { jwt, local, google, authenticated } = require("./middleware")
const { Cookies, UserStatus } = require("./constants")
const { hash, compare } = require("./hashing")
const { getAppId, setCookie } = require("./utils")
-const { generateUserID, getUserParams, getEmailFromUserID } = require("./db/utils")
+const {
+ generateUserID,
+ getUserParams,
+ getEmailFromUserID,
+} = require("./db/utils")
// Strategies
passport.use(new LocalStrategy(local.options, local.authenticate))
@@ -41,4 +45,5 @@ module.exports = {
compare,
getAppId,
setCookie,
+ authenticated,
}
diff --git a/packages/auth/src/middleware/authenticated.js b/packages/auth/src/middleware/authenticated.js
new file mode 100644
index 000000000..0c77fbbd1
--- /dev/null
+++ b/packages/auth/src/middleware/authenticated.js
@@ -0,0 +1,53 @@
+const CouchDB = require("../db")
+const { Cookies } = require("../constants")
+const { getAppId, setCookie, getCookie } = require("../utils")
+const { StaticDatabases } = require("../db/utils")
+
+async function setCurrentAppContext(ctx) {
+ let role = "PUBLIC"
+
+ // Current app cookie
+ let appId = getAppId(ctx)
+ if (!appId) {
+ ctx.user = {
+ role,
+ }
+ return
+ }
+
+ const currentAppCookie = getCookie(ctx, Cookies.CurrentApp, { decrypt: true })
+ const appIdChanged = appId && currentAppCookie.appId !== appId
+ if (appIdChanged) {
+ try {
+ // get roles for user from global DB
+ const db = new CouchDB(StaticDatabases.USER)
+ const user = await db.get(ctx.user)
+ role = user.roles[appId]
+ } catch (err) {
+ // no user exists
+ }
+ } else if (currentAppCookie.appId) {
+ appId = currentAppCookie.appId
+ }
+ setCookie(ctx, { appId, role }, Cookies.CurrentApp, { encrypt: true })
+ return appId
+}
+
+module.exports = async (ctx, next) => {
+ try {
+ // check the actual user is authenticated first
+ const authCookie = getCookie(ctx, Cookies.Auth, { decrypt: true })
+
+ if (authCookie) {
+ ctx.isAuthenticated = true
+ ctx.user = authCookie._id
+ }
+
+ ctx.appId = await setCurrentAppContext(ctx)
+
+ await next()
+ } catch (err) {
+ console.log(err)
+ ctx.throw(err.status || 403, err.text)
+ }
+}
diff --git a/packages/auth/src/middleware/index.js b/packages/auth/src/middleware/index.js
index 9d822e593..519233eda 100644
--- a/packages/auth/src/middleware/index.js
+++ b/packages/auth/src/middleware/index.js
@@ -1,9 +1,11 @@
const jwt = require("./passport/jwt")
const local = require("./passport/local")
const google = require("./passport/google")
+const authenticated = require("./authenticated")
module.exports = {
google,
jwt,
local,
+ authenticated,
}
diff --git a/packages/auth/src/utils.js b/packages/auth/src/utils.js
index 7eb39a300..8aa8eb97e 100644
--- a/packages/auth/src/utils.js
+++ b/packages/auth/src/utils.js
@@ -1,4 +1,6 @@
const { DocumentTypes, SEPARATOR } = require("./db/utils")
+const jwt = require("jsonwebtoken")
+const { options } = require("./middleware/passport/jwt")
const APP_PREFIX = DocumentTypes.APP + SEPARATOR
@@ -39,6 +41,23 @@ exports.getAppId = ctx => {
return appId
}
+/**
+ * Get a cookie from context, and decrypt if necessary.
+ * @param {object} ctx The request which is to be manipulated.
+ * @param {string} name The name of the cookie to get.
+ * @param {object} options options .
+ */
+exports.getCookie = (ctx, value, options = {}) => {
+ const cookie = ctx.cookies.get(value)
+
+ if (!cookie) return
+
+ if (!options.decrypt) return cookie
+
+ const payload = jwt.verify(cookie, process.env.JWT_SECRET)
+ return payload
+}
+
/**
* Store a cookie for the request, has a hardcoded expiry.
* @param {object} ctx The request which is to be manipulated.
@@ -52,6 +71,11 @@ exports.setCookie = (ctx, value, name = "builder") => {
if (!value) {
ctx.cookies.set(name)
} else {
+ if (options.encrypt) {
+ value = jwt.sign(value, process.env.JWT_SECRET, {
+ expiresIn: "1 day",
+ })
+ }
ctx.cookies.set(name, value, {
expires,
path: "/",
diff --git a/packages/builder/src/builderStore/api.js b/packages/builder/src/builderStore/api.js
index 8b5206da9..1cb21a994 100644
--- a/packages/builder/src/builderStore/api.js
+++ b/packages/builder/src/builderStore/api.js
@@ -20,9 +20,9 @@ export const get = apiCall("GET")
export const patch = apiCall("PATCH")
export const del = apiCall("DELETE")
export const put = apiCall("PUT")
-export const getBuilderCookie = async () => {
- await post("/api/builder/login", {})
-}
+// export const getBuilderCookie = async () => {
+// await post("/api/builder/login", {})
+// }
export default {
post: apiCall("POST"),
@@ -30,5 +30,5 @@ export default {
patch: apiCall("PATCH"),
delete: apiCall("DELETE"),
put: apiCall("PUT"),
- getBuilderCookie,
+ // getBuilderCookie,
}
diff --git a/packages/builder/src/builderStore/index.js b/packages/builder/src/builderStore/index.js
index 48f466169..25e3c5979 100644
--- a/packages/builder/src/builderStore/index.js
+++ b/packages/builder/src/builderStore/index.js
@@ -6,7 +6,7 @@ import { derived, writable } from "svelte/store"
import analytics from "analytics"
import { FrontendTypes, LAYOUT_NAMES } from "../constants"
import { findComponent } from "./storeUtils"
-import { getBuilderCookie } from "./api"
+// import { getBuilderCookie } from "./api"
export const store = getFrontendStore()
export const automationStore = getAutomationStore()
@@ -59,7 +59,7 @@ export const selectedAccessRole = writable("BASIC")
export const initialise = async () => {
try {
// TODO this needs to be replaced by a real login
- await getBuilderCookie()
+ // await getBuilderCookie()
await analytics.activate()
analytics.captureEvent("Builder Started")
} catch (err) {
diff --git a/packages/builder/src/components/login/LoginForm.svelte b/packages/builder/src/components/login/LoginForm.svelte
new file mode 100644
index 000000000..216891e35
--- /dev/null
+++ b/packages/builder/src/components/login/LoginForm.svelte
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/packages/builder/src/components/login/index.js b/packages/builder/src/components/login/index.js
new file mode 100644
index 000000000..9c9e70861
--- /dev/null
+++ b/packages/builder/src/components/login/index.js
@@ -0,0 +1 @@
+export { LoginForm } from "./LoginForm.svelte"
\ No newline at end of file
diff --git a/packages/builder/src/pages/builder/_layout.svelte b/packages/builder/src/pages/builder/_layout.svelte
index 22e3a81c7..2b98536ab 100644
--- a/packages/builder/src/pages/builder/_layout.svelte
+++ b/packages/builder/src/pages/builder/_layout.svelte
@@ -7,44 +7,55 @@
CommunityIcon,
BugIcon,
} from "components/common/Icons"
+ import LoginForm from "components/login/LoginForm.svelte"
import BuilderSettingsButton from "components/start/BuilderSettingsButton.svelte"
import Logo from "/assets/budibase-logo.svg"
+ import { auth } from "stores/backend"
let modal
-
-
-
-
-
-
-
-
-
-
+{#if $auth.user}
+
+
+
+
-
+
+
+
-
-
-
-
+
+{:else}
+
+{/if}
\ No newline at end of file
+
diff --git a/packages/builder/src/pages/[application]/data/_layout.svelte b/packages/builder/src/pages/[application]/data/_layout.svelte
index 0674c93c8..5a31d7db9 100644
--- a/packages/builder/src/pages/[application]/data/_layout.svelte
+++ b/packages/builder/src/pages/[application]/data/_layout.svelte
@@ -17,11 +17,11 @@
},
]
- let tab = $isActive('./datasource') ? "datasource" : "table"
+ let tab = $isActive("./datasource") ? "datasource" : "table"
function selectFirstTableOrSource({ detail }) {
const type = detail.heading.key
- if (type === 'datasource') {
+ if (type === "datasource") {
$goto("./datasource")
} else {
$goto("./table")
@@ -34,7 +34,10 @@
-
+
m._id === $params.query
- )
+ const query = $backendUiStore.queries.find(m => m._id === $params.query)
if (query) {
backendUiStore.actions.queries.select(query)
}
diff --git a/packages/builder/src/pages/[application]/data/datasource/index.svelte b/packages/builder/src/pages/[application]/data/datasource/index.svelte
index 73b369ad6..dafaf14e4 100644
--- a/packages/builder/src/pages/[application]/data/datasource/index.svelte
+++ b/packages/builder/src/pages/[application]/data/datasource/index.svelte
@@ -1,29 +1,30 @@
-
- {#if $backendUiStore.tables.length === 0}
- Connect your first datasource to start building.
- {:else}Select a datasource to edit {/if}
-
-
\ No newline at end of file
+ })
+
+
+{#if $backendUiStore.tables.length === 0}
+ Connect your first datasource to start building.
+{:else}Select a datasource to edit {/if}
+
+
From 4b6efc42ed3273595c7a129411f4d883733d3321 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Sun, 11 Apr 2021 12:53:39 +0100
Subject: [PATCH 033/135] v0.8.13
---
lerna.json | 2 +-
packages/builder/package.json | 6 +++---
packages/cli/package.json | 2 +-
packages/client/package.json | 6 +++---
packages/server/package.json | 8 ++++----
packages/standard-components/package.json | 2 +-
packages/string-templates/package.json | 2 +-
packages/worker/package.json | 2 +-
8 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/lerna.json b/lerna.json
index 5d71dc202..0a4705cc4 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "version": "0.8.12",
+ "version": "0.8.13",
"npmClient": "yarn",
"packages": [
"packages/*"
diff --git a/packages/builder/package.json b/packages/builder/package.json
index 3db29b060..7fe17a3e4 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/builder",
- "version": "0.8.12",
+ "version": "0.8.13",
"license": "AGPL-3.0",
"private": true,
"scripts": {
@@ -64,9 +64,9 @@
},
"dependencies": {
"@budibase/bbui": "^1.58.13",
- "@budibase/client": "^0.8.12",
+ "@budibase/client": "^0.8.13",
"@budibase/colorpicker": "1.1.2",
- "@budibase/string-templates": "^0.8.12",
+ "@budibase/string-templates": "^0.8.13",
"@budibase/svelte-ag-grid": "^1.0.4",
"@sentry/browser": "5.19.1",
"@svelteschool/svelte-forms": "0.7.0",
diff --git a/packages/cli/package.json b/packages/cli/package.json
index 5c58c8056..ef4f9f2ce 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,6 +1,6 @@
{
"name": "cli",
- "version": "0.8.7",
+ "version": "0.8.13",
"description": "Budibase CLI, for developers, self hosting and migrations.",
"main": "src/index.js",
"bin": "src/index.js",
diff --git a/packages/client/package.json b/packages/client/package.json
index af80ac21f..02df3e630 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/client",
- "version": "0.8.12",
+ "version": "0.8.13",
"license": "MPL-2.0",
"main": "dist/budibase-client.js",
"module": "dist/budibase-client.js",
@@ -9,13 +9,13 @@
"dev:builder": "rollup -cw"
},
"dependencies": {
- "@budibase/string-templates": "^0.8.12",
+ "@budibase/string-templates": "^0.8.13",
"regexparam": "^1.3.0",
"shortid": "^2.2.15",
"svelte-spa-router": "^3.0.5"
},
"devDependencies": {
- "@budibase/standard-components": "^0.8.12",
+ "@budibase/standard-components": "^0.8.13",
"@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 c6a051911..a750a5d20 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/server",
"email": "hi@budibase.com",
- "version": "0.8.12",
+ "version": "0.8.13",
"description": "Budibase Web Server",
"main": "src/electron.js",
"repository": {
@@ -71,8 +71,8 @@
"author": "Budibase",
"license": "AGPL-3.0-or-later",
"dependencies": {
- "@budibase/client": "^0.8.12",
- "@budibase/string-templates": "^0.8.12",
+ "@budibase/client": "^0.8.13",
+ "@budibase/string-templates": "^0.8.13",
"@elastic/elasticsearch": "7.10.0",
"@koa/router": "8.0.0",
"@sendgrid/mail": "7.1.1",
@@ -126,7 +126,7 @@
"zlib": "1.0.5"
},
"devDependencies": {
- "@budibase/standard-components": "^0.8.12",
+ "@budibase/standard-components": "^0.8.13",
"@jest/test-sequencer": "^24.8.0",
"cross-env": "^7.0.3",
"electron": "10.1.3",
diff --git a/packages/standard-components/package.json b/packages/standard-components/package.json
index 451db3320..830c50bb9 100644
--- a/packages/standard-components/package.json
+++ b/packages/standard-components/package.json
@@ -35,7 +35,7 @@
"keywords": [
"svelte"
],
- "version": "0.8.12",
+ "version": "0.8.13",
"license": "MIT",
"gitHead": "1b95326b20d1352d36305910259228b96a683dc7",
"dependencies": {
diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json
index c5ee74f2d..9c4db8bae 100644
--- a/packages/string-templates/package.json
+++ b/packages/string-templates/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/string-templates",
- "version": "0.8.12",
+ "version": "0.8.13",
"description": "Handlebars wrapper for Budibase templating.",
"main": "src/index.js",
"module": "src/index.js",
diff --git a/packages/worker/package.json b/packages/worker/package.json
index adc219a22..6eb019bef 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/deployment",
"email": "hi@budibase.com",
- "version": "0.8.12",
+ "version": "0.8.13",
"description": "Budibase Deployment Server",
"main": "src/index.js",
"repository": {
From c30e70c9393be9087f41cf86b7cf27c8bbba365c Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Sun, 11 Apr 2021 12:58:22 +0100
Subject: [PATCH 034/135] v0.8.14
---
lerna.json | 2 +-
packages/builder/package.json | 6 +++---
packages/client/package.json | 8 ++++----
packages/server/package.json | 10 +++++-----
packages/standard-components/package.json | 4 ++--
packages/string-templates/package.json | 4 ++--
packages/worker/package.json | 4 ++--
7 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/lerna.json b/lerna.json
index 0a4705cc4..75945feb6 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "version": "0.8.13",
+ "version": "0.8.14",
"npmClient": "yarn",
"packages": [
"packages/*"
diff --git a/packages/builder/package.json b/packages/builder/package.json
index 7fe17a3e4..3940fcb74 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/builder",
- "version": "0.8.13",
+ "version": "0.8.14",
"license": "AGPL-3.0",
"private": true,
"scripts": {
@@ -64,9 +64,9 @@
},
"dependencies": {
"@budibase/bbui": "^1.58.13",
- "@budibase/client": "^0.8.13",
+ "@budibase/client": "^0.8.14",
"@budibase/colorpicker": "1.1.2",
- "@budibase/string-templates": "^0.8.13",
+ "@budibase/string-templates": "^0.8.14",
"@budibase/svelte-ag-grid": "^1.0.4",
"@sentry/browser": "5.19.1",
"@svelteschool/svelte-forms": "0.7.0",
diff --git a/packages/client/package.json b/packages/client/package.json
index 02df3e630..838df4167 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/client",
- "version": "0.8.13",
+ "version": "0.8.14",
"license": "MPL-2.0",
"main": "dist/budibase-client.js",
"module": "dist/budibase-client.js",
@@ -9,13 +9,13 @@
"dev:builder": "rollup -cw"
},
"dependencies": {
- "@budibase/string-templates": "^0.8.13",
+ "@budibase/string-templates": "^0.8.14",
"regexparam": "^1.3.0",
"shortid": "^2.2.15",
"svelte-spa-router": "^3.0.5"
},
"devDependencies": {
- "@budibase/standard-components": "^0.8.13",
+ "@budibase/standard-components": "^0.8.14",
"@rollup/plugin-commonjs": "^16.0.0",
"@rollup/plugin-node-resolve": "^10.0.0",
"fs-extra": "^8.1.0",
@@ -29,5 +29,5 @@
"svelte": "^3.30.0",
"svelte-jester": "^1.0.6"
},
- "gitHead": "1b95326b20d1352d36305910259228b96a683dc7"
+ "gitHead": "4b6efc42ed3273595c7a129411f4d883733d3321"
}
diff --git a/packages/server/package.json b/packages/server/package.json
index a750a5d20..f6c293bda 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/server",
"email": "hi@budibase.com",
- "version": "0.8.13",
+ "version": "0.8.14",
"description": "Budibase Web Server",
"main": "src/electron.js",
"repository": {
@@ -71,8 +71,8 @@
"author": "Budibase",
"license": "AGPL-3.0-or-later",
"dependencies": {
- "@budibase/client": "^0.8.13",
- "@budibase/string-templates": "^0.8.13",
+ "@budibase/client": "^0.8.14",
+ "@budibase/string-templates": "^0.8.14",
"@elastic/elasticsearch": "7.10.0",
"@koa/router": "8.0.0",
"@sendgrid/mail": "7.1.1",
@@ -126,7 +126,7 @@
"zlib": "1.0.5"
},
"devDependencies": {
- "@budibase/standard-components": "^0.8.13",
+ "@budibase/standard-components": "^0.8.14",
"@jest/test-sequencer": "^24.8.0",
"cross-env": "^7.0.3",
"electron": "10.1.3",
@@ -138,5 +138,5 @@
"pouchdb-adapter-memory": "^7.2.1",
"supertest": "^4.0.2"
},
- "gitHead": "1b95326b20d1352d36305910259228b96a683dc7"
+ "gitHead": "4b6efc42ed3273595c7a129411f4d883733d3321"
}
diff --git a/packages/standard-components/package.json b/packages/standard-components/package.json
index 830c50bb9..d8f84ef58 100644
--- a/packages/standard-components/package.json
+++ b/packages/standard-components/package.json
@@ -35,9 +35,9 @@
"keywords": [
"svelte"
],
- "version": "0.8.13",
+ "version": "0.8.14",
"license": "MIT",
- "gitHead": "1b95326b20d1352d36305910259228b96a683dc7",
+ "gitHead": "4b6efc42ed3273595c7a129411f4d883733d3321",
"dependencies": {
"@adobe/spectrum-css-workflow-icons": "^1.1.0",
"@budibase/bbui": "^1.58.13",
diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json
index 9c4db8bae..433384445 100644
--- a/packages/string-templates/package.json
+++ b/packages/string-templates/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/string-templates",
- "version": "0.8.13",
+ "version": "0.8.14",
"description": "Handlebars wrapper for Budibase templating.",
"main": "src/index.js",
"module": "src/index.js",
@@ -33,5 +33,5 @@
"rollup-plugin-terser": "^7.0.2",
"typescript": "^4.1.3"
},
- "gitHead": "1b95326b20d1352d36305910259228b96a683dc7"
+ "gitHead": "4b6efc42ed3273595c7a129411f4d883733d3321"
}
diff --git a/packages/worker/package.json b/packages/worker/package.json
index 6eb019bef..a84feb164 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/deployment",
"email": "hi@budibase.com",
- "version": "0.8.13",
+ "version": "0.8.14",
"description": "Budibase Deployment Server",
"main": "src/index.js",
"repository": {
@@ -34,5 +34,5 @@
"pouchdb-all-dbs": "^1.0.2",
"server-destroy": "^1.0.1"
},
- "gitHead": "1b95326b20d1352d36305910259228b96a683dc7"
+ "gitHead": "4b6efc42ed3273595c7a129411f4d883733d3321"
}
From 46acb096005b6b0fb2f20ad3618c2ac9a23f639c Mon Sep 17 00:00:00 2001
From: Michael Drury
Date: Sun, 11 Apr 2021 20:24:54 +0100
Subject: [PATCH 035/135] Update README.md
Fixing codecov badge.
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 5ecf9d3ec..4691265f5 100644
--- a/README.md
+++ b/README.md
@@ -38,7 +38,7 @@
-
+
From d7e187d8f29c5771e7885ffab3764f9f1daf56e1 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Mon, 12 Apr 2021 10:47:48 +0100
Subject: [PATCH 036/135] builder login
---
hosting/envoy.dev.yaml.hbs | 2 +-
.../src/components/login/LoginForm.svelte | 29 ++++++++++++++++---
.../builder/src/pages/builder/_layout.svelte | 1 -
packages/builder/src/stores/backend/auth.js | 20 +++++++++----
packages/worker/src/api/controllers/auth.js | 9 +++++-
5 files changed, 49 insertions(+), 12 deletions(-)
diff --git a/hosting/envoy.dev.yaml.hbs b/hosting/envoy.dev.yaml.hbs
index 40cfc551e..a4e2a9711 100644
--- a/hosting/envoy.dev.yaml.hbs
+++ b/hosting/envoy.dev.yaml.hbs
@@ -26,7 +26,7 @@ static_resources:
cluster: redis-service
prefix_rewrite: "/"
- - match: { prefix: "/api/admin" }
+ - match: { prefix: "/api/admin/" }
route:
cluster: worker-dev
diff --git a/packages/builder/src/components/login/LoginForm.svelte b/packages/builder/src/components/login/LoginForm.svelte
index 216891e35..5265d2e6d 100644
--- a/packages/builder/src/components/login/LoginForm.svelte
+++ b/packages/builder/src/components/login/LoginForm.svelte
@@ -1,15 +1,35 @@
@@ -22,6 +42,7 @@
Login
+ Create Test User
+
+
+
+
+
+
+
+
+
+
+
+ {{ body }}
+
+
+
+
+ {{ footer }}
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/worker/src/constants/templates/index.js b/packages/worker/src/constants/templates/index.js
new file mode 100644
index 000000000..42fbcf70a
--- /dev/null
+++ b/packages/worker/src/constants/templates/index.js
@@ -0,0 +1,19 @@
+const { readStaticFile } = require("../../utilities/fileSystem")
+const { EmailTemplatePurpose } = require("../index")
+const { join } = require("path")
+
+const TEMPLATE_PATH = join(__dirname, "..", "constants", "templates")
+
+exports.EmailTemplates = {
+ [EmailTemplatePurpose.PASSWORD_RECOVERY]: readStaticFile(join(TEMPLATE_PATH, "passwordRecovery.html")),
+ [EmailTemplatePurpose.INVITATION]: readStaticFile(join(TEMPLATE_PATH, "invitation.html")),
+ [EmailTemplatePurpose.HEADER]: readStaticFile(join(TEMPLATE_PATH, "header.html")),
+ [EmailTemplatePurpose.FOOTER]: readStaticFile(join(TEMPLATE_PATH, "footer.html")),
+ [EmailTemplatePurpose.STYLES]: readStaticFile(join(TEMPLATE_PATH, "style.css")),
+}
+
+exports.getTemplateByPurpose = purpose => {
+ if (exports.EmailTemplates[purpose]) {
+ return exports.EmailTemplates[purpose]
+ }
+}
diff --git a/packages/worker/src/constants/templates/invitation.html b/packages/worker/src/constants/templates/invitation.html
new file mode 100644
index 000000000..8e154fe18
--- /dev/null
+++ b/packages/worker/src/constants/templates/invitation.html
@@ -0,0 +1,14 @@
+
+
+
+
+
+
Budibase Invitation
+
You've been invited to join {{ company }}'s Budibase platform!
+
Please follow the below link to finish your registration.
+
Finish registration
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/worker/src/constants/templates/passwordRecovery.html b/packages/worker/src/constants/templates/passwordRecovery.html
new file mode 100644
index 000000000..e6b179ec8
--- /dev/null
+++ b/packages/worker/src/constants/templates/passwordRecovery.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+
Budibase Password reset
+
Please follow the below link to reset your password.
+
Reset password
+
This password reset was required for {{ user }} if you did not
+ request this then please contact your administrator.
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/worker/src/constants/templates/style.css b/packages/worker/src/constants/templates/style.css
new file mode 100644
index 000000000..abcd79783
--- /dev/null
+++ b/packages/worker/src/constants/templates/style.css
@@ -0,0 +1,269 @@
+@font-face {
+ font-family: 'Playfair Display';
+ font-style: italic;
+ font-weight: 400;
+ src: url(/fonts.gstatic.com/s/playfairdisplay/v22/nuFkD-vYSZviVYUb_rj3ij__anPXDTnohkk72xU.woff2) format('woff2');
+ unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
+}
+html,
+body {
+ margin: 0 auto !important;
+ padding: 0 !important;
+ height: 100% !important;
+ width: 100% !important;
+ background: #f1f1f1;
+}
+* {
+ -ms-text-size-adjust: 100%;
+ -webkit-text-size-adjust: 100%;
+}
+div[style*="margin: 16px 0"] {
+ margin: 0 !important;
+}
+table,
+td {
+ mso-table-lspace: 0pt !important;
+ mso-table-rspace: 0pt !important;
+}
+table {
+ border-spacing: 0 !important;
+ border-collapse: collapse !important;
+ table-layout: fixed !important;
+ margin: 0 auto !important;
+}
+img {
+ -ms-interpolation-mode:bicubic;
+}
+a {
+ text-decoration: none;
+}
+*[x-apple-data-detectors], /* iOS */
+.unstyle-auto-detected-links *,
+.aBn {
+ border-bottom: 0 !important;
+ cursor: default !important;
+ color: inherit !important;
+ text-decoration: none !important;
+ font-size: inherit !important;
+ font-family: inherit !important;
+ font-weight: inherit !important;
+ line-height: inherit !important;
+}
+.a6S {
+ display: none !important;
+ opacity: 0.01 !important;
+}
+.im {
+ color: inherit !important;
+}
+img.g-img + div {
+ display: none !important;
+}
+@media only screen and (min-device-width: 320px) and (max-device-width: 374px) {
+ u ~ div .email-container {
+ min-width: 320px !important;
+ }
+}
+@media only screen and (min-device-width: 375px) and (max-device-width: 413px) {
+ u ~ div .email-container {
+ min-width: 375px !important;
+ }
+}
+@media only screen and (min-device-width: 414px) {
+ u ~ div .email-container {
+ min-width: 414px !important;
+ }
+}
+.primary{
+ background: #f3a333;
+}
+.bg_white{
+ background: #ffffff;
+}
+.bg_light{
+ background: #fafafa;
+}
+.bg_black{
+ background: #000000;
+}
+.bg_dark{
+ background: rgba(0,0,0,.8);
+}
+.email-section{
+ padding:2.5em;
+}
+.btn{
+ padding: 10px 15px;
+}
+.btn.btn-primary{
+ border-radius: 30px;
+ background: #f3a333;
+ color: #ffffff;
+}
+h1,h2,h3,h4,h5,h6{
+ font-family: 'Playfair Display', serif;
+ color: #000000;
+ margin-top: 0;
+}
+body{
+ font-family: 'Montserrat', sans-serif;
+ font-weight: 400;
+ font-size: 15px;
+ line-height: 1.8;
+ color: rgba(0,0,0,.4);
+}
+a{
+ color: #f3a333;
+}
+table{
+}
+.logo h1{
+ margin: 0;
+}
+.logo h1 a{
+ color: #000;
+ font-size: 20px;
+ font-weight: 700;
+ text-transform: uppercase;
+ font-family: 'Montserrat', sans-serif;
+}
+.hero{
+ position: relative;
+}
+.hero img{
+
+}
+.hero .text{
+ color: rgba(255,255,255,.8);
+}
+.hero .text h2{
+ color: #ffffff;
+ font-size: 30px;
+ margin-bottom: 0;
+}
+.heading-section{
+}
+.heading-section h2{
+ color: #000000;
+ font-size: 28px;
+ margin-top: 0;
+ line-height: 1.4;
+}
+.heading-section .subheading{
+ margin-bottom: 20px !important;
+ display: inline-block;
+ font-size: 13px;
+ text-transform: uppercase;
+ letter-spacing: 2px;
+ color: rgba(0,0,0,.4);
+ position: relative;
+}
+.heading-section .subheading::after{
+ position: absolute;
+ left: 0;
+ right: 0;
+ bottom: -10px;
+ content: '';
+ width: 100%;
+ height: 2px;
+ background: #f3a333;
+ margin: 0 auto;
+}
+.heading-section-white{
+ color: rgba(255,255,255,.8);
+}
+.heading-section-white h2{
+ font-size: 28px;
+ line-height: 1;
+ padding-bottom: 0;
+}
+.heading-section-white h2{
+ color: #ffffff;
+}
+.heading-section-white .subheading{
+ margin-bottom: 0;
+ display: inline-block;
+ font-size: 13px;
+ text-transform: uppercase;
+ letter-spacing: 2px;
+ color: rgba(255,255,255,.4);
+}
+.icon{
+ text-align: center;
+}
+.icon img{
+}
+.text-services{
+ padding: 10px 10px 0;
+ text-align: center;
+}
+.text-services h3{
+ font-size: 20px;
+}
+.text-services .meta{
+ text-transform: uppercase;
+ font-size: 14px;
+}
+.img{
+ width: 100%;
+ height: auto;
+ position: relative;
+}
+.img .icon{
+ position: absolute;
+ top: 50%;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ margin-top: -25px;
+}
+.img .icon a{
+ display: block;
+ width: 60px;
+ position: absolute;
+ top: 0;
+ left: 50%;
+ margin-left: -25px;
+}
+.counter-text{
+ text-align: center;
+}
+.counter-text .num{
+ display: block;
+ color: #ffffff;
+ font-size: 34px;
+ font-weight: 700;
+}
+.counter-text .name{
+ display: block;
+ color: rgba(255,255,255,.9);
+ font-size: 13px;
+}
+.footer{
+ color: rgba(255,255,255,.5);
+}
+.footer .heading{
+ color: #ffffff;
+ font-size: 20px;
+}
+.footer ul{
+ margin: 0;
+ padding: 0;
+}
+.footer ul li{
+ list-style: none;
+ margin-bottom: 10px;
+}
+.footer ul li a{
+ color: rgba(255,255,255,1);
+}
+@media screen and (max-width: 500px) {
+ .icon{
+ text-align: left;
+ }
+ .text-services{
+ padding-left: 0;
+ padding-right: 20px;
+ text-align: left;
+ }
+}
\ No newline at end of file
diff --git a/packages/worker/src/utilities/email.js b/packages/worker/src/utilities/email.js
new file mode 100644
index 000000000..e69de29bb
diff --git a/packages/worker/src/utilities/fileSystem.js b/packages/worker/src/utilities/fileSystem.js
new file mode 100644
index 000000000..7df21db69
--- /dev/null
+++ b/packages/worker/src/utilities/fileSystem.js
@@ -0,0 +1,5 @@
+const { readFileSync } = require("fs")
+
+exports.readStaticFile = path => {
+ return readFileSync(path, "utf-8")
+}
\ No newline at end of file
From 83f9e00aff4e9232eee809df49cea7cba79e5260 Mon Sep 17 00:00:00 2001
From: Martin McKeaveney
Date: Thu, 22 Apr 2021 15:27:09 +0100
Subject: [PATCH 120/135] fix imports
---
packages/auth/src/index.js | 50 ++-----------------
.../src/api/controllers/admin/configs.js | 10 ++--
packages/worker/src/api/controllers/auth.js | 7 ++-
3 files changed, 12 insertions(+), 55 deletions(-)
diff --git a/packages/auth/src/index.js b/packages/auth/src/index.js
index 4149314b4..c1e0a0824 100644
--- a/packages/auth/src/index.js
+++ b/packages/auth/src/index.js
@@ -1,29 +1,9 @@
const passport = require("koa-passport")
const LocalStrategy = require("passport-local").Strategy
const JwtStrategy = require("passport-jwt").Strategy
-const constants = require("./constants")
-const { StaticDatabases, DocumentTypes } = require("./db/utils")
-const { jwt, local, google, authenticated } = require("./middleware")
-const { Cookies, UserStatus } = require("./constants")
-const { hash, compare } = require("./hashing")
-const {
- getAppId,
- setCookie,
- getCookie,
- clearCookie,
- isClient,
-} = require("./utils")
+const { StaticDatabases } = require("./db/utils")
+const { jwt, local, authenticated, google } = require("./middleware")
const { setDB, getDB } = require("./db")
-const {
- generateUserID,
- getUserParams,
- generateGroupID,
- getGroupParams,
- getEmailFromUserID,
- generateConfigID,
- getConfigParams,
- determineScopedConfig,
-} = require("./db/utils")
// Strategies
passport.use(new LocalStrategy(local.options, local.authenticate))
@@ -55,30 +35,8 @@ module.exports = {
auth: {
buildAuthMiddleware: authenticated,
passport,
- middlewares: {
- google,
- },
+ google,
},
- constants,
- passport,
- Cookies,
- UserStatus,
- DocumentTypes,
StaticDatabases,
- generateUserID,
- getUserParams,
- generateGroupID,
- getGroupParams,
- getEmailFromUserID,
- generateConfigID,
- getConfigParams,
- determineScopedConfig,
- hash,
- compare,
- getAppId,
- setCookie,
- getCookie,
- clearCookie,
- authenticated,
- isClient,
+ constants: require("./constants"),
}
diff --git a/packages/worker/src/api/controllers/admin/configs.js b/packages/worker/src/api/controllers/admin/configs.js
index 08c2b6df7..67f3405fa 100644
--- a/packages/worker/src/api/controllers/admin/configs.js
+++ b/packages/worker/src/api/controllers/admin/configs.js
@@ -1,6 +1,6 @@
const CouchDB = require("../../../db")
-const { StaticDatabases, determineScopedConfig } = require("@budibase/auth")
-const { generateConfigID, getConfigParams } = require("@budibase/auth")
+const authPkg = require("@budibase/auth")
+const { utils, StaticDatabases } = authPkg
const GLOBAL_DB = StaticDatabases.GLOBAL.name
@@ -11,7 +11,7 @@ exports.save = async function(ctx) {
// Config does not exist yet
if (!configDoc._id) {
- configDoc._id = generateConfigID({
+ configDoc._id = utils.generateConfigID({
type,
group,
user,
@@ -33,7 +33,7 @@ exports.save = async function(ctx) {
exports.fetch = async function(ctx) {
const db = new CouchDB(GLOBAL_DB)
const response = await db.allDocs(
- getConfigParams(undefined, {
+ utils.getConfigParams(undefined, {
include_docs: true,
})
)
@@ -60,7 +60,7 @@ exports.find = async function(ctx) {
try {
// Find the config with the most granular scope based on context
- const scopedConfig = await determineScopedConfig(db, {
+ const scopedConfig = await authPkg.db.determineScopedConfig(db, {
type: ctx.params.type,
user: userId,
group,
diff --git a/packages/worker/src/api/controllers/auth.js b/packages/worker/src/api/controllers/auth.js
index a58a7abda..bcda523a9 100644
--- a/packages/worker/src/api/controllers/auth.js
+++ b/packages/worker/src/api/controllers/auth.js
@@ -1,10 +1,9 @@
-const { determineScopedConfig } = require("@budibase/auth")
const authPkg = require("@budibase/auth")
const { google } = require("@budibase/auth/src/middleware")
const { Configs } = require("../../constants")
const CouchDB = require("../../db")
const { clearCookie } = authPkg.utils
-const { Cookies } = authPkg
+const { Cookies } = authPkg.constants
const { passport } = authPkg.auth
const GLOBAL_DB = authPkg.StaticDatabases.GLOBAL.name
@@ -46,7 +45,7 @@ exports.logout = async ctx => {
*/
exports.googlePreAuth = async (ctx, next) => {
const db = new CouchDB(GLOBAL_DB)
- const config = await determineScopedConfig(db, {
+ const config = await authPkg.db.determineScopedConfig(db, {
type: Configs.GOOGLE,
group: ctx.query.group,
})
@@ -60,7 +59,7 @@ exports.googlePreAuth = async (ctx, next) => {
exports.googleAuth = async (ctx, next) => {
const db = new CouchDB(GLOBAL_DB)
- const config = await determineScopedConfig(db, {
+ const config = await authPkg.db.determineScopedConfig(db, {
type: Configs.GOOGLE,
group: ctx.query.group,
})
From 27846e1bee9837607804e0561aeb2ff2a1509fd6 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Thu, 22 Apr 2021 16:06:29 +0100
Subject: [PATCH 121/135] Formatting.
---
.../src/api/controllers/admin/templates.js | 7 ++++++-
packages/worker/src/constants/index.js | 6 +++---
.../worker/src/constants/templates/index.js | 20 ++++++++++++++-----
packages/worker/src/utilities/fileSystem.js | 2 +-
4 files changed, 25 insertions(+), 10 deletions(-)
diff --git a/packages/worker/src/api/controllers/admin/templates.js b/packages/worker/src/api/controllers/admin/templates.js
index ccf057c48..0314ca609 100644
--- a/packages/worker/src/api/controllers/admin/templates.js
+++ b/packages/worker/src/api/controllers/admin/templates.js
@@ -4,7 +4,12 @@ const {
StaticDatabases,
} = require("@budibase/auth").db
const { CouchDB } = require("../../../db")
-const { TemplatePurposePretty, TemplateTypes, EmailTemplatePurpose, TemplatePurpose } = require("../../../constants")
+const {
+ TemplatePurposePretty,
+ TemplateTypes,
+ EmailTemplatePurpose,
+ TemplatePurpose,
+} = require("../../../constants")
const { getTemplateByPurpose } = require("../../../constants/templates")
const GLOBAL_DB = StaticDatabases.GLOBAL.name
diff --git a/packages/worker/src/constants/index.js b/packages/worker/src/constants/index.js
index 8edba58fd..44ca57ea1 100644
--- a/packages/worker/src/constants/index.js
+++ b/packages/worker/src/constants/index.js
@@ -43,7 +43,7 @@ const TemplatePurposePretty = {
},
{
name: "Password Recovery",
- value: EmailTemplatePurpose.PASSWORD_RECOVERY
+ value: EmailTemplatePurpose.PASSWORD_RECOVERY,
},
{
name: "New User Invitation",
@@ -52,8 +52,8 @@ const TemplatePurposePretty = {
{
name: "Custom",
value: EmailTemplatePurpose.CUSTOM,
- }
- ]
+ },
+ ],
}
// all purpose combined
diff --git a/packages/worker/src/constants/templates/index.js b/packages/worker/src/constants/templates/index.js
index 42fbcf70a..53db5f2b4 100644
--- a/packages/worker/src/constants/templates/index.js
+++ b/packages/worker/src/constants/templates/index.js
@@ -5,11 +5,21 @@ const { join } = require("path")
const TEMPLATE_PATH = join(__dirname, "..", "constants", "templates")
exports.EmailTemplates = {
- [EmailTemplatePurpose.PASSWORD_RECOVERY]: readStaticFile(join(TEMPLATE_PATH, "passwordRecovery.html")),
- [EmailTemplatePurpose.INVITATION]: readStaticFile(join(TEMPLATE_PATH, "invitation.html")),
- [EmailTemplatePurpose.HEADER]: readStaticFile(join(TEMPLATE_PATH, "header.html")),
- [EmailTemplatePurpose.FOOTER]: readStaticFile(join(TEMPLATE_PATH, "footer.html")),
- [EmailTemplatePurpose.STYLES]: readStaticFile(join(TEMPLATE_PATH, "style.css")),
+ [EmailTemplatePurpose.PASSWORD_RECOVERY]: readStaticFile(
+ join(TEMPLATE_PATH, "passwordRecovery.html")
+ ),
+ [EmailTemplatePurpose.INVITATION]: readStaticFile(
+ join(TEMPLATE_PATH, "invitation.html")
+ ),
+ [EmailTemplatePurpose.HEADER]: readStaticFile(
+ join(TEMPLATE_PATH, "header.html")
+ ),
+ [EmailTemplatePurpose.FOOTER]: readStaticFile(
+ join(TEMPLATE_PATH, "footer.html")
+ ),
+ [EmailTemplatePurpose.STYLES]: readStaticFile(
+ join(TEMPLATE_PATH, "style.css")
+ ),
}
exports.getTemplateByPurpose = purpose => {
diff --git a/packages/worker/src/utilities/fileSystem.js b/packages/worker/src/utilities/fileSystem.js
index 7df21db69..8f0bc8d3e 100644
--- a/packages/worker/src/utilities/fileSystem.js
+++ b/packages/worker/src/utilities/fileSystem.js
@@ -2,4 +2,4 @@ const { readFileSync } = require("fs")
exports.readStaticFile = path => {
return readFileSync(path, "utf-8")
-}
\ No newline at end of file
+}
From 737dd356c3222cb96d8f10d80b657c2a4d323444 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Thu, 22 Apr 2021 17:57:38 +0100
Subject: [PATCH 122/135] Fleshing out the main work behind the email
generation.
---
packages/worker/package.json | 1 +
.../src/api/controllers/admin/configs.js | 17 ++--
.../src/api/controllers/admin/templates.js | 51 ++----------
packages/worker/src/constants/index.js | 41 ++++++----
.../worker/src/constants/templates/base.html | 82 +++++++++++++++++++
.../src/constants/templates/footer.html | 48 -----------
.../src/constants/templates/header.html | 36 --------
.../worker/src/constants/templates/index.js | 60 ++++++++++++--
.../constants/templates/passwordRecovery.html | 2 +-
packages/worker/src/utilities/email.js | 36 ++++++++
packages/worker/src/utilities/index.js | 9 ++
packages/worker/src/utilities/templates.js | 29 +++++++
12 files changed, 251 insertions(+), 161 deletions(-)
create mode 100644 packages/worker/src/constants/templates/base.html
delete mode 100644 packages/worker/src/constants/templates/footer.html
delete mode 100644 packages/worker/src/constants/templates/header.html
create mode 100644 packages/worker/src/utilities/index.js
create mode 100644 packages/worker/src/utilities/templates.js
diff --git a/packages/worker/package.json b/packages/worker/package.json
index fd43af7b0..c81e99acf 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -20,6 +20,7 @@
"license": "AGPL-3.0-or-later",
"dependencies": {
"@budibase/auth": "0.0.1",
+ "@budibase/string-templates": "^0.8.16",
"@koa/router": "^8.0.0",
"aws-sdk": "^2.811.0",
"bcryptjs": "^2.4.3",
diff --git a/packages/worker/src/api/controllers/admin/configs.js b/packages/worker/src/api/controllers/admin/configs.js
index 67f3405fa..df19dc9a5 100644
--- a/packages/worker/src/api/controllers/admin/configs.js
+++ b/packages/worker/src/api/controllers/admin/configs.js
@@ -1,6 +1,10 @@
const CouchDB = require("../../../db")
-const authPkg = require("@budibase/auth")
-const { utils, StaticDatabases } = authPkg
+const {
+ generateConfigID,
+ StaticDatabases,
+ getConfigParams,
+ determineScopedConfig,
+} = require("@budibase/auth").db
const GLOBAL_DB = StaticDatabases.GLOBAL.name
@@ -11,7 +15,7 @@ exports.save = async function(ctx) {
// Config does not exist yet
if (!configDoc._id) {
- configDoc._id = utils.generateConfigID({
+ configDoc._id = generateConfigID({
type,
group,
user,
@@ -33,12 +37,11 @@ exports.save = async function(ctx) {
exports.fetch = async function(ctx) {
const db = new CouchDB(GLOBAL_DB)
const response = await db.allDocs(
- utils.getConfigParams(undefined, {
+ getConfigParams(undefined, {
include_docs: true,
})
)
- const groups = response.rows.map(row => row.doc)
- ctx.body = groups
+ ctx.body = response.rows.map(row => row.doc)
}
/**
@@ -60,7 +63,7 @@ exports.find = async function(ctx) {
try {
// Find the config with the most granular scope based on context
- const scopedConfig = await authPkg.db.determineScopedConfig(db, {
+ const scopedConfig = await determineScopedConfig(db, {
type: ctx.params.type,
user: userId,
group,
diff --git a/packages/worker/src/api/controllers/admin/templates.js b/packages/worker/src/api/controllers/admin/templates.js
index 0314ca609..f01f8e217 100644
--- a/packages/worker/src/api/controllers/admin/templates.js
+++ b/packages/worker/src/api/controllers/admin/templates.js
@@ -1,59 +1,17 @@
const {
generateTemplateID,
- getTemplateParams,
StaticDatabases,
} = require("@budibase/auth").db
const { CouchDB } = require("../../../db")
const {
- TemplatePurposePretty,
- TemplateTypes,
- EmailTemplatePurpose,
- TemplatePurpose,
+ TemplateMetadata,
+ TemplateBindings,
} = require("../../../constants")
-const { getTemplateByPurpose } = require("../../../constants/templates")
+const { getTemplates } = require("../../../constants/templates")
const GLOBAL_DB = StaticDatabases.GLOBAL.name
const GLOBAL_OWNER = "global"
-function addBaseTemplates(templates, type = null) {
- let purposeList
- switch (type) {
- case TemplateTypes.EMAIL:
- purposeList = Object.values(EmailTemplatePurpose)
- break
- default:
- purposeList = Object.values(TemplatePurpose)
- break
- }
- for (let purpose of purposeList) {
- // check if a template exists already for purpose
- if (templates.find(template => template.purpose === purpose)) {
- continue
- }
- templates.push(getTemplateByPurpose(purpose))
- }
- return templates
-}
-
-async function getTemplates({ ownerId, type, id } = {}) {
- const db = new CouchDB(GLOBAL_DB)
- const response = await db.allDocs(
- getTemplateParams(ownerId, id, {
- include_docs: true,
- })
- )
- let templates = response.rows.map(row => row.doc)
- // should only be one template with ID
- if (id) {
- return templates[0]
- }
- if (type) {
- templates = templates.filter(template => template.type === type)
- }
-
- return addBaseTemplates(templates, type)
-}
-
exports.save = async ctx => {
const db = new CouchDB(GLOBAL_DB)
const type = ctx.params.type
@@ -77,7 +35,8 @@ exports.save = async ctx => {
exports.definitions = async ctx => {
ctx.body = {
- purpose: TemplatePurposePretty,
+ purpose: TemplateMetadata,
+ bindings: Object.values(TemplateBindings),
}
}
diff --git a/packages/worker/src/constants/index.js b/packages/worker/src/constants/index.js
index 44ca57ea1..bb002bbd6 100644
--- a/packages/worker/src/constants/index.js
+++ b/packages/worker/src/constants/index.js
@@ -1,3 +1,6 @@
+exports.LOGO_URL =
+ "https://d33wubrfki0l68.cloudfront.net/aac32159d7207b5085e74a7ef67afbb7027786c5/2b1fd/img/logo/bb-emblem.svg"
+
exports.UserStatus = {
ACTIVE: "active",
INACTIVE: "inactive",
@@ -19,39 +22,48 @@ const TemplateTypes = {
}
const EmailTemplatePurpose = {
- HEADER: "header",
- FOOTER: "footer",
+ BASE: "base",
STYLES: "styles",
PASSWORD_RECOVERY: "password_recovery",
INVITATION: "invitation",
CUSTOM: "custom",
}
-const TemplatePurposePretty = {
+const TemplateBindings = {
+ URL: "url",
+ COMPANY: "company",
+ LOGO_URL: "logoUrl",
+ STYLES: "styles",
+ BODY: "body",
+ REGISTRATION_URL: "registrationUrl",
+ EMAIL: "email",
+ RESET_URL: "resetUrl",
+ USER: "user",
+}
+
+const TemplateMetadata = {
[TemplateTypes.EMAIL]: [
{
name: "Styling",
- value: EmailTemplatePurpose.STYLES,
- },
- {
- name: "Header",
- value: EmailTemplatePurpose.HEADER,
+ purpose: EmailTemplatePurpose.STYLES,
+ bindings: ["url", "company", "companyUrl", "styles", "body"]
},
{
- name: "Footer",
- value: EmailTemplatePurpose.FOOTER,
+ name: "Base Format",
+ purpose: EmailTemplatePurpose.BASE,
+ bindings: ["company", "registrationUrl"]
},
{
name: "Password Recovery",
- value: EmailTemplatePurpose.PASSWORD_RECOVERY,
+ purpose: EmailTemplatePurpose.PASSWORD_RECOVERY,
},
{
name: "New User Invitation",
- value: EmailTemplatePurpose.INVITATION,
+ purpose: EmailTemplatePurpose.INVITATION,
},
{
name: "Custom",
- value: EmailTemplatePurpose.CUSTOM,
+ purpose: EmailTemplatePurpose.CUSTOM,
},
],
}
@@ -62,4 +74,5 @@ exports.TemplatePurpose = {
}
exports.TemplateTypes = TemplateTypes
exports.EmailTemplatePurpose = EmailTemplatePurpose
-exports.TemplatePurposePretty = TemplatePurposePretty
+exports.TemplateMetadata = TemplateMetadata
+exports.TemplateBindings = TemplateBindings
diff --git a/packages/worker/src/constants/templates/base.html b/packages/worker/src/constants/templates/base.html
new file mode 100644
index 000000000..f728404be
--- /dev/null
+++ b/packages/worker/src/constants/templates/base.html
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ body }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/worker/src/constants/templates/footer.html b/packages/worker/src/constants/templates/footer.html
deleted file mode 100644
index 693fd3c0c..000000000
--- a/packages/worker/src/constants/templates/footer.html
+++ /dev/null
@@ -1,48 +0,0 @@
-
\ No newline at end of file
diff --git a/packages/worker/src/constants/templates/header.html b/packages/worker/src/constants/templates/header.html
deleted file mode 100644
index 7709bd30a..000000000
--- a/packages/worker/src/constants/templates/header.html
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ body }}
-
-
-
-
- {{ footer }}
-
-
-
-
-
\ No newline at end of file
diff --git a/packages/worker/src/constants/templates/index.js b/packages/worker/src/constants/templates/index.js
index 53db5f2b4..2878a3a4e 100644
--- a/packages/worker/src/constants/templates/index.js
+++ b/packages/worker/src/constants/templates/index.js
@@ -1,6 +1,11 @@
const { readStaticFile } = require("../../utilities/fileSystem")
-const { EmailTemplatePurpose } = require("../index")
+const { EmailTemplatePurpose, TemplateTypes, TemplatePurpose } = require("../index")
const { join } = require("path")
+const CouchDB = require("../../db")
+const {
+ getTemplateParams,
+ StaticDatabases,
+} = require("@budibase/auth").db
const TEMPLATE_PATH = join(__dirname, "..", "constants", "templates")
@@ -11,19 +16,56 @@ exports.EmailTemplates = {
[EmailTemplatePurpose.INVITATION]: readStaticFile(
join(TEMPLATE_PATH, "invitation.html")
),
- [EmailTemplatePurpose.HEADER]: readStaticFile(
- join(TEMPLATE_PATH, "header.html")
- ),
- [EmailTemplatePurpose.FOOTER]: readStaticFile(
- join(TEMPLATE_PATH, "footer.html")
+ [EmailTemplatePurpose.BASE]: readStaticFile(
+ join(TEMPLATE_PATH, "base.html")
),
[EmailTemplatePurpose.STYLES]: readStaticFile(
join(TEMPLATE_PATH, "style.css")
),
}
-exports.getTemplateByPurpose = purpose => {
- if (exports.EmailTemplates[purpose]) {
- return exports.EmailTemplates[purpose]
+exports.addBaseTemplates = (templates, type = null) => {
+ let purposeList
+ switch (type) {
+ case TemplateTypes.EMAIL:
+ purposeList = Object.values(EmailTemplatePurpose)
+ break
+ default:
+ purposeList = Object.values(TemplatePurpose)
+ break
+ }
+ for (let purpose of purposeList) {
+ // check if a template exists already for purpose
+ if (templates.find(template => template.purpose === purpose)) {
+ continue
+ }
+ if (exports.EmailTemplates[purpose]) {
+ templates.push(exports.EmailTemplates[purpose])
+ }
}
+ return templates
}
+
+exports.getTemplates = async ({ ownerId, type, id } = {}) => {
+ const db = new CouchDB(StaticDatabases.GLOBAL.name)
+ const response = await db.allDocs(
+ getTemplateParams(ownerId, id, {
+ include_docs: true,
+ })
+ )
+ let templates = response.rows.map(row => row.doc)
+ // should only be one template with ID
+ if (id) {
+ return templates[0]
+ }
+ if (type) {
+ templates = templates.filter(template => template.type === type)
+ }
+ return exports.addBaseTemplates(templates, type)
+}
+
+exports.getTemplateByPurpose = async (type, purpose) => {
+ const templates = await exports.getTemplates({ type })
+ return templates.find(template => template.purpose === purpose)
+}
+
diff --git a/packages/worker/src/constants/templates/passwordRecovery.html b/packages/worker/src/constants/templates/passwordRecovery.html
index e6b179ec8..11f4eac1f 100644
--- a/packages/worker/src/constants/templates/passwordRecovery.html
+++ b/packages/worker/src/constants/templates/passwordRecovery.html
@@ -6,7 +6,7 @@
Budibase Password reset
Please follow the below link to reset your password.
Reset password
- This password reset was required for {{ user }} if you did not
+
This password reset was required for {{ email }} if you did not
request this then please contact your administrator.
diff --git a/packages/worker/src/utilities/email.js b/packages/worker/src/utilities/email.js
index e69de29bb..6cab9cc4d 100644
--- a/packages/worker/src/utilities/email.js
+++ b/packages/worker/src/utilities/email.js
@@ -0,0 +1,36 @@
+const { EmailTemplatePurpose, TemplateTypes } = require("../constants")
+const { getTemplateByPurpose } = require("../constants/templates")
+const { processString } = require("@budibase/string-templates")
+const { getSettingsTemplateContext } = require("./templates")
+
+const TYPE = TemplateTypes.EMAIL
+
+const FULL_EMAIL_PURPOSES = [EmailTemplatePurpose.INVITATION, EmailTemplatePurpose.PASSWORD_RECOVERY]
+
+exports.buildEmail = async (email, user, purpose) => {
+ // this isn't a full email
+ if (FULL_EMAIL_PURPOSES.indexOf(purpose) === -1) {
+ throw `Unable to build an email of type ${purpose}`
+ }
+ let [base, styles, body] = await Promise.all([
+ getTemplateByPurpose(TYPE, EmailTemplatePurpose.BASE),
+ getTemplateByPurpose(TYPE, EmailTemplatePurpose.STYLES),
+ getTemplateByPurpose(TYPE, purpose),
+ ])
+
+ // TODO: need to extend the context as much as possible
+ const context = {
+ ...await getSettingsTemplateContext(),
+ email,
+ user
+ }
+
+ body = await processString(body, context)
+ styles = await processString(styles, context)
+ // this should now be the complete email HTML
+ return processString(base, {
+ ...context,
+ styles,
+ body,
+ })
+}
\ No newline at end of file
diff --git a/packages/worker/src/utilities/index.js b/packages/worker/src/utilities/index.js
new file mode 100644
index 000000000..b402a82cf
--- /dev/null
+++ b/packages/worker/src/utilities/index.js
@@ -0,0 +1,9 @@
+/**
+ * Makes sure that a URL has the correct number of slashes, while maintaining the
+ * http(s):// double slashes.
+ * @param {string} url The URL to test and remove any extra double slashes.
+ * @return {string} The updated url.
+ */
+exports.checkSlashesInUrl = url => {
+ return url.replace(/(https?:\/\/)|(\/)+/g, "$1$2")
+}
diff --git a/packages/worker/src/utilities/templates.js b/packages/worker/src/utilities/templates.js
new file mode 100644
index 000000000..064776647
--- /dev/null
+++ b/packages/worker/src/utilities/templates.js
@@ -0,0 +1,29 @@
+const CouchDB = require("../../../db")
+const { getConfigParams, StaticDatabases } = require("@budibase/auth").db
+const { Configs, TemplateBindings, LOGO_URL } = require("../constants")
+const { checkSlashesInUrl } = require("./index")
+const env = require("../environment")
+
+const LOCAL_URL = `http://localhost:${env.PORT}`
+const BASE_COMPANY = "Budibase"
+
+exports.getSettingsTemplateContext = async () => {
+ const db = new CouchDB(StaticDatabases.GLOBAL.name)
+ const response = await db.allDocs(
+ getConfigParams(Configs.SETTINGS, {
+ include_docs: true,
+ })
+ )
+ let settings = response.rows.map(row => row.doc)[0] || {}
+ if (!settings.url) {
+ settings.url = LOCAL_URL
+ }
+ // TODO: need to fully spec out the context
+ return {
+ [TemplateBindings.LOGO_URL]: settings.logoUrl || LOGO_URL,
+ [TemplateBindings.URL]: settings.url,
+ [TemplateBindings.REGISTRATION_URL]: checkSlashesInUrl(`${settings.url}/registration`),
+ [TemplateBindings.RESET_URL]: checkSlashesInUrl(`${settings.url}/reset`),
+ [TemplateBindings.COMPANY]: settings.company || BASE_COMPANY,
+ }
+}
\ No newline at end of file
From e2d29f05625fbb52365014a6fb5fcb2eeff941b8 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Thu, 22 Apr 2021 17:58:14 +0100
Subject: [PATCH 123/135] Formatting.
---
.../src/api/controllers/admin/templates.js | 10 ++--------
packages/worker/src/constants/index.js | 4 ++--
packages/worker/src/constants/templates/index.js | 16 +++++++---------
packages/worker/src/utilities/email.js | 11 +++++++----
packages/worker/src/utilities/templates.js | 6 ++++--
5 files changed, 22 insertions(+), 25 deletions(-)
diff --git a/packages/worker/src/api/controllers/admin/templates.js b/packages/worker/src/api/controllers/admin/templates.js
index f01f8e217..8d4065b77 100644
--- a/packages/worker/src/api/controllers/admin/templates.js
+++ b/packages/worker/src/api/controllers/admin/templates.js
@@ -1,12 +1,6 @@
-const {
- generateTemplateID,
- StaticDatabases,
-} = require("@budibase/auth").db
+const { generateTemplateID, StaticDatabases } = require("@budibase/auth").db
const { CouchDB } = require("../../../db")
-const {
- TemplateMetadata,
- TemplateBindings,
-} = require("../../../constants")
+const { TemplateMetadata, TemplateBindings } = require("../../../constants")
const { getTemplates } = require("../../../constants/templates")
const GLOBAL_DB = StaticDatabases.GLOBAL.name
diff --git a/packages/worker/src/constants/index.js b/packages/worker/src/constants/index.js
index bb002bbd6..7406db0bd 100644
--- a/packages/worker/src/constants/index.js
+++ b/packages/worker/src/constants/index.js
@@ -46,12 +46,12 @@ const TemplateMetadata = {
{
name: "Styling",
purpose: EmailTemplatePurpose.STYLES,
- bindings: ["url", "company", "companyUrl", "styles", "body"]
+ bindings: ["url", "company", "companyUrl", "styles", "body"],
},
{
name: "Base Format",
purpose: EmailTemplatePurpose.BASE,
- bindings: ["company", "registrationUrl"]
+ bindings: ["company", "registrationUrl"],
},
{
name: "Password Recovery",
diff --git a/packages/worker/src/constants/templates/index.js b/packages/worker/src/constants/templates/index.js
index 2878a3a4e..16ec84a37 100644
--- a/packages/worker/src/constants/templates/index.js
+++ b/packages/worker/src/constants/templates/index.js
@@ -1,11 +1,12 @@
const { readStaticFile } = require("../../utilities/fileSystem")
-const { EmailTemplatePurpose, TemplateTypes, TemplatePurpose } = require("../index")
+const {
+ EmailTemplatePurpose,
+ TemplateTypes,
+ TemplatePurpose,
+} = require("../index")
const { join } = require("path")
const CouchDB = require("../../db")
-const {
- getTemplateParams,
- StaticDatabases,
-} = require("@budibase/auth").db
+const { getTemplateParams, StaticDatabases } = require("@budibase/auth").db
const TEMPLATE_PATH = join(__dirname, "..", "constants", "templates")
@@ -16,9 +17,7 @@ exports.EmailTemplates = {
[EmailTemplatePurpose.INVITATION]: readStaticFile(
join(TEMPLATE_PATH, "invitation.html")
),
- [EmailTemplatePurpose.BASE]: readStaticFile(
- join(TEMPLATE_PATH, "base.html")
- ),
+ [EmailTemplatePurpose.BASE]: readStaticFile(join(TEMPLATE_PATH, "base.html")),
[EmailTemplatePurpose.STYLES]: readStaticFile(
join(TEMPLATE_PATH, "style.css")
),
@@ -68,4 +67,3 @@ exports.getTemplateByPurpose = async (type, purpose) => {
const templates = await exports.getTemplates({ type })
return templates.find(template => template.purpose === purpose)
}
-
diff --git a/packages/worker/src/utilities/email.js b/packages/worker/src/utilities/email.js
index 6cab9cc4d..83fb1ff8b 100644
--- a/packages/worker/src/utilities/email.js
+++ b/packages/worker/src/utilities/email.js
@@ -5,7 +5,10 @@ const { getSettingsTemplateContext } = require("./templates")
const TYPE = TemplateTypes.EMAIL
-const FULL_EMAIL_PURPOSES = [EmailTemplatePurpose.INVITATION, EmailTemplatePurpose.PASSWORD_RECOVERY]
+const FULL_EMAIL_PURPOSES = [
+ EmailTemplatePurpose.INVITATION,
+ EmailTemplatePurpose.PASSWORD_RECOVERY,
+]
exports.buildEmail = async (email, user, purpose) => {
// this isn't a full email
@@ -20,9 +23,9 @@ exports.buildEmail = async (email, user, purpose) => {
// TODO: need to extend the context as much as possible
const context = {
- ...await getSettingsTemplateContext(),
+ ...(await getSettingsTemplateContext()),
email,
- user
+ user,
}
body = await processString(body, context)
@@ -33,4 +36,4 @@ exports.buildEmail = async (email, user, purpose) => {
styles,
body,
})
-}
\ No newline at end of file
+}
diff --git a/packages/worker/src/utilities/templates.js b/packages/worker/src/utilities/templates.js
index 064776647..9a3e2d291 100644
--- a/packages/worker/src/utilities/templates.js
+++ b/packages/worker/src/utilities/templates.js
@@ -22,8 +22,10 @@ exports.getSettingsTemplateContext = async () => {
return {
[TemplateBindings.LOGO_URL]: settings.logoUrl || LOGO_URL,
[TemplateBindings.URL]: settings.url,
- [TemplateBindings.REGISTRATION_URL]: checkSlashesInUrl(`${settings.url}/registration`),
+ [TemplateBindings.REGISTRATION_URL]: checkSlashesInUrl(
+ `${settings.url}/registration`
+ ),
[TemplateBindings.RESET_URL]: checkSlashesInUrl(`${settings.url}/reset`),
[TemplateBindings.COMPANY]: settings.company || BASE_COMPANY,
}
-}
\ No newline at end of file
+}
From fcd57cfcb561a90f31f10a26e6daea1e5136ac62 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Fri, 23 Apr 2021 13:10:37 +0100
Subject: [PATCH 124/135] putting together the bulk of the email sending/config
options.
---
packages/worker/package.json | 1 +
.../controllers/admin}/email.js | 31 +-
.../worker/src/api/routes/admin/configs.js | 43 +-
packages/worker/src/api/routes/admin/email.js | 21 +
packages/worker/yarn.lock | 1266 ++++++++++++++++-
5 files changed, 1350 insertions(+), 12 deletions(-)
rename packages/worker/src/{utilities => api/controllers/admin}/email.js (51%)
create mode 100644 packages/worker/src/api/routes/admin/email.js
diff --git a/packages/worker/package.json b/packages/worker/package.json
index c81e99acf..b99b79ecc 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -36,6 +36,7 @@
"koa-session": "^5.12.0",
"koa-static": "^5.0.0",
"node-fetch": "^2.6.1",
+ "nodemailer": "^6.5.0",
"passport-google-oauth": "^2.0.0",
"passport-jwt": "^4.0.0",
"passport-local": "^1.0.0",
diff --git a/packages/worker/src/utilities/email.js b/packages/worker/src/api/controllers/admin/email.js
similarity index 51%
rename from packages/worker/src/utilities/email.js
rename to packages/worker/src/api/controllers/admin/email.js
index 83fb1ff8b..6c9343ea5 100644
--- a/packages/worker/src/utilities/email.js
+++ b/packages/worker/src/api/controllers/admin/email.js
@@ -1,8 +1,12 @@
-const { EmailTemplatePurpose, TemplateTypes } = require("../constants")
-const { getTemplateByPurpose } = require("../constants/templates")
+const CouchDB = require("../../../db")
+const { StaticDatabases, determineScopedConfig } = require("@budibase/auth").db
+const { EmailTemplatePurpose, TemplateTypes, Configs } = require("../../../constants")
+const { getTemplateByPurpose } = require("../../../constants/templates")
+const { getSettingsTemplateContext } = require("../../../utilities/templates")
const { processString } = require("@budibase/string-templates")
-const { getSettingsTemplateContext } = require("./templates")
+const nodemailer = require("nodemailer")
+const GLOBAL_DB = StaticDatabases.GLOBAL.name
const TYPE = TemplateTypes.EMAIL
const FULL_EMAIL_PURPOSES = [
@@ -10,6 +14,14 @@ const FULL_EMAIL_PURPOSES = [
EmailTemplatePurpose.PASSWORD_RECOVERY,
]
+function createSMTPTransport(config) {
+ const transport = nodemailer.createTransport({
+ port: config.port,
+ host: config.host,
+
+ })
+}
+
exports.buildEmail = async (email, user, purpose) => {
// this isn't a full email
if (FULL_EMAIL_PURPOSES.indexOf(purpose) === -1) {
@@ -37,3 +49,16 @@ exports.buildEmail = async (email, user, purpose) => {
body,
})
}
+
+exports.sendEmail = async ctx => {
+ const { groupId, email, purpose } = ctx.request.body
+ const db = new CouchDB(GLOBAL_DB)
+ const params = {}
+ if (groupId) {
+ params.group = groupId
+ }
+ params.type = Configs.SMTP
+ const config = await determineScopedConfig(db, params)
+ const transport = createSMTPTransport(config)
+}
+
diff --git a/packages/worker/src/api/routes/admin/configs.js b/packages/worker/src/api/routes/admin/configs.js
index c6ac04619..d64900cec 100644
--- a/packages/worker/src/api/routes/admin/configs.js
+++ b/packages/worker/src/api/routes/admin/configs.js
@@ -6,11 +6,52 @@ const { Configs } = require("../../../constants")
const router = Router()
+function smtpValidation() {
+ return Joi.object({
+ port: Joi.number().required(),
+ host: Joi.string().required(),
+ from: Joi.string().email().required(),
+ secure: Joi.boolean().optional(),
+ selfSigned: Joi.boolean().optional(),
+ auth: Joi.object({
+ type: Joi.string().valid("login", "oauth2", null),
+ user: Joi.string().required(),
+ pass: Joi.string().valid("", null),
+ }).optional(),
+ }).unknown(true)
+}
+
+function settingValidation() {
+ return Joi.object({
+ url: Joi.string().valid("", null),
+ logoUrl: Joi.string().valid("", null),
+ company: Joi.string().required(),
+ }).unknown(true)
+}
+
+function googleValidation() {
+ return Joi.object({
+ clientID: Joi.string().required(),
+ clientSecret: Joi.string().required(),
+ callbackURL: Joi.string().required(),
+ }).unknown(true)
+}
+
function buildConfigSaveValidation() {
// prettier-ignore
return joiValidator.body(Joi.object({
type: Joi.string().valid(...Object.values(Configs)).required(),
- }).required().unknown(true))
+ config: Joi.alternatives()
+ .conditional("type", {
+ switch: [
+ { is: Configs.SMTP, then: smtpValidation() },
+ { is: Configs.SETTINGS, then: settingValidation() },
+ { is: Configs.ACCOUNT, then: Joi.object().unknown(true) },
+ { is: Configs.GOOGLE, then: googleValidation() }
+ ],
+ }),
+ }),
+ )
}
router
diff --git a/packages/worker/src/api/routes/admin/email.js b/packages/worker/src/api/routes/admin/email.js
new file mode 100644
index 000000000..4a122f479
--- /dev/null
+++ b/packages/worker/src/api/routes/admin/email.js
@@ -0,0 +1,21 @@
+const Router = require("@koa/router")
+const controller = require("../../controllers/admin/email")
+const { EmailTemplatePurpose } = require("../../../constants")
+const joiValidator = require("../../../middleware/joi-validator")
+const Joi = require("joi")
+
+const router = Router()
+
+function buildEmailSendValidation() {
+ // prettier-ignore
+ return joiValidator.body(Joi.object({
+ email: Joi.string().email(),
+ groupId: Joi.string().allow("", null),
+ purpose: Joi.string().allow(...Object.values(EmailTemplatePurpose)),
+ }).required().unknown(true))
+}
+
+router
+ .post("/api/admin/email/send", buildEmailSendValidation(), controller.sendEmail)
+
+module.exports = router
diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock
index 2545067d9..4af1c1d9d 100644
--- a/packages/worker/yarn.lock
+++ b/packages/worker/yarn.lock
@@ -2,6 +2,49 @@
# yarn lockfile v1
+"@budibase/handlebars-helpers@^0.11.3":
+ version "0.11.3"
+ resolved "https://registry.yarnpkg.com/@budibase/handlebars-helpers/-/handlebars-helpers-0.11.3.tgz#b6e5c91b83e8906e7d7ff10ddde277a3d561016e"
+ integrity sha512-MS1ptZEYq8o9J3tNLM7cZ2RGSSJIer4GiMIUHtbBI3sC9UKqZebao1JYNfmZKpNjntuqhZKgjqc5GfnVIEjsYQ==
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-sort "^0.1.4"
+ define-property "^1.0.0"
+ extend-shallow "^3.0.2"
+ "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-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"
+ 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"
+
+"@budibase/string-templates@^0.8.16":
+ version "0.8.17"
+ resolved "https://registry.yarnpkg.com/@budibase/string-templates/-/string-templates-0.8.17.tgz#107937d1a0d1249fc65b61cc050ee3d54e744b65"
+ integrity sha512-FTjzF4HdfXUuyHtbJ6jH+xhp+dzYpvwOvvbG6yXnV0WZg3Xj8svm6GqKPkwODyMYqtLVzEoExZU7JaM0ZX0iqg==
+ dependencies:
+ "@budibase/handlebars-helpers" "^0.11.3"
+ dayjs "^1.10.4"
+ handlebars "^4.7.6"
+ handlebars-utils "^1.0.6"
+ lodash "^4.17.20"
+
"@hapi/bourne@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.0.0.tgz#5bb2193eb685c0007540ca61d166d4e1edaf918d"
@@ -190,6 +233,186 @@ 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-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@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997"
@@ -200,6 +423,20 @@ 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.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d"
@@ -214,6 +451,32 @@ 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-promise@^1.1.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
@@ -227,6 +490,13 @@ anymatch@~3.1.1:
normalize-path "^3.0.0"
picomatch "^2.0.4"
+argparse@^1.0.10:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
args@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/args/-/args-5.0.1.tgz#4bf298df90a4799a09521362c579278cc2fdd761"
@@ -242,6 +512,40 @@ argsarray@0.0.1:
resolved "https://registry.yarnpkg.com/argsarray/-/argsarray-0.0.1.tgz#6e7207b4ecdb39b0af88303fa5ae22bda8df61cb"
integrity sha1-bnIHtOzbObCviDA/pa4ivajfYcs=
+arr-diff@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
+ integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=
+
+arr-flatten@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1"
+ integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==
+
+arr-union@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
+ integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
+
+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"
+ integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+
+assign-symbols@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
+ integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
+
ast-types@0.8.15:
version "0.8.15"
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52"
@@ -252,11 +556,23 @@ ast-types@0.9.6:
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9"
integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
atomic-sleep@^1.0.0:
version "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"
+
aws-sdk@^2.811.0:
version "2.811.0"
resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.811.0.tgz#a7e4040b2ee7d8b825b142ed5179d36dc3f315c4"
@@ -297,6 +613,19 @@ base64url@3.x.x:
resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d"
integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==
+base@^0.11.1:
+ version "0.11.2"
+ resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f"
+ integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==
+ dependencies:
+ cache-base "^1.0.1"
+ class-utils "^0.3.5"
+ component-emitter "^1.2.1"
+ define-property "^1.0.0"
+ isobject "^3.0.1"
+ mixin-deep "^1.2.0"
+ pascalcase "^0.1.1"
+
bcryptjs@^2.4.3:
version "2.4.3"
resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
@@ -329,6 +658,22 @@ brace-expansion@^1.1.7:
balanced-match "^1.0.0"
concat-map "0.0.1"
+braces@^2.3.1:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729"
+ integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==
+ dependencies:
+ arr-flatten "^1.1.0"
+ array-unique "^0.3.2"
+ extend-shallow "^2.0.1"
+ fill-range "^4.0.0"
+ isobject "^3.0.1"
+ repeat-element "^1.1.2"
+ snapdragon "^0.8.1"
+ snapdragon-node "^2.0.1"
+ split-string "^3.0.2"
+ to-regex "^3.0.1"
+
braces@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
@@ -368,6 +713,21 @@ bytes@3.1.0, bytes@^3.0.0:
resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
integrity sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+cache-base@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
+ integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==
+ dependencies:
+ collection-visit "^1.0.0"
+ component-emitter "^1.2.1"
+ get-value "^2.0.6"
+ has-value "^1.0.0"
+ isobject "^3.0.1"
+ set-value "^2.0.0"
+ to-object-path "^0.3.0"
+ union-value "^1.0.0"
+ unset-value "^1.0.0"
+
cache-content-type@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/cache-content-type/-/cache-content-type-1.0.1.tgz#035cde2b08ee2129f4a8315ea8f00a00dba1453c"
@@ -462,6 +822,16 @@ ci-info@^2.0.0:
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+class-utils@^0.3.5:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
+ integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==
+ dependencies:
+ arr-union "^3.1.0"
+ define-property "^0.2.5"
+ isobject "^3.0.0"
+ static-extend "^0.1.1"
+
cli-boxes@^2.2.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
@@ -494,6 +864,14 @@ co@^4.6.0:
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
+collection-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
+ integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=
+ dependencies:
+ map-visit "^1.0.0"
+ object-visit "^1.0.0"
+
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
@@ -538,6 +916,11 @@ commoner@^0.10.1:
q "^1.1.2"
recast "^0.11.17"
+component-emitter@^1.2.1:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
+ integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
+
compressible@^2.0.0:
version "2.0.18"
resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz#af53cca6b070d4c3c0750fbd77286a6d7cc46fba"
@@ -550,6 +933,13 @@ concat-map@0.0.1:
resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+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"
+
configstore@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96"
@@ -582,6 +972,11 @@ cookies@~0.8.0:
depd "~2.0.0"
keygrip "~1.1.0"
+copy-descriptor@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
+ integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
+
core-util-is@^1.0.2, core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
@@ -599,12 +994,24 @@ crypto-random-string@^2.0.0:
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
+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"
integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
-debug@^2.2.0:
+dayjs@^1.10.4:
+ version "1.10.4"
+ resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.4.tgz#8e544a9b8683f61783f570980a8a80eaf54ab1e2"
+ integrity sha512-RI/Hh4kqRc1UKLOAf/T5zdMMX5DQIlDxwUe3wSyMMnEbGunnpENCdbUgM+dW7kXidZqCttBrmw7BhN4TMddkCw==
+
+debug@^2.2.0, debug@^2.3.3:
version "2.6.9"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
@@ -632,6 +1039,11 @@ debug@~3.1.0:
dependencies:
ms "2.0.0"
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
+ integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=
+
decompress-response@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3"
@@ -656,6 +1068,13 @@ deep-extend@^0.6.0:
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+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"
+
defer-to-connect@^1.0.1:
version "1.1.3"
resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
@@ -674,6 +1093,28 @@ deferred-leveldown@~5.3.0:
abstract-leveldown "~6.2.1"
inherits "^2.0.3"
+define-property@^0.2.5:
+ version "0.2.5"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116"
+ integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=
+ dependencies:
+ is-descriptor "^0.1.0"
+
+define-property@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6"
+ integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY=
+ dependencies:
+ is-descriptor "^1.0.0"
+
+define-property@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d"
+ integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==
+ dependencies:
+ is-descriptor "^1.0.2"
+ isobject "^3.0.1"
+
defined@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
@@ -780,6 +1221,11 @@ end-stream@~0.1.0:
dependencies:
write-stream "~0.4.3"
+ent@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
+ integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0=
+
errno@~0.1.1:
version "0.1.8"
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
@@ -787,6 +1233,11 @@ errno@~0.1.1:
dependencies:
prr "~1.0.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=
+
es3ify@^0.1.3:
version "0.1.4"
resolved "https://registry.yarnpkg.com/es3ify/-/es3ify-0.1.4.tgz#ad9fa5df1ae34f3f31e1211b5818b2d51078dfd1"
@@ -860,6 +1311,48 @@ events@1.1.1:
resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=
+expand-brackets@^2.1.4:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
+ integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI=
+ dependencies:
+ debug "^2.3.3"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ posix-character-classes "^0.1.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
+extend-shallow@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
+ integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=
+ dependencies:
+ is-extendable "^0.1.0"
+
+extend-shallow@^3.0.0, extend-shallow@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8"
+ integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=
+ dependencies:
+ assign-symbols "^1.0.0"
+ is-extendable "^1.0.1"
+
+extglob@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
+ integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==
+ dependencies:
+ array-unique "^0.3.2"
+ define-property "^1.0.0"
+ expand-brackets "^2.1.4"
+ extend-shallow "^2.0.1"
+ fragment-cache "^0.2.1"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
falafel@^1.0.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/falafel/-/falafel-1.2.0.tgz#c18d24ef5091174a497f318cd24b026a25cddab4"
@@ -870,6 +1363,13 @@ 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-redact@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.0.0.tgz#ac2f9e36c9f4976f5db9fb18c6ffbaf308cf316d"
@@ -894,6 +1394,16 @@ fetch-cookie@0.10.1:
dependencies:
tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0"
+fill-range@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7"
+ integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+ to-regex-range "^2.1.0"
+
fill-range@^7.0.1:
version "7.0.1"
resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40"
@@ -906,6 +1416,18 @@ flatstr@^1.0.12:
resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931"
integrity sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==
+for-in@^1.0.1, 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"
@@ -916,11 +1438,23 @@ formidable@^1.1.1:
resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9"
integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==
+fragment-cache@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19"
+ integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=
+ dependencies:
+ map-cache "^0.2.2"
+
fresh@~0.5.2:
version "0.5.2"
resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+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=
+
fsevents@~2.3.1:
version "2.3.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
@@ -931,6 +1465,14 @@ functional-red-black-tree@^1.0.1:
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+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@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
@@ -945,6 +1487,11 @@ get-stream@^5.1.0:
dependencies:
pump "^3.0.0"
+get-value@^2.0.3, get-value@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
+ integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+
glob-parent@~5.1.0:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@@ -1009,6 +1556,35 @@ graceful-fs@^4.1.2:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+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-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.7"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1"
+ integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==
+ 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"
+
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@@ -1019,11 +1595,83 @@ has-flag@^4.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+has-value@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
+ integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=
+ dependencies:
+ get-value "^2.0.3"
+ has-values "^0.1.4"
+ isobject "^2.0.0"
+
+has-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177"
+ integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=
+ dependencies:
+ get-value "^2.0.6"
+ has-values "^1.0.0"
+ isobject "^3.0.0"
+
+has-values@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
+ integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E=
+
+has-values@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f"
+ integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=
+ dependencies:
+ is-number "^3.0.0"
+ kind-of "^4.0.0"
+
has-yarn@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
+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==
+
+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"
@@ -1132,7 +1780,12 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.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.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"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
@@ -1160,6 +1813,20 @@ inline-process-browser@^1.0.0:
falafel "^1.0.1"
through2 "^0.6.5"
+is-accessor-descriptor@^0.1.6:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6"
+ integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-accessor-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656"
+ integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==
+ dependencies:
+ kind-of "^6.0.0"
+
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"
@@ -1167,6 +1834,11 @@ is-binary-path@~2.1.0:
dependencies:
binary-extensions "^2.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"
+ integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
+
is-ci@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c"
@@ -1179,6 +1851,57 @@ is-class-hotfix@~0.0.6:
resolved "https://registry.yarnpkg.com/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz#a527d31fb23279281dde5f385c77b5de70a72435"
integrity sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==
+is-data-descriptor@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
+ integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=
+ dependencies:
+ kind-of "^3.0.2"
+
+is-data-descriptor@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7"
+ integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==
+ dependencies:
+ kind-of "^6.0.0"
+
+is-descriptor@^0.1.0:
+ version "0.1.6"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca"
+ integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==
+ dependencies:
+ is-accessor-descriptor "^0.1.6"
+ is-data-descriptor "^0.1.4"
+ kind-of "^5.0.0"
+
+is-descriptor@^1.0.0, is-descriptor@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec"
+ integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==
+ dependencies:
+ is-accessor-descriptor "^1.0.0"
+ is-data-descriptor "^1.0.0"
+ kind-of "^6.0.2"
+
+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"
+ integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=
+
+is-extendable@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4"
+ integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==
+ dependencies:
+ is-plain-object "^2.0.4"
+
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@@ -1199,7 +1922,7 @@ is-generator-function@^1.0.7:
resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.8.tgz#dfb5c2b120e02b0a8d9d2c6806cd5621aa922f7b"
integrity sha512-2Omr/twNtufVZFr1GhxjOMFPAj2sjc/dKaIqBhvo4qciXfJmITGH6ZGd8eZYNHza8t1y0e01AuqRhJwfWp26WQ==
-is-glob@^4.0.1, is-glob@~4.0.1:
+is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
@@ -1219,6 +1942,25 @@ is-npm@^4.0.0:
resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-4.0.0.tgz#c90dd8380696df87a7a6d823c20d0b12bbe3c84d"
integrity sha512-96ECIfh9xtDDlPylNPXhzjsykHsMJZ18ASpaWzQyBr4YRTcVjUvzaHayDAES2oU/3KpljhHUjtSRNiDwi0F0ig==
+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"
+ integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=
+ 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"
@@ -1229,11 +1971,32 @@ is-obj@^2.0.0:
resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz#473fb05d973705e3fd9620545018ca8e22ef4982"
integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==
+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.3"
resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283"
integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==
+is-plain-object@^2.0.3, is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+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-type-of@^1.0.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/is-type-of/-/is-type-of-1.2.1.tgz#e263ec3857aceb4f28c47130ec78db09a920f8c5"
@@ -1248,6 +2011,11 @@ is-typedarray@^1.0.0:
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+is-windows@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
+ integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+
is-yarn-global@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
@@ -1258,11 +2026,28 @@ isarray@0.0.1:
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
-isarray@^1.0.0:
+isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
+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"
+ integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
+ dependencies:
+ isarray "1.0.0"
+
+isobject@^3.0.0, isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
+ integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+
isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@@ -1373,6 +2158,30 @@ keyv@^4.0.0:
dependencies:
json-buffer "3.0.1"
+kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.1.0, 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=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57"
+ integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc=
+ dependencies:
+ is-buffer "^1.1.5"
+
+kind-of@^5.0.0, kind-of@^5.0.2:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
+ integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
+
+kind-of@^6.0.0, kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
koa-body@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/koa-body/-/koa-body-4.2.0.tgz#37229208b820761aca5822d14c5fc55cee31b26f"
@@ -1495,6 +2304,13 @@ latest-version@^5.0.0:
dependencies:
package-json "^6.3.0"
+lazy-cache@^2.0.1:
+ 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"
+
level-codec@9.0.2, level-codec@^9.0.0:
version "9.0.2"
resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc"
@@ -1599,6 +2415,11 @@ lie@3.0.4:
inline-process-browser "^1.0.0"
unreachable-branch-transform "^0.3.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.includes@^4.3.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
@@ -1634,6 +2455,55 @@ lodash.once@^4.0.0:
resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
integrity sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=
+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@^4.17.20:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+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"
+
lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
@@ -1656,6 +2526,18 @@ make-dir@^3.0.0:
dependencies:
semver "^6.0.0"
+map-cache@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
+ integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=
+
+map-visit@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f"
+ integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=
+ dependencies:
+ object-visit "^1.0.0"
+
media-typer@0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@@ -1678,6 +2560,25 @@ methods@^1.1.2:
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+micromatch@^3.1.4:
+ version "3.1.10"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
+ integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ braces "^2.3.1"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ extglob "^2.0.4"
+ fragment-cache "^0.2.1"
+ kind-of "^6.0.2"
+ nanomatch "^1.2.9"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.2"
+
mime-db@1.44.0:
version "1.44.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
@@ -1717,6 +2618,14 @@ minimist@^1.2.0, minimist@^1.2.5:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+mixin-deep@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566"
+ integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==
+ dependencies:
+ for-in "^1.0.2"
+ is-extendable "^1.0.1"
+
mkdirp@^0.5.0:
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
@@ -1724,6 +2633,11 @@ mkdirp@^0.5.0:
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==
+
mri@1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/mri/-/mri-1.1.4.tgz#7cb1dd1b9b40905f1fac053abe25b6720f44744a"
@@ -1744,6 +2658,23 @@ ms@^2.1.1:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+nanomatch@^1.2.9:
+ version "1.2.13"
+ resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119"
+ integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==
+ dependencies:
+ arr-diff "^4.0.0"
+ array-unique "^0.3.2"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ fragment-cache "^0.2.1"
+ is-windows "^1.0.2"
+ kind-of "^6.0.2"
+ object.pick "^1.3.0"
+ regex-not "^1.0.0"
+ snapdragon "^0.8.1"
+ to-regex "^3.0.1"
+
napi-macros@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b"
@@ -1754,6 +2685,11 @@ 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==
+
node-fetch@2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
@@ -1769,6 +2705,11 @@ node-gyp-build@~4.1.0:
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb"
integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==
+nodemailer@^6.5.0:
+ version "6.5.0"
+ resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.5.0.tgz#d12c28d8d48778918e25f1999d97910231b175d9"
+ integrity sha512-Tm4RPrrIZbnqDKAvX+/4M+zovEReiKlEXWDzG4iwtpL9X34MJY+D5LnQPH/+eghe8DLlAVshHAJZAZWBGhkguw==
+
nodemon@^2.0.7:
version "2.0.7"
resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-2.0.7.tgz#6f030a0a0ebe3ea1ba2a38f71bf9bab4841ced32"
@@ -1812,11 +2753,34 @@ object-assign@^2.0.0:
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-2.1.1.tgz#43c36e5d569ff8e4816c4efa8be02d26967c18aa"
integrity sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=
+object-copy@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
+ integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw=
+ dependencies:
+ copy-descriptor "^0.1.0"
+ define-property "^0.2.5"
+ kind-of "^3.0.3"
+
object-keys@^1.0.6:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+object-visit@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb"
+ integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=
+ dependencies:
+ isobject "^3.0.0"
+
+object.pick@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747"
+ integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=
+ dependencies:
+ isobject "^3.0.1"
+
on-finished@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
@@ -1861,6 +2825,11 @@ parseurl@^1.3.2:
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+pascalcase@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
+ integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+
passport-google-oauth1@1.x.x:
version "1.0.0"
resolved "https://registry.yarnpkg.com/passport-google-oauth1/-/passport-google-oauth1-1.0.0.tgz#af74a803df51ec646f66a44d82282be6f108e0cc"
@@ -1996,6 +2965,11 @@ pino@^6.0.0:
quick-format-unescaped "^4.0.1"
sonic-boom "^1.0.2"
+posix-character-classes@^0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
+ integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
+
pouchdb-adapter-leveldb-core@7.2.2:
version "7.2.2"
resolved "https://registry.yarnpkg.com/pouchdb-adapter-leveldb-core/-/pouchdb-adapter-leveldb-core-7.2.2.tgz#e0aa6a476e2607d7ae89f4a803c9fba6e6d05a8a"
@@ -2144,6 +3118,11 @@ private@^0.1.6, private@~0.1.5:
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
prr@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
@@ -2268,6 +3247,19 @@ readable-stream@~0.0.2:
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-0.0.4.tgz#f32d76e3fb863344a548d79923007173665b3b8d"
integrity sha1-8y124/uGM0SlSNeZIwBxc2ZbO40=
+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==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
readdirp@~3.5.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.5.0.tgz#9ba74c019b15d365278d2e91bb8c48d7b4d42c9e"
@@ -2295,6 +3287,14 @@ recast@^0.11.17:
private "~0.1.5"
source-map "~0.5.0"
+regex-not@^1.0.0, regex-not@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c"
+ integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==
+ dependencies:
+ extend-shallow "^3.0.2"
+ safe-regex "^1.1.0"
+
registry-auth-token@^4.0.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250"
@@ -2309,6 +3309,31 @@ 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"
+
+repeat-element@^1.1.2:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
+ integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==
+
+repeat-string@^1.6.1:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
+ integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+
resolve-alpn@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.0.0.tgz#745ad60b3d6aff4b4a48e01b8c0bdc70959e0e8c"
@@ -2322,6 +3347,11 @@ resolve-path@^1.4.0:
http-errors "~1.6.2"
path-is-absolute "1.0.1"
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
+ integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+
responselike@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
@@ -2336,7 +3366,12 @@ responselike@^2.0.0:
dependencies:
lowercase-keys "^2.0.0"
-safe-buffer@5.1.2, safe-buffer@~5.1.1:
+ret@~0.1.10:
+ version "0.1.15"
+ resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
+ integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
@@ -2346,6 +3381,13 @@ safe-buffer@^5.0.1, safe-buffer@~5.2.0:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+safe-regex@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
+ integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4=
+ dependencies:
+ ret "~0.1.10"
+
"safer-buffer@>= 2.1.2 < 3":
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
@@ -2361,6 +3403,11 @@ sax@>=0.6.0:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+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-diff@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
@@ -2383,6 +3430,23 @@ server-destroy@^1.0.1:
resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd"
integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=
+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"
+ integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==
+ dependencies:
+ extend-shallow "^2.0.1"
+ is-extendable "^0.1.1"
+ is-plain-object "^2.0.3"
+ split-string "^3.0.1"
+
setprototypeof@1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
@@ -2403,6 +3467,36 @@ signal-exit@^3.0.2:
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+snapdragon-node@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
+ integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==
+ dependencies:
+ define-property "^1.0.0"
+ isobject "^3.0.0"
+ snapdragon-util "^3.0.1"
+
+snapdragon-util@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2"
+ integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==
+ dependencies:
+ kind-of "^3.2.0"
+
+snapdragon@^0.8.1:
+ version "0.8.2"
+ resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d"
+ integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==
+ dependencies:
+ base "^0.11.1"
+ debug "^2.2.0"
+ define-property "^0.2.5"
+ extend-shallow "^2.0.1"
+ map-cache "^0.2.2"
+ source-map "^0.5.6"
+ source-map-resolve "^0.5.0"
+ use "^3.1.0"
+
sonic-boom@^1.0.2:
version "1.3.0"
resolved "https://registry.yarnpkg.com/sonic-boom/-/sonic-boom-1.3.0.tgz#5c77c846ce6c395dddf2eb8e8e65f9cc576f2e76"
@@ -2411,6 +3505,22 @@ sonic-boom@^1.0.2:
atomic-sleep "^1.0.0"
flatstr "^1.0.12"
+source-map-resolve@^0.5.0:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
source-map@0.1.31:
version "0.1.31"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.31.tgz#9f704d0d69d9e138a81badf6ebb4fde33d151c61"
@@ -2425,16 +3535,28 @@ source-map@^0.4.2:
dependencies:
amdefine ">=0.0.4"
-source-map@~0.5.0:
+source-map@^0.5.6, source-map@~0.5.0:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
spark-md5@3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.1.tgz#83a0e255734f2ab4e5c466e5a2cfc9ba2aa2124d"
integrity sha512-0tF3AGSD1ppQeuffsLDIOWlKUd3lS92tFxcsrh5Pe3ZphhnoK+oXIBTzOAThZCiuINZLvpiLH/1VS1/ANEJVig==
+split-string@^3.0.1, split-string@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
+ integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==
+ dependencies:
+ extend-shallow "^3.0.0"
+
split2@^3.1.1:
version "3.2.2"
resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f"
@@ -2442,6 +3564,19 @@ split2@^3.1.1:
dependencies:
readable-stream "^3.0.0"
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+static-extend@^0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
+ integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=
+ dependencies:
+ define-property "^0.2.5"
+ object-copy "^0.1.0"
+
"statuses@>= 1.4.0 < 2", "statuses@>= 1.5.0 < 2", statuses@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
@@ -2482,6 +3617,13 @@ string_decoder@~0.10.x:
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
+string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
strip-ansi@^5.1.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae"
@@ -2506,6 +3648,11 @@ strip-json-comments@~2.0.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+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"
@@ -2516,6 +3663,11 @@ 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=
+
supports-color@^5.3.0, supports-color@^5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
@@ -2551,21 +3703,54 @@ through2@^0.6.2, through2@^0.6.5:
readable-stream ">=1.0.33-1 <1.1.0-0"
xtend ">=4.0.0 <4.1.0-0"
+through2@^2.0.0:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
+ integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==
+ dependencies:
+ readable-stream "~2.3.6"
+ xtend "~4.0.1"
+
through@~2.3.4:
version "2.3.8"
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=
+
tiny-queue@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.1.tgz#25a67f2c6e253b2ca941977b5ef7442ef97a6046"
integrity sha1-JaZ/LG4lOyypQZd7XvdELvl6YEY=
+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-object-path@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af"
+ integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=
+ dependencies:
+ kind-of "^3.0.2"
+
to-readable-stream@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771"
integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==
+to-regex-range@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38"
+ integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=
+ dependencies:
+ is-number "^3.0.0"
+ repeat-string "^1.6.1"
+
to-regex-range@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
@@ -2573,6 +3758,16 @@ to-regex-range@^5.0.1:
dependencies:
is-number "^7.0.0"
+to-regex@^3.0.1, to-regex@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce"
+ integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==
+ dependencies:
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ regex-not "^1.0.2"
+ safe-regex "^1.1.0"
+
toidentifier@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
@@ -2619,6 +3814,18 @@ typedarray-to-buffer@^3.1.5:
dependencies:
is-typedarray "^1.0.0"
+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.13.4"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.13.4.tgz#592588bb9f47ae03b24916e2471218d914955574"
+ integrity sha512-kv7fCkIXyQIilD5/yQy8O+uagsYIOt5cZvs890W40/e/rvjMSzJw81o9Bg0tkURxzZBROtDQhW2LFjOGoK3RZw==
+
uid2@0.0.x:
version "0.0.3"
resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.3.tgz#483126e11774df2f71b8b639dcd799c376162b82"
@@ -2631,6 +3838,16 @@ undefsafe@^2.0.3:
dependencies:
debug "^2.2.0"
+union-value@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847"
+ integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==
+ dependencies:
+ arr-union "^3.1.0"
+ get-value "^2.0.6"
+ is-extendable "^0.1.1"
+ set-value "^2.0.1"
+
unique-string@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d"
@@ -2657,6 +3874,14 @@ unreachable-branch-transform@^0.3.0:
recast "^0.10.1"
through2 "^0.6.2"
+unset-value@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559"
+ integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=
+ dependencies:
+ has-value "^0.3.1"
+ isobject "^3.0.0"
+
update-notifier@^4.1.0:
version "4.1.3"
resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-4.1.3.tgz#be86ee13e8ce48fb50043ff72057b5bd598e1ea3"
@@ -2681,6 +3906,11 @@ urijs@^1.19.2:
resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.2.tgz#f9be09f00c4c5134b7cb3cf475c1dd394526265a"
integrity sha512-s/UIq9ap4JPZ7H1EB5ULo/aOUbWqfDi7FKzMC2Nz+0Si8GiT1rIEaprt8hy3Vy2Ex2aJPpOQv4P4DuOZ+K1c6w==
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72"
+ integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=
+
url-parse-lax@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c"
@@ -2696,7 +3926,12 @@ url@0.10.3:
punycode "1.3.2"
querystring "0.2.0"
-util-deprecate@^1.0.1:
+use@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f"
+ integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==
+
+util-deprecate@^1.0.1, util-deprecate@~1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
@@ -2731,6 +3966,11 @@ vuvuzela@1.0.3:
resolved "https://registry.yarnpkg.com/vuvuzela/-/vuvuzela-1.0.3.tgz#3be145e58271c73ca55279dd851f12a682114b0b"
integrity sha1-O+FF5YJxxzylUnndhR8SpoIRSws=
+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=
+
widest-line@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
@@ -2738,6 +3978,11 @@ widest-line@^3.1.0:
dependencies:
string-width "^4.0.0"
+wordwrap@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+ integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@@ -2778,11 +4023,16 @@ xmlbuilder@~9.0.1:
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
-"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.2, xtend@~4.0.0:
+"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+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 61ed6cf2bcfb05d068a6bb30113f2a1717ed575b Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Fri, 23 Apr 2021 13:49:47 +0100
Subject: [PATCH 125/135] Updating config management for SMTP as well as
finalising the work around generating and sending emails.
---
.../src/api/controllers/admin/configs.js | 9 +++++
.../worker/src/api/controllers/admin/email.js | 34 +++++++++++--------
.../worker/src/api/routes/admin/configs.js | 4 ++-
packages/worker/src/api/routes/admin/email.js | 7 ++--
packages/worker/src/utilities/email.js | 21 ++++++++++++
5 files changed, 58 insertions(+), 17 deletions(-)
create mode 100644 packages/worker/src/utilities/email.js
diff --git a/packages/worker/src/api/controllers/admin/configs.js b/packages/worker/src/api/controllers/admin/configs.js
index df19dc9a5..5ca216878 100644
--- a/packages/worker/src/api/controllers/admin/configs.js
+++ b/packages/worker/src/api/controllers/admin/configs.js
@@ -5,6 +5,8 @@ const {
getConfigParams,
determineScopedConfig,
} = require("@budibase/auth").db
+const { Configs } = require("../../../constants")
+const email = require("../../../utilities/email")
const GLOBAL_DB = StaticDatabases.GLOBAL.name
@@ -22,6 +24,13 @@ exports.save = async function(ctx) {
})
}
+ // verify the configuration
+ switch (type) {
+ case Configs.SMTP:
+ await email.verifyConfig(configDoc)
+ break;
+ }
+
try {
const response = await db.post(configDoc)
ctx.body = {
diff --git a/packages/worker/src/api/controllers/admin/email.js b/packages/worker/src/api/controllers/admin/email.js
index 6c9343ea5..075559684 100644
--- a/packages/worker/src/api/controllers/admin/email.js
+++ b/packages/worker/src/api/controllers/admin/email.js
@@ -1,10 +1,14 @@
const CouchDB = require("../../../db")
const { StaticDatabases, determineScopedConfig } = require("@budibase/auth").db
-const { EmailTemplatePurpose, TemplateTypes, Configs } = require("../../../constants")
+const {
+ EmailTemplatePurpose,
+ TemplateTypes,
+ Configs,
+} = require("../../../constants")
const { getTemplateByPurpose } = require("../../../constants/templates")
const { getSettingsTemplateContext } = require("../../../utilities/templates")
const { processString } = require("@budibase/string-templates")
-const nodemailer = require("nodemailer")
+const { createSMTPTransport } = require("../../../utilities/email")
const GLOBAL_DB = StaticDatabases.GLOBAL.name
const TYPE = TemplateTypes.EMAIL
@@ -14,15 +18,7 @@ const FULL_EMAIL_PURPOSES = [
EmailTemplatePurpose.PASSWORD_RECOVERY,
]
-function createSMTPTransport(config) {
- const transport = nodemailer.createTransport({
- port: config.port,
- host: config.host,
-
- })
-}
-
-exports.buildEmail = async (email, user, purpose) => {
+async function buildEmail(purpose, email, user) {
// this isn't a full email
if (FULL_EMAIL_PURPOSES.indexOf(purpose) === -1) {
throw `Unable to build an email of type ${purpose}`
@@ -37,7 +33,7 @@ exports.buildEmail = async (email, user, purpose) => {
const context = {
...(await getSettingsTemplateContext()),
email,
- user,
+ user: user || {},
}
body = await processString(body, context)
@@ -51,14 +47,24 @@ exports.buildEmail = async (email, user, purpose) => {
}
exports.sendEmail = async ctx => {
- const { groupId, email, purpose } = ctx.request.body
+ const { groupId, email, userId, purpose } = ctx.request.body
const db = new CouchDB(GLOBAL_DB)
const params = {}
if (groupId) {
params.group = groupId
}
params.type = Configs.SMTP
+ let user = {}
+ if (userId) {
+ user = db.get(userId)
+ }
const config = await determineScopedConfig(db, params)
const transport = createSMTPTransport(config)
+ const message = {
+ from: config.from,
+ subject: config.subject,
+ to: email,
+ html: await buildEmail(purpose, email, user),
+ }
+ await transport.sendMail(message)
}
-
diff --git a/packages/worker/src/api/routes/admin/configs.js b/packages/worker/src/api/routes/admin/configs.js
index d64900cec..0b8c9626d 100644
--- a/packages/worker/src/api/routes/admin/configs.js
+++ b/packages/worker/src/api/routes/admin/configs.js
@@ -10,7 +10,9 @@ function smtpValidation() {
return Joi.object({
port: Joi.number().required(),
host: Joi.string().required(),
- from: Joi.string().email().required(),
+ from: Joi.string()
+ .email()
+ .required(),
secure: Joi.boolean().optional(),
selfSigned: Joi.boolean().optional(),
auth: Joi.object({
diff --git a/packages/worker/src/api/routes/admin/email.js b/packages/worker/src/api/routes/admin/email.js
index 4a122f479..66079c5fb 100644
--- a/packages/worker/src/api/routes/admin/email.js
+++ b/packages/worker/src/api/routes/admin/email.js
@@ -15,7 +15,10 @@ function buildEmailSendValidation() {
}).required().unknown(true))
}
-router
- .post("/api/admin/email/send", buildEmailSendValidation(), controller.sendEmail)
+router.post(
+ "/api/admin/email/send",
+ buildEmailSendValidation(),
+ controller.sendEmail
+)
module.exports = router
diff --git a/packages/worker/src/utilities/email.js b/packages/worker/src/utilities/email.js
new file mode 100644
index 000000000..bc3933531
--- /dev/null
+++ b/packages/worker/src/utilities/email.js
@@ -0,0 +1,21 @@
+const nodemailer = require("nodemailer")
+
+exports.createSMTPTransport = (config) => {
+ const options = {
+ port: config.port,
+ host: config.host,
+ secure: config.secure || false,
+ auth: config.auth,
+ }
+ if (config.selfSigned) {
+ options.tls = {
+ rejectUnauthorized: false,
+ }
+ }
+ return nodemailer.createTransport(options)
+}
+
+exports.verifyConfig = async config => {
+ const transport = exports.createSMTPTransport(config)
+ await transport.verify()
+}
From 46c9df6245899016deaa913a549e897cf6416e10 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Fri, 23 Apr 2021 14:58:06 +0100
Subject: [PATCH 126/135] Adding testing to worker, still WIP.
---
packages/auth/src/index.js | 1 +
packages/server/package.json | 1 -
.../src/tests/utilities/TestConfiguration.js | 2 +-
packages/worker/package.json | 4 +-
.../src/api/controllers/admin/configs.js | 14 +-
.../worker/src/api/routes/admin/configs.js | 7 +-
.../worker/src/api/routes/tests/email.spec.js | 31 +
.../tests/utilities/TestConfiguration.js | 78 +
.../api/routes/tests/utilities/controllers.js | 7 +
.../src/api/routes/tests/utilities/index.js | 30 +
packages/worker/yarn.lock | 2738 ++++++++++++++++-
11 files changed, 2874 insertions(+), 39 deletions(-)
create mode 100644 packages/worker/src/api/routes/tests/email.spec.js
create mode 100644 packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
create mode 100644 packages/worker/src/api/routes/tests/utilities/controllers.js
create mode 100644 packages/worker/src/api/routes/tests/utilities/index.js
diff --git a/packages/auth/src/index.js b/packages/auth/src/index.js
index c1e0a0824..5be91cc10 100644
--- a/packages/auth/src/index.js
+++ b/packages/auth/src/index.js
@@ -36,6 +36,7 @@ module.exports = {
buildAuthMiddleware: authenticated,
passport,
google,
+ jwt,
},
StaticDatabases,
constants: require("./constants"),
diff --git a/packages/server/package.json b/packages/server/package.json
index 90b626b6c..eadef1952 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -103,7 +103,6 @@
"jimp": "0.16.1",
"joi": "17.2.1",
"jsonschema": "1.4.0",
- "jsonwebtoken": "8.5.1",
"koa": "2.7.0",
"koa-body": "4.2.0",
"koa-compress": "4.0.1",
diff --git a/packages/server/src/tests/utilities/TestConfiguration.js b/packages/server/src/tests/utilities/TestConfiguration.js
index 630ea4256..0b19a74b9 100644
--- a/packages/server/src/tests/utilities/TestConfiguration.js
+++ b/packages/server/src/tests/utilities/TestConfiguration.js
@@ -1,5 +1,4 @@
const { BUILTIN_ROLE_IDS } = require("../../utilities/security/roles")
-const jwt = require("jsonwebtoken")
const env = require("../../environment")
const {
basicTable,
@@ -16,6 +15,7 @@ const controllers = require("./controllers")
const supertest = require("supertest")
const { cleanup } = require("../../utilities/fileSystem")
const { Cookies } = require("@budibase/auth").constants
+const { jwt } = require("@budibase/auth").auth
const EMAIL = "babs@babs.com"
const PASSWORD = "babs_password"
diff --git a/packages/worker/package.json b/packages/worker/package.json
index b99b79ecc..f30455ca5 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -46,7 +46,9 @@
"server-destroy": "^1.0.1"
},
"devDependencies": {
+ "jest": "^26.6.3",
"nodemon": "^2.0.7",
- "pouchdb-adapter-memory": "^7.2.2"
+ "pouchdb-adapter-memory": "^7.2.2",
+ "supertest": "^6.1.3"
}
}
diff --git a/packages/worker/src/api/controllers/admin/configs.js b/packages/worker/src/api/controllers/admin/configs.js
index 5ca216878..dfd616fc6 100644
--- a/packages/worker/src/api/controllers/admin/configs.js
+++ b/packages/worker/src/api/controllers/admin/configs.js
@@ -12,12 +12,14 @@ const GLOBAL_DB = StaticDatabases.GLOBAL.name
exports.save = async function(ctx) {
const db = new CouchDB(GLOBAL_DB)
- const configDoc = ctx.request.body
- const { type, group, user } = configDoc
+ const { type, config } = ctx.request.body
+ const { group, user } = config
+ // insert the type into the doc
+ config.type = type
// Config does not exist yet
- if (!configDoc._id) {
- configDoc._id = generateConfigID({
+ if (!config._id) {
+ config._id = generateConfigID({
type,
group,
user,
@@ -27,12 +29,12 @@ exports.save = async function(ctx) {
// verify the configuration
switch (type) {
case Configs.SMTP:
- await email.verifyConfig(configDoc)
+ await email.verifyConfig(config)
break;
}
try {
- const response = await db.post(configDoc)
+ const response = await db.post(config)
ctx.body = {
type,
_id: response.id,
diff --git a/packages/worker/src/api/routes/admin/configs.js b/packages/worker/src/api/routes/admin/configs.js
index 0b8c9626d..826f9535c 100644
--- a/packages/worker/src/api/routes/admin/configs.js
+++ b/packages/worker/src/api/routes/admin/configs.js
@@ -7,12 +7,11 @@ const { Configs } = require("../../../constants")
const router = Router()
function smtpValidation() {
+ // prettier-ignore
return Joi.object({
port: Joi.number().required(),
host: Joi.string().required(),
- from: Joi.string()
- .email()
- .required(),
+ from: Joi.string().email().required(),
secure: Joi.boolean().optional(),
selfSigned: Joi.boolean().optional(),
auth: Joi.object({
@@ -24,6 +23,7 @@ function smtpValidation() {
}
function settingValidation() {
+ // prettier-ignore
return Joi.object({
url: Joi.string().valid("", null),
logoUrl: Joi.string().valid("", null),
@@ -32,6 +32,7 @@ function settingValidation() {
}
function googleValidation() {
+ // prettier-ignore
return Joi.object({
clientID: Joi.string().required(),
clientSecret: Joi.string().required(),
diff --git a/packages/worker/src/api/routes/tests/email.spec.js b/packages/worker/src/api/routes/tests/email.spec.js
new file mode 100644
index 000000000..2f571e86a
--- /dev/null
+++ b/packages/worker/src/api/routes/tests/email.spec.js
@@ -0,0 +1,31 @@
+const setup = require("./utilities")
+const { EmailTemplatePurpose } = require("../../../constants")
+
+// mock the email system
+const sendMailMock = jest.fn()
+jest.mock("nodemailer")
+const nodemailer = require("nodemailer")
+nodemailer.createTransport.mockReturnValue({"sendMail": sendMailMock});
+
+describe("/api/admin/email", () => {
+ let request = setup.getRequest()
+ let config = setup.getConfig()
+
+ afterAll(setup.afterAll)
+
+ it("should be able to send an email (with mocking)", async () => {
+ // initially configure settings
+ await config.saveSmtpConfig()
+ await config.saveSettingsConfig()
+ const res = await request
+ .post(`/api/admin/email/send`)
+ .send({
+ email: "test@test.com",
+ purpose: EmailTemplatePurpose.INVITATION,
+ })
+ .set(config.defaultHeaders())
+ .expect("Content-Type", /json/)
+ .expect(200)
+ expect(res.body._rev).toBeDefined()
+ })
+})
\ No newline at end of file
diff --git a/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js b/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
new file mode 100644
index 000000000..7266fe4fd
--- /dev/null
+++ b/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
@@ -0,0 +1,78 @@
+const env = require("../../environment")
+const controllers = require("./controllers")
+const supertest = require("supertest")
+const { jwt } = require("@budibase/auth").auth
+const { Cookies } = require("@budibase/auth").constants
+const { Configs } = require("../../../../constants")
+
+class TestConfiguration {
+ constructor(openServer = true) {
+ if (openServer) {
+ env.PORT = 4003
+ this.server = require("../../../../index")
+ // we need the request for logging in, involves cookies, hard to fake
+ this.request = supertest(this.server)
+ }
+ }
+
+ getRequest() {
+ return this.request
+ }
+
+ async _req(config, params, controlFunc) {
+ const request = {}
+ // fake cookies, we don't need them
+ request.cookies = { set: () => {}, get: () => {} }
+ request.config = { jwtSecret: env.JWT_SECRET }
+ request.appId = this.appId
+ request.user = { appId: this.appId }
+ request.request = {
+ body: config,
+ }
+ if (params) {
+ request.params = params
+ }
+ await controlFunc(request)
+ return request.body
+ }
+
+ defaultHeaders() {
+ const user = {
+ userId: "us_uuid1",
+ builder: {
+ global: true,
+ },
+ }
+ const authToken = jwt.sign(user, env.JWT_SECRET)
+ return {
+ Accept: "application/json",
+ Cookie: [
+ `${Cookies.Auth}=${authToken}`,
+ ],
+ }
+ }
+
+ async saveSettingsConfig() {
+ await this._req({
+ type: Configs.SETTINGS,
+ config: {
+ url: "http://localhost:10000",
+ logoUrl: "http://localhost:10000/logo",
+ company: "TestCompany",
+ }
+ }, null, controllers.config.save)
+ }
+
+ async saveSmtpConfig() {
+ await this._req({
+ type: Configs.SMTP,
+ config: {
+ url: "http://localhost:10000",
+ logoUrl: "http://localhost:10000/logo",
+ company: "TestCompany",
+ }
+ }, null, controllers.config.save)
+ }
+}
+
+module.exports = TestConfiguration
\ No newline at end of file
diff --git a/packages/worker/src/api/routes/tests/utilities/controllers.js b/packages/worker/src/api/routes/tests/utilities/controllers.js
new file mode 100644
index 000000000..e74e6dc35
--- /dev/null
+++ b/packages/worker/src/api/routes/tests/utilities/controllers.js
@@ -0,0 +1,7 @@
+module.exports = {
+ email: require("../../../controllers/admin/email"),
+ groups: require("../../../controllers/admin/groups"),
+ config: require("../../../controllers/admin/groups"),
+ templates: require("../../../controllers/admin/groups"),
+ users: require("../../../controllers/admin/groups"),
+}
diff --git a/packages/worker/src/api/routes/tests/utilities/index.js b/packages/worker/src/api/routes/tests/utilities/index.js
new file mode 100644
index 000000000..d63b837f6
--- /dev/null
+++ b/packages/worker/src/api/routes/tests/utilities/index.js
@@ -0,0 +1,30 @@
+const TestConfig = require("./TestConfiguration")
+
+let request, config
+
+exports.beforeAll = () => {
+ config = new TestConfig()
+ request = config.getRequest()
+}
+
+exports.afterAll = () => {
+ if (config) {
+ config.end()
+ }
+ request = null
+ config = null
+}
+
+exports.getRequest = () => {
+ if (!request) {
+ exports.beforeAll()
+ }
+ return request
+}
+
+exports.getConfig = () => {
+ if (!config) {
+ exports.beforeAll()
+ }
+ return config
+}
diff --git a/packages/worker/yarn.lock b/packages/worker/yarn.lock
index 4af1c1d9d..9510f6cd5 100644
--- a/packages/worker/yarn.lock
+++ b/packages/worker/yarn.lock
@@ -2,6 +2,291 @@
# yarn lockfile v1
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658"
+ integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==
+ dependencies:
+ "@babel/highlight" "^7.12.13"
+
+"@babel/compat-data@^7.13.15":
+ version "7.13.15"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.15.tgz#7e8eea42d0b64fda2b375b22d06c605222e848f4"
+ integrity sha512-ltnibHKR1VnrU4ymHyQ/CXtNXI6yZC0oJThyW78Hft8XndANwi+9H+UIklBDraIjFEJzw8wmcM427oDd9KS5wA==
+
+"@babel/core@^7.1.0", "@babel/core@^7.7.5":
+ version "7.13.16"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.16.tgz#7756ab24396cc9675f1c3fcd5b79fcce192ea96a"
+ integrity sha512-sXHpixBiWWFti0AV2Zq7avpTasr6sIAu7Y396c608541qAU2ui4a193m0KSQmfPSKFZLnQ3cvlKDOm3XkuXm3Q==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/generator" "^7.13.16"
+ "@babel/helper-compilation-targets" "^7.13.16"
+ "@babel/helper-module-transforms" "^7.13.14"
+ "@babel/helpers" "^7.13.16"
+ "@babel/parser" "^7.13.16"
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.13.15"
+ "@babel/types" "^7.13.16"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.1.2"
+ semver "^6.3.0"
+ source-map "^0.5.0"
+
+"@babel/generator@^7.13.16":
+ version "7.13.16"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.13.16.tgz#0befc287031a201d84cdfc173b46b320ae472d14"
+ integrity sha512-grBBR75UnKOcUWMp8WoDxNsWCFl//XCK6HWTrBQKTr5SV9f5g0pNOjdyzi/DTBv12S9GnYPInIXQBTky7OXEMg==
+ dependencies:
+ "@babel/types" "^7.13.16"
+ jsesc "^2.5.1"
+ source-map "^0.5.0"
+
+"@babel/helper-compilation-targets@^7.13.16":
+ version "7.13.16"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz#6e91dccf15e3f43e5556dffe32d860109887563c"
+ integrity sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==
+ dependencies:
+ "@babel/compat-data" "^7.13.15"
+ "@babel/helper-validator-option" "^7.12.17"
+ browserslist "^4.14.5"
+ semver "^6.3.0"
+
+"@babel/helper-function-name@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a"
+ integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==
+ dependencies:
+ "@babel/helper-get-function-arity" "^7.12.13"
+ "@babel/template" "^7.12.13"
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-get-function-arity@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583"
+ integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-member-expression-to-functions@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz#dfe368f26d426a07299d8d6513821768216e6d72"
+ integrity sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==
+ dependencies:
+ "@babel/types" "^7.13.12"
+
+"@babel/helper-module-imports@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz#c6a369a6f3621cb25da014078684da9196b61977"
+ integrity sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==
+ dependencies:
+ "@babel/types" "^7.13.12"
+
+"@babel/helper-module-transforms@^7.13.14":
+ version "7.13.14"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef"
+ integrity sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==
+ dependencies:
+ "@babel/helper-module-imports" "^7.13.12"
+ "@babel/helper-replace-supers" "^7.13.12"
+ "@babel/helper-simple-access" "^7.13.12"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+ "@babel/helper-validator-identifier" "^7.12.11"
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.13.13"
+ "@babel/types" "^7.13.14"
+
+"@babel/helper-optimise-call-expression@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea"
+ integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.8.0":
+ version "7.13.0"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af"
+ integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==
+
+"@babel/helper-replace-supers@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz#6442f4c1ad912502481a564a7386de0c77ff3804"
+ integrity sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==
+ dependencies:
+ "@babel/helper-member-expression-to-functions" "^7.13.12"
+ "@babel/helper-optimise-call-expression" "^7.12.13"
+ "@babel/traverse" "^7.13.0"
+ "@babel/types" "^7.13.12"
+
+"@babel/helper-simple-access@^7.13.12":
+ version "7.13.12"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz#dd6c538afb61819d205a012c31792a39c7a5eaf6"
+ integrity sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==
+ dependencies:
+ "@babel/types" "^7.13.12"
+
+"@babel/helper-split-export-declaration@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05"
+ integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==
+ dependencies:
+ "@babel/types" "^7.12.13"
+
+"@babel/helper-validator-identifier@^7.12.11":
+ version "7.12.11"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed"
+ integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==
+
+"@babel/helper-validator-option@^7.12.17":
+ version "7.12.17"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831"
+ integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==
+
+"@babel/helpers@^7.13.16":
+ version "7.13.17"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.13.17.tgz#b497c7a00e9719d5b613b8982bda6ed3ee94caf6"
+ integrity sha512-Eal4Gce4kGijo1/TGJdqp3WuhllaMLSrW6XcL0ulyUAQOuxHcCafZE8KHg9857gcTehsm/v7RcOx2+jp0Ryjsg==
+ dependencies:
+ "@babel/template" "^7.12.13"
+ "@babel/traverse" "^7.13.17"
+ "@babel/types" "^7.13.17"
+
+"@babel/highlight@^7.12.13":
+ version "7.13.10"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.13.10.tgz#a8b2a66148f5b27d666b15d81774347a731d52d1"
+ integrity sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.12.11"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.1.0", "@babel/parser@^7.12.13", "@babel/parser@^7.13.16":
+ version "7.13.16"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.13.16.tgz#0f18179b0448e6939b1f3f5c4c355a3a9bcdfd37"
+ integrity sha512-6bAg36mCwuqLO0hbR+z7PHuqWiCeP7Dzg73OpQwsAB1Eb8HnGEz5xYBzCfbu+YjoaJsJs+qheDxVAuqbt3ILEw==
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ version "7.8.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz#a983fb1aeb2ec3f6ed042a210f640e90e786fe0d"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-bigint@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz#4c9a6f669f5d0cdf1b90a1671e9a146be5300cea"
+ integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.8.3":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-import-meta@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
+ integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz#01ca21b668cd8218c9e640cb6dd88c5412b2c96a"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz#167ed70368886081f74b5c36c65a88c03b66d1a9"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.8.3":
+ version "7.10.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz#6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz#4f69c2ab95167e0180cd5336613f8c5788f7d48a"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-top-level-await@^7.8.3":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178"
+ integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/template@^7.12.13", "@babel/template@^7.3.3":
+ version "7.12.13"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327"
+ integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/parser" "^7.12.13"
+ "@babel/types" "^7.12.13"
+
+"@babel/traverse@^7.1.0", "@babel/traverse@^7.13.0", "@babel/traverse@^7.13.13", "@babel/traverse@^7.13.15", "@babel/traverse@^7.13.17":
+ version "7.13.17"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.13.17.tgz#c85415e0c7d50ac053d758baec98b28b2ecfeea3"
+ integrity sha512-BMnZn0R+X6ayqm3C3To7o1j7Q020gWdqdyP50KEoVqaCO2c/Im7sYZSmVgvefp8TTMQ+9CtwuBp0Z1CZ8V3Pvg==
+ dependencies:
+ "@babel/code-frame" "^7.12.13"
+ "@babel/generator" "^7.13.16"
+ "@babel/helper-function-name" "^7.12.13"
+ "@babel/helper-split-export-declaration" "^7.12.13"
+ "@babel/parser" "^7.13.16"
+ "@babel/types" "^7.13.17"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@^7.0.0", "@babel/types@^7.12.13", "@babel/types@^7.13.12", "@babel/types@^7.13.14", "@babel/types@^7.13.16", "@babel/types@^7.13.17", "@babel/types@^7.3.0", "@babel/types@^7.3.3":
+ version "7.13.17"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.17.tgz#48010a115c9fba7588b4437dd68c9469012b38b4"
+ integrity sha512-RawydLgxbOPDlTLJNtoIypwdmAy//uQIzlKt2+iBiJaRlVuI6QLUxVAyWGNfOzp8Yu4L4lLIacoCyTNtpb4wiA==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.12.11"
+ to-fast-properties "^2.0.0"
+
+"@bcoe/v8-coverage@^0.2.3":
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
+ integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+
"@budibase/handlebars-helpers@^0.11.3":
version "0.11.3"
resolved "https://registry.yarnpkg.com/@budibase/handlebars-helpers/-/handlebars-helpers-0.11.3.tgz#b6e5c91b83e8906e7d7ff10ddde277a3d561016e"
@@ -45,6 +330,14 @@
handlebars-utils "^1.0.6"
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"
+ integrity sha512-v9kIhKwjeZThiWrLmj0y17CWoyddASLj9O2yvbZkbvw/N3rWOYy9zkV66ursAoVr0mV15bL8g0c4QZUE6cdDoQ==
+ dependencies:
+ exec-sh "^0.3.2"
+ minimist "^1.2.0"
+
"@hapi/bourne@^2.0.0":
version "2.0.0"
resolved "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-2.0.0.tgz#5bb2193eb685c0007540ca61d166d4e1edaf918d"
@@ -62,6 +355,193 @@
dependencies:
"@hapi/hoek" "^9.0.0"
+"@istanbuljs/load-nyc-config@^1.0.0":
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced"
+ integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==
+ dependencies:
+ camelcase "^5.3.1"
+ find-up "^4.1.0"
+ get-package-type "^0.1.0"
+ js-yaml "^3.13.1"
+ resolve-from "^5.0.0"
+
+"@istanbuljs/schema@^0.1.2":
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
+ integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
+
+"@jest/console@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/console/-/console-26.6.2.tgz#4e04bc464014358b03ab4937805ee36a0aeb98f2"
+ integrity sha512-IY1R2i2aLsLr7Id3S6p2BA82GNWryt4oSvEXLAKc+L2zdi89dSkE8xC1C+0kpATG4JhBJREnQOH7/zmccM2B0g==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ jest-message-util "^26.6.2"
+ jest-util "^26.6.2"
+ slash "^3.0.0"
+
+"@jest/core@^26.6.3":
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/@jest/core/-/core-26.6.3.tgz#7639fcb3833d748a4656ada54bde193051e45fad"
+ integrity sha512-xvV1kKbhfUqFVuZ8Cyo+JPpipAHHAV3kcDBftiduK8EICXmTFddryy3P7NfZt8Pv37rA9nEJBKCCkglCPt/Xjw==
+ dependencies:
+ "@jest/console" "^26.6.2"
+ "@jest/reporters" "^26.6.2"
+ "@jest/test-result" "^26.6.2"
+ "@jest/transform" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ exit "^0.1.2"
+ graceful-fs "^4.2.4"
+ jest-changed-files "^26.6.2"
+ jest-config "^26.6.3"
+ jest-haste-map "^26.6.2"
+ jest-message-util "^26.6.2"
+ jest-regex-util "^26.0.0"
+ jest-resolve "^26.6.2"
+ jest-resolve-dependencies "^26.6.3"
+ jest-runner "^26.6.3"
+ jest-runtime "^26.6.3"
+ jest-snapshot "^26.6.2"
+ jest-util "^26.6.2"
+ jest-validate "^26.6.2"
+ jest-watcher "^26.6.2"
+ micromatch "^4.0.2"
+ p-each-series "^2.1.0"
+ rimraf "^3.0.0"
+ slash "^3.0.0"
+ strip-ansi "^6.0.0"
+
+"@jest/environment@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-26.6.2.tgz#ba364cc72e221e79cc8f0a99555bf5d7577cf92c"
+ integrity sha512-nFy+fHl28zUrRsCeMB61VDThV1pVTtlEokBRgqPrcT1JNq4yRNIyTHfyht6PqtUvY9IsuLGTrbG8kPXjSZIZwA==
+ dependencies:
+ "@jest/fake-timers" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ "@types/node" "*"
+ jest-mock "^26.6.2"
+
+"@jest/fake-timers@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-26.6.2.tgz#459c329bcf70cee4af4d7e3f3e67848123535aad"
+ integrity sha512-14Uleatt7jdzefLPYM3KLcnUl1ZNikaKq34enpb5XG9i81JpppDb5muZvonvKyrl7ftEHkKS5L5/eB/kxJ+bvA==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ "@sinonjs/fake-timers" "^6.0.1"
+ "@types/node" "*"
+ jest-message-util "^26.6.2"
+ jest-mock "^26.6.2"
+ jest-util "^26.6.2"
+
+"@jest/globals@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-26.6.2.tgz#5b613b78a1aa2655ae908eba638cc96a20df720a"
+ integrity sha512-85Ltnm7HlB/KesBUuALwQ68YTU72w9H2xW9FjZ1eL1U3lhtefjjl5c2MiUbpXt/i6LaPRvoOFJ22yCBSfQ0JIA==
+ dependencies:
+ "@jest/environment" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ expect "^26.6.2"
+
+"@jest/reporters@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-26.6.2.tgz#1f518b99637a5f18307bd3ecf9275f6882a667f6"
+ integrity sha512-h2bW53APG4HvkOnVMo8q3QXa6pcaNt1HkwVsOPMBV6LD/q9oSpxNSYZQYkAnjdMjrJ86UuYeLo+aEZClV6opnw==
+ dependencies:
+ "@bcoe/v8-coverage" "^0.2.3"
+ "@jest/console" "^26.6.2"
+ "@jest/test-result" "^26.6.2"
+ "@jest/transform" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ chalk "^4.0.0"
+ collect-v8-coverage "^1.0.0"
+ exit "^0.1.2"
+ glob "^7.1.2"
+ graceful-fs "^4.2.4"
+ istanbul-lib-coverage "^3.0.0"
+ istanbul-lib-instrument "^4.0.3"
+ istanbul-lib-report "^3.0.0"
+ istanbul-lib-source-maps "^4.0.0"
+ istanbul-reports "^3.0.2"
+ jest-haste-map "^26.6.2"
+ jest-resolve "^26.6.2"
+ jest-util "^26.6.2"
+ jest-worker "^26.6.2"
+ slash "^3.0.0"
+ source-map "^0.6.0"
+ string-length "^4.0.1"
+ terminal-link "^2.0.0"
+ v8-to-istanbul "^7.0.0"
+ optionalDependencies:
+ node-notifier "^8.0.0"
+
+"@jest/source-map@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-26.6.2.tgz#29af5e1e2e324cafccc936f218309f54ab69d535"
+ integrity sha512-YwYcCwAnNmOVsZ8mr3GfnzdXDAl4LaenZP5z+G0c8bzC9/dugL8zRmxZzdoTl4IaS3CryS1uWnROLPFmb6lVvA==
+ dependencies:
+ callsites "^3.0.0"
+ graceful-fs "^4.2.4"
+ source-map "^0.6.0"
+
+"@jest/test-result@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-26.6.2.tgz#55da58b62df134576cc95476efa5f7949e3f5f18"
+ integrity sha512-5O7H5c/7YlojphYNrK02LlDIV2GNPYisKwHm2QTKjNZeEzezCbwYs9swJySv2UfPMyZ0VdsmMv7jIlD/IKYQpQ==
+ dependencies:
+ "@jest/console" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ collect-v8-coverage "^1.0.0"
+
+"@jest/test-sequencer@^26.6.3":
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-26.6.3.tgz#98e8a45100863886d074205e8ffdc5a7eb582b17"
+ integrity sha512-YHlVIjP5nfEyjlrSr8t/YdNfU/1XEt7c5b4OxcXCjyRhjzLYu/rO69/WHPuYcbCWkz8kAeZVZp2N2+IOLLEPGw==
+ dependencies:
+ "@jest/test-result" "^26.6.2"
+ graceful-fs "^4.2.4"
+ jest-haste-map "^26.6.2"
+ jest-runner "^26.6.3"
+ jest-runtime "^26.6.3"
+
+"@jest/transform@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-26.6.2.tgz#5ac57c5fa1ad17b2aae83e73e45813894dcf2e4b"
+ integrity sha512-E9JjhUgNzvuQ+vVAL21vlyfy12gP0GhazGgJC4h6qUt1jSdUXGWJ1wfu/X7Sd8etSgxV4ovT1pb9v5D6QW4XgA==
+ dependencies:
+ "@babel/core" "^7.1.0"
+ "@jest/types" "^26.6.2"
+ babel-plugin-istanbul "^6.0.0"
+ chalk "^4.0.0"
+ convert-source-map "^1.4.0"
+ fast-json-stable-stringify "^2.0.0"
+ graceful-fs "^4.2.4"
+ jest-haste-map "^26.6.2"
+ jest-regex-util "^26.0.0"
+ jest-util "^26.6.2"
+ micromatch "^4.0.2"
+ pirates "^4.0.1"
+ slash "^3.0.0"
+ source-map "^0.6.1"
+ write-file-atomic "^3.0.0"
+
+"@jest/types@^26.6.2":
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/@jest/types/-/types-26.6.2.tgz#bef5a532030e1d88a2f5a6d933f84e97226ed48e"
+ integrity sha512-fC6QCp7Sc5sX6g8Tvbmj4XUTbyrik0akgRy03yjXbQaBWWNWGE7SGtJk98m0N8nzegD/7SggrUlivxo5ax4KWQ==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.0"
+ "@types/istanbul-reports" "^3.0.0"
+ "@types/node" "*"
+ "@types/yargs" "^15.0.0"
+ chalk "^4.0.0"
+
"@koa/router@^8.0.0":
version "8.0.8"
resolved "https://registry.yarnpkg.com/@koa/router/-/router-8.0.8.tgz#95f32d11373d03d89dcb63fabe9ac6f471095236"
@@ -101,6 +581,20 @@
resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.0.0.tgz#2ff674e9611b45b528896d820d3d7a812de2f0e4"
integrity sha512-FyD2meJpDPjyNQejSjvnhpgI/azsQkA4lGbuu5BQZfjvJ9cbRZXzeWL2HceCekW4lixO9JPesIIQkSoLjeJHNQ==
+"@sinonjs/commons@^1.7.0":
+ version "1.8.3"
+ resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d"
+ integrity sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==
+ dependencies:
+ type-detect "4.0.8"
+
+"@sinonjs/fake-timers@^6.0.1":
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-6.0.1.tgz#293674fccb3262ac782c7aadfdeca86b10c75c40"
+ integrity sha512-MZPUxrmFubI36XS1DI3qmI0YdN1gks62JtFZvxR67ljjSNCeK6U08Zx4msEWOXuofgqUt6zPHSi1H9fbjR/NRA==
+ dependencies:
+ "@sinonjs/commons" "^1.7.0"
+
"@szmarczak/http-timer@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421"
@@ -115,6 +609,39 @@
dependencies:
defer-to-connect "^2.0.0"
+"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7":
+ version "7.1.14"
+ resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.14.tgz#faaeefc4185ec71c389f4501ee5ec84b170cc402"
+ integrity sha512-zGZJzzBUVDo/eV6KgbE0f0ZI7dInEYvo12Rb70uNQDshC3SkRMb67ja0GgRHZgAX3Za6rhaWlvbDO8rrGyAb1g==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+ "@types/babel__generator" "*"
+ "@types/babel__template" "*"
+ "@types/babel__traverse" "*"
+
+"@types/babel__generator@*":
+ version "7.6.2"
+ resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.2.tgz#f3d71178e187858f7c45e30380f8f1b7415a12d8"
+ integrity sha512-MdSJnBjl+bdwkLskZ3NGFp9YcXGx5ggLpQQPqtgakVhsWK0hTtNYhjpZLlWQTviGTvF8at+Bvli3jV7faPdgeQ==
+ dependencies:
+ "@babel/types" "^7.0.0"
+
+"@types/babel__template@*":
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.0.tgz#0c888dd70b3ee9eebb6e4f200e809da0076262be"
+ integrity sha512-NTPErx4/FiPCGScH7foPyr+/1Dkzkni+rHiYHHoTjvwou7AQzJkNeD60A9CXRy+ZEN2B1bggmkTMCDb+Mv5k+A==
+ dependencies:
+ "@babel/parser" "^7.1.0"
+ "@babel/types" "^7.0.0"
+
+"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6":
+ version "7.11.1"
+ resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.11.1.tgz#654f6c4f67568e24c23b367e947098c6206fa639"
+ integrity sha512-Vs0hm0vPahPMYi9tDjtP66llufgO3ST16WXaSTtDGEl9cewAl3AibmxWw6TINOqHPT9z0uABKAYjT9jNSg4npw==
+ dependencies:
+ "@babel/types" "^7.3.0"
+
"@types/cacheable-request@^6.0.1":
version "6.0.1"
resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.1.tgz#5d22f3dded1fd3a84c0bbeb5039a7419c2c91976"
@@ -138,11 +665,37 @@
"@types/events" "*"
"@types/node" "*"
+"@types/graceful-fs@^4.1.2":
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15"
+ integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==
+ dependencies:
+ "@types/node" "*"
+
"@types/http-cache-semantics@*":
version "4.0.0"
resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a"
integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==
+"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1":
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762"
+ integrity sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==
+
+"@types/istanbul-lib-report@*":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686"
+ integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==
+ dependencies:
+ "@types/istanbul-lib-coverage" "*"
+
+"@types/istanbul-reports@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.0.tgz#508b13aa344fa4976234e75dddcc34925737d821"
+ integrity sha512-nwKNbvnwJ2/mndE9ItP/zc2TCzw6uuodnF4EHYWD+gCQDVBuRQL5UzbZD0/ezy1iKsFU2ZQiDqg4M9dN4+wZgA==
+ dependencies:
+ "@types/istanbul-lib-report" "*"
+
"@types/keyv@*":
version "3.1.1"
resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.1.tgz#e45a45324fca9dab716ab1230ee249c9fb52cfa7"
@@ -155,6 +708,16 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.14.tgz#f7fd5f3cc8521301119f63910f0fb965c7d761ae"
integrity sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==
+"@types/normalize-package-data@^2.4.0":
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz#e486d0d97396d79beedd0a6e33f4534ff6b4973e"
+ integrity sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==
+
+"@types/prettier@^2.0.0":
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.2.3.tgz#ef65165aea2924c9359205bf748865b8881753c0"
+ integrity sha512-PijRCG/K3s3w1We6ynUKdxEc5AcuuH3NBmMDP8uvKVp6X43UY7NQlTzczakXP3DJR0F4dfNQIGjU2cUeRYs2AA==
+
"@types/responselike@*", "@types/responselike@^1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.0.tgz#251f4fe7d154d2bad125abe1b429b23afd262e29"
@@ -162,6 +725,28 @@
dependencies:
"@types/node" "*"
+"@types/stack-utils@^2.0.0":
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff"
+ integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw==
+
+"@types/yargs-parser@*":
+ version "20.2.0"
+ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.0.tgz#dd3e6699ba3237f0348cd085e4698780204842f9"
+ integrity sha512-37RSHht+gzzgYeobbG+KWryeAW8J33Nhr69cjTqSYymXVZEN9NbRYWoYlRtDhHKPVT1FyNKwaTPC1NynKZpzRA==
+
+"@types/yargs@^15.0.0":
+ version "15.0.13"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.13.tgz#34f7fec8b389d7f3c1fd08026a5763e072d3c6dc"
+ integrity sha512-kQ5JNTrbDv3Rp5X2n/iUu37IJBDU2gsZ5R/g1/KHOOEc5IKfUFjXT6DENPGduh08I/pamwtEq4oul7gUqKTQDQ==
+ dependencies:
+ "@types/yargs-parser" "*"
+
+abab@^2.0.3, abab@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.5.tgz#c0b678fb32d60fc1219c784d6a826fe385aeb79a"
+ integrity sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==
+
abbrev@1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
@@ -211,6 +796,19 @@ accepts@^1.3.5:
mime-types "~2.1.24"
negotiator "0.6.2"
+acorn-globals@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-6.0.0.tgz#46cdd39f0f8ff08a876619b55f5ac8a6dc770b45"
+ integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==
+ dependencies:
+ acorn "^7.1.1"
+ acorn-walk "^7.1.1"
+
+acorn-walk@^7.1.1:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
+ integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
+
acorn@^1.0.3:
version "1.2.2"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-1.2.2.tgz#c8ce27de0acc76d896d2b1fad3df588d9e82f014"
@@ -221,6 +819,26 @@ acorn@^5.2.1:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e"
integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==
+acorn@^7.1.1:
+ version "7.4.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
+ integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
+
+acorn@^8.1.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.1.1.tgz#fb0026885b9ac9f48bac1e185e4af472971149ff"
+ integrity sha512-xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g==
+
+ajv@^6.12.3:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
amdefine@>=0.0.4:
version "1.0.1"
resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5"
@@ -357,6 +975,13 @@ ansi-dim@^0.1.1:
dependencies:
ansi-wrap "0.1.0"
+ansi-escapes@^4.2.1:
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
+ integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==
+ dependencies:
+ type-fest "^0.21.3"
+
ansi-gray@^0.1.1:
version "0.1.1"
resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251"
@@ -444,7 +1069,7 @@ ansi-styles@^3.2.1:
dependencies:
color-convert "^1.9.0"
-ansi-styles@^4.1.0:
+ansi-styles@^4.0.0, ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
@@ -482,6 +1107,22 @@ any-promise@^1.1.0:
resolved "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz#abc6afeedcea52e809cdc0376aed3ce39635d17f"
integrity sha1-q8av7tzqUugJzcA3au0845Y10X8=
+anymatch@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
+ integrity sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==
+ dependencies:
+ micromatch "^3.1.4"
+ normalize-path "^2.1.1"
+
+anymatch@^3.0.3:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
anymatch@~3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142"
@@ -490,7 +1131,7 @@ anymatch@~3.1.1:
normalize-path "^3.0.0"
picomatch "^2.0.4"
-argparse@^1.0.10:
+argparse@^1.0.10, 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==
@@ -541,6 +1182,18 @@ array-unique@^0.3.2:
resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428"
integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=
+asn1@~0.2.3:
+ version "0.2.4"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
+ integrity sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
assign-symbols@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
@@ -556,6 +1209,11 @@ ast-types@0.9.6:
resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9"
integrity sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
atob@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
@@ -588,6 +1246,77 @@ aws-sdk@^2.811.0:
uuid "3.3.2"
xml2js "0.4.19"
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+babel-jest@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-26.6.3.tgz#d87d25cb0037577a0c89f82e5755c5d293c01056"
+ integrity sha512-pl4Q+GAVOHwvjrck6jKjvmGhnO3jHX/xuB9d27f+EJZ/6k+6nMuPjorrYp7s++bKKdANwzElBWnLWaObvTnaZA==
+ dependencies:
+ "@jest/transform" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ "@types/babel__core" "^7.1.7"
+ babel-plugin-istanbul "^6.0.0"
+ babel-preset-jest "^26.6.2"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.4"
+ slash "^3.0.0"
+
+babel-plugin-istanbul@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765"
+ integrity sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.0.0"
+ "@istanbuljs/load-nyc-config" "^1.0.0"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-instrument "^4.0.0"
+ test-exclude "^6.0.0"
+
+babel-plugin-jest-hoist@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-26.6.2.tgz#8185bd030348d254c6d7dd974355e6a28b21e62d"
+ integrity sha512-PO9t0697lNTmcEHH69mdtYiOIkkOlj9fySqfO3K1eCcdISevLAE0xY59VLLUj0SoiPiTX/JU2CYFpILydUa5Lw==
+ dependencies:
+ "@babel/template" "^7.3.3"
+ "@babel/types" "^7.3.3"
+ "@types/babel__core" "^7.0.0"
+ "@types/babel__traverse" "^7.0.6"
+
+babel-preset-current-node-syntax@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"
+ integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==
+ dependencies:
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/plugin-syntax-bigint" "^7.8.3"
+ "@babel/plugin-syntax-class-properties" "^7.8.3"
+ "@babel/plugin-syntax-import-meta" "^7.8.3"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.8.3"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-top-level-await" "^7.8.3"
+
+babel-preset-jest@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-26.6.2.tgz#747872b1171df032252426586881d62d31798fee"
+ integrity sha512-YvdtlVm9t3k777c5NPQIv6cxFFFapys25HiUmuSgHwIZhfifweR5c5Sf5nwE3MAbfu327CYSvps8Yx6ANLyleQ==
+ dependencies:
+ babel-plugin-jest-hoist "^26.6.2"
+ babel-preset-current-node-syntax "^1.0.0"
+
balanced-match@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
@@ -626,6 +1355,13 @@ base@^0.11.1:
mixin-deep "^1.2.0"
pascalcase "^0.1.1"
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
bcryptjs@^2.4.3:
version "2.4.3"
resolved "https://registry.yarnpkg.com/bcryptjs/-/bcryptjs-2.4.3.tgz#9ab5627b93e60621ff7cdac5da9733027df1d0cb"
@@ -674,19 +1410,42 @@ braces@^2.3.1:
split-string "^3.0.2"
to-regex "^3.0.1"
-braces@~3.0.2:
+braces@^3.0.1, braces@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
dependencies:
fill-range "^7.0.1"
+browser-process-hrtime@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626"
+ integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==
+
+browserslist@^4.14.5:
+ version "4.16.5"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.5.tgz#952825440bca8913c62d0021334cbe928ef062ae"
+ integrity sha512-C2HAjrM1AI/djrpAUU/tr4pml1DqLIzJKSLDBXBrNErl9ZCCTXdhwxdJjYc16953+mBWf7Lw+uUJgpgb8cN71A==
+ dependencies:
+ caniuse-lite "^1.0.30001214"
+ colorette "^1.2.2"
+ electron-to-chromium "^1.3.719"
+ escalade "^3.1.1"
+ node-releases "^1.1.71"
+
+bser@2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05"
+ integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==
+ dependencies:
+ node-int64 "^0.4.0"
+
buffer-equal-constant-time@1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
integrity sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=
-buffer-from@1.1.1:
+buffer-from@1.1.1, buffer-from@^1.0.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
@@ -767,17 +1526,52 @@ cacheable-request@^7.0.1:
normalize-url "^4.1.0"
responselike "^2.0.0"
+call-bind@^1.0.0:
+ 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"
+ integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
+
camelcase@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42"
integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==
-camelcase@^5.3.1:
+camelcase@^5.0.0, camelcase@^5.3.1:
version "5.3.1"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
-chalk@2.4.2:
+camelcase@^6.0.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.0.tgz#924af881c9d525ac9d87f40d964e5cea982a1809"
+ integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==
+
+caniuse-lite@^1.0.30001214:
+ version "1.0.30001214"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001214.tgz#70f153c78223515c6d37a9fde6cd69250da9d872"
+ integrity sha512-O2/SCpuaU3eASWVaesQirZv1MSjUNOvmugaD8zNSJqw6Vv5SGwoOpA9LJs3pNPfM745nxqPvfZY3MQKY4AKHYg==
+
+capture-exit@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4"
+ integrity sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==
+ dependencies:
+ rsvp "^4.8.4"
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+chalk@2.4.2, chalk@^2.0.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@@ -802,6 +1596,11 @@ chalk@^4.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
+char-regex@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf"
+ integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==
+
chokidar@^3.2.2:
version "3.5.1"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.1.tgz#ee9ce7bbebd2b79f49f304799d5468e31e14e68a"
@@ -822,6 +1621,11 @@ ci-info@^2.0.0:
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==
+cjs-module-lexer@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-0.6.0.tgz#4186fcca0eae175970aee870b9fe2d6cf8d5655f"
+ integrity sha512-uc2Vix1frTfnuzxxu1Hp4ktSvM3QaI4oXl4ZUqL1wjTu/BGki9TrCWoqLTg/drR1KwAEarXuRFCG2Svr1GxPFw==
+
class-utils@^0.3.5:
version "0.3.6"
resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463"
@@ -837,6 +1641,15 @@ cli-boxes@^2.2.0:
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f"
integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==
+cliui@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1"
+ integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==
+ dependencies:
+ string-width "^4.2.0"
+ strip-ansi "^6.0.0"
+ wrap-ansi "^6.2.0"
+
clone-buffer@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
@@ -864,6 +1677,11 @@ co@^4.6.0:
resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184"
integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=
+collect-v8-coverage@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59"
+ integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==
+
collection-visit@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0"
@@ -896,6 +1714,18 @@ color-name@~1.1.4:
resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+colorette@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94"
+ integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==
+
+combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
commander@^2.5.0:
version "2.20.3"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
@@ -916,7 +1746,7 @@ commoner@^0.10.1:
q "^1.1.2"
recast "^0.11.17"
-component-emitter@^1.2.1:
+component-emitter@^1.2.1, component-emitter@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0"
integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==
@@ -964,6 +1794,18 @@ content-type@^1.0.4:
resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b"
integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442"
+ integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cookiejar@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
+ integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
+
cookies@~0.8.0:
version "0.8.0"
resolved "https://registry.yarnpkg.com/cookies/-/cookies-0.8.0.tgz#1293ce4b391740a8406e3c9870e828c4b54f3f90"
@@ -977,7 +1819,7 @@ copy-descriptor@^0.1.0:
resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
-core-util-is@^1.0.2, core-util-is@~1.0.0:
+core-util-is@1.0.2, core-util-is@^1.0.2, core-util-is@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
@@ -989,11 +1831,64 @@ crc@^3.4.4:
dependencies:
buffer "^5.1.0"
+cross-spawn@^6.0.0:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
+ integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cross-spawn@^7.0.0:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
crypto-random-string@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
+cssom@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.4.4.tgz#5a66cf93d2d0b661d80bf6a44fb65f5c2e4e0a10"
+ integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==
+
+cssom@~0.3.6:
+ version "0.3.8"
+ resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.8.tgz#9f1276f5b2b463f2114d3f2c75250af8c1a36f4a"
+ integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==
+
+cssstyle@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-2.3.0.tgz#ff665a0ddbdc31864b09647f34163443d90b0852"
+ integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==
+ dependencies:
+ cssom "~0.3.6"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+data-urls@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-2.0.0.tgz#156485a72963a970f5d5821aaf642bef2bf2db9b"
+ integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==
+ dependencies:
+ abab "^2.0.3"
+ whatwg-mimetype "^2.3.0"
+ whatwg-url "^8.0.0"
+
date.js@^0.3.1:
version "0.3.3"
resolved "https://registry.yarnpkg.com/date.js/-/date.js-0.3.3.tgz#ef1e92332f507a638795dbb985e951882e50bbda"
@@ -1025,7 +1920,7 @@ debug@^3.1.0, debug@^3.2.6:
dependencies:
ms "^2.1.1"
-debug@^4.1.1:
+debug@^4.1.0, debug@^4.1.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==
@@ -1039,6 +1934,16 @@ debug@~3.1.0:
dependencies:
ms "2.0.0"
+decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+decimal.js@^10.2.1:
+ version "10.2.1"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.2.1.tgz#238ae7b0f0c793d3e3cea410108b35a2c01426a3"
+ integrity sha512-KaL7+6Fw6i5A2XSnsbhm/6B+NuEA7TZ4vqxnd5tXz9sbKtrN9Srj8ab4vKVdK8YAqZO9P1kg45Y6YLoduPf+kw==
+
decode-uri-component@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545"
@@ -1068,6 +1973,16 @@ deep-extend@^0.6.0:
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
+deep-is@~0.1.3:
+ version "0.1.3"
+ resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34"
+ integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=
+
+deepmerge@^4.2.2:
+ version "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"
@@ -1120,6 +2035,11 @@ defined@^1.0.0:
resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693"
integrity sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
delegates@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
@@ -1140,6 +2060,11 @@ destroy@^1.0.4:
resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80"
integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+detect-newline@^3.0.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651"
+ integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==
+
detective@^4.3.1:
version "4.7.1"
resolved "https://registry.yarnpkg.com/detective/-/detective-4.7.1.tgz#0eca7314338442febb6d65da54c10bb1c82b246e"
@@ -1148,6 +2073,18 @@ detective@^4.3.1:
acorn "^5.2.1"
defined "^1.0.0"
+diff-sequences@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1"
+ integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==
+
+domexception@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
+ integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==
+ dependencies:
+ webidl-conversions "^5.0.0"
+
dot-prop@^5.2.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.3.0.tgz#90ccce708cd9cd82cc4dc8c3ddd9abdd55b20e88"
@@ -1170,6 +2107,14 @@ duplexer3@^0.1.4:
resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2"
integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
ecdsa-sig-formatter@1.0.11:
version "1.0.11"
resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
@@ -1182,6 +2127,16 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+electron-to-chromium@^1.3.719:
+ version "1.3.720"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.720.tgz#f5d66df8754d993006b7b2ded15ff7738c58bd94"
+ integrity sha512-B6zLTxxaOFP4WZm6DrvgRk8kLFYWNhQ5TrHMC0l5WtkMXhU5UbnvWoTfeEwqOruUSlNMhVLfYak7REX6oC5Yfw==
+
+emittery@^0.7.1:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82"
+ integrity sha512-A8OG5SR/ij3SsJdWDJdkkSYUjQdCUx6APQXem0SaEePBSRg4eymGYwBkKo1Y6DU+af/Jn2dBQqDBvjnr9Vi8nQ==
+
emoji-regex@^7.0.1:
version "7.0.3"
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
@@ -1233,6 +2188,13 @@ errno@~0.1.1:
dependencies:
prr "~1.0.1"
+error-ex@^1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ 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"
@@ -1256,6 +2218,11 @@ es3ify@^0.2.2:
jstransform "~11.0.0"
through "~2.3.4"
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
escape-goat@^2.0.0:
version "2.1.1"
resolved "https://registry.yarnpkg.com/escape-goat/-/escape-goat-2.1.1.tgz#1b2dc77003676c457ec760b2dc68edb648188675"
@@ -1271,6 +2238,23 @@ escape-string-regexp@^1.0.5:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+escape-string-regexp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344"
+ integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==
+
+escodegen@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd"
+ integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==
+ dependencies:
+ esprima "^4.0.1"
+ estraverse "^5.2.0"
+ esutils "^2.0.2"
+ optionator "^0.8.1"
+ optionalDependencies:
+ source-map "~0.6.1"
+
esmangle-evaluator@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/esmangle-evaluator/-/esmangle-evaluator-1.0.1.tgz#620d866ef4861b3311f75766d52a8572bb3c6336"
@@ -1296,11 +2280,26 @@ esprima@^2.7.1:
resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=
+esprima@^4.0.0, esprima@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
esprima@~3.1.0:
version "3.1.3"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=
+estraverse@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880"
+ integrity sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
event-target-shim@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
@@ -1311,6 +2310,44 @@ events@1.1.1:
resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=
+exec-sh@^0.3.2:
+ version "0.3.6"
+ resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc"
+ integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w==
+
+execa@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8"
+ integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==
+ dependencies:
+ cross-spawn "^6.0.0"
+ get-stream "^4.0.0"
+ is-stream "^1.1.0"
+ npm-run-path "^2.0.0"
+ p-finally "^1.0.0"
+ signal-exit "^3.0.0"
+ strip-eof "^1.0.0"
+
+execa@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a"
+ integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==
+ dependencies:
+ cross-spawn "^7.0.0"
+ get-stream "^5.0.0"
+ human-signals "^1.1.1"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.0"
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+ strip-final-newline "^2.0.0"
+
+exit@^0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c"
+ integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=
+
expand-brackets@^2.1.4:
version "2.1.4"
resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622"
@@ -1324,6 +2361,18 @@ expand-brackets@^2.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
+expect@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417"
+ integrity sha512-9/hlOBkQl2l/PLHJx6JjoDF6xPKcJEsUlWKb23rKE7KzeDqUZKXKNMW27KIue5JMdBV9HgmoJPcc8HtO85t9IA==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ ansi-styles "^4.0.0"
+ jest-get-type "^26.3.0"
+ jest-matcher-utils "^26.6.2"
+ jest-message-util "^26.6.2"
+ jest-regex-util "^26.0.0"
+
extend-shallow@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f"
@@ -1339,6 +2388,11 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2:
assign-symbols "^1.0.0"
is-extendable "^1.0.1"
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
extglob@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
@@ -1353,6 +2407,16 @@ extglob@^2.0.4:
snapdragon "^0.8.1"
to-regex "^3.0.1"
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
+ integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
+
falafel@^1.0.1:
version "1.2.0"
resolved "https://registry.yarnpkg.com/falafel/-/falafel-1.2.0.tgz#c18d24ef5091174a497f318cd24b026a25cddab4"
@@ -1370,6 +2434,21 @@ falafel@^1.0.1:
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"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917"
+ integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=
+
fast-redact@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/fast-redact/-/fast-redact-3.0.0.tgz#ac2f9e36c9f4976f5db9fb18c6ffbaf308cf316d"
@@ -1387,6 +2466,13 @@ fast-url-parser@^1.1.3:
dependencies:
punycode "^1.3.2"
+fb-watchman@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85"
+ integrity sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==
+ dependencies:
+ bser "2.1.1"
+
fetch-cookie@0.10.1:
version "0.10.1"
resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.10.1.tgz#5ea88f3d36950543c87997c27ae2aeafb4b5c4d4"
@@ -1411,6 +2497,14 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
+find-up@^4.0.0, find-up@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
flatstr@^1.0.12:
version "1.0.12"
resolved "https://registry.yarnpkg.com/flatstr/-/flatstr-1.0.12.tgz#c2ba6a08173edbb6c9640e3055b95e287ceb5931"
@@ -1433,7 +2527,30 @@ foreach@^2.0.5:
resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99"
integrity sha1-C+4AUBiusmDQo6865ljdATbsG5k=
-formidable@^1.1.1:
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
+ integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+formidable@^1.1.1, formidable@^1.2.2:
version "1.2.2"
resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9"
integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q==
@@ -1455,16 +2572,45 @@ fs-exists-sync@^0.1.0:
resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=
-fsevents@~2.3.1:
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+fsevents@^2.1.2, fsevents@~2.3.1:
version "2.3.2"
resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
functional-red-black-tree@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^2.0.1:
+ version "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.2:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ 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"
@@ -1473,14 +2619,19 @@ get-object@^0.2.0:
is-number "^2.0.2"
isobject "^0.2.0"
-get-stream@^4.1.0:
+get-package-type@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a"
+ integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==
+
+get-stream@^4.0.0, get-stream@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5"
integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==
dependencies:
pump "^3.0.0"
-get-stream@^5.1.0:
+get-stream@^5.0.0, get-stream@^5.1.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
@@ -1492,6 +2643,13 @@ get-value@^2.0.3, get-value@^2.0.6:
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
glob-parent@~5.1.0:
version "5.1.2"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4"
@@ -1510,6 +2668,18 @@ glob@^5.0.15:
once "^1.3.0"
path-is-absolute "^1.0.0"
+glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
+ version "7.1.6"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6"
+ integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
global-dirs@^2.0.1:
version "2.1.0"
resolved "https://registry.yarnpkg.com/global-dirs/-/global-dirs-2.1.0.tgz#e9046a49c806ff04d6c1825e196c8f0091e8df4d"
@@ -1517,6 +2687,11 @@ global-dirs@^2.0.1:
dependencies:
ini "1.3.7"
+globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
got@^11.8.1:
version "11.8.1"
resolved "https://registry.yarnpkg.com/got/-/got-11.8.1.tgz#df04adfaf2e782babb3daabc79139feec2f7e85d"
@@ -1556,6 +2731,16 @@ graceful-fs@^4.1.2:
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz#2256bde14d3632958c465ebc96dc467ca07a29fb"
integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==
+graceful-fs@^4.2.4:
+ version "4.2.6"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
+ integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==
+
+growly@^1.3.0:
+ version "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"
@@ -1585,6 +2770,19 @@ handlebars@^4.0.11, handlebars@^4.7.6:
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"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
@@ -1595,6 +2793,11 @@ has-flag@^4.0.0:
resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+has-symbols@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
+ integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
+
has-value@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f"
@@ -1631,6 +2834,13 @@ has-yarn@^2.1.0:
resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ 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"
@@ -1664,6 +2874,23 @@ highlight.js@^9.12.0:
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.9"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+ integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+html-encoding-sniffer@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3"
+ integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==
+ dependencies:
+ whatwg-encoding "^1.0.5"
+
+html-escaper@^2.0.0:
+ version "2.0.2"
+ 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"
@@ -1717,6 +2944,15 @@ http-errors@~1.6.2:
setprototypeof "1.1.0"
statuses ">= 1.4.0 < 2"
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
http2-wrapper@^1.0.0-beta.5.2:
version "1.0.0-beta.5.2"
resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.0-beta.5.2.tgz#8b923deb90144aea65cf834b016a340fc98556f3"
@@ -1725,6 +2961,11 @@ http2-wrapper@^1.0.0-beta.5.2:
quick-lru "^5.1.1"
resolve-alpn "^1.0.0"
+human-signals@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
+ integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
+
iconv-lite@0.4.24, iconv-lite@^0.4.5:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
@@ -1762,6 +3003,14 @@ import-lazy@^2.1.0:
resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=
+import-local@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.0.2.tgz#a8cfd0431d1de4a2199703d003e3e62364fa6db6"
+ integrity sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
@@ -1827,6 +3076,11 @@ is-accessor-descriptor@^1.0.0:
dependencies:
kind-of "^6.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-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"
@@ -1851,6 +3105,13 @@ is-class-hotfix@~0.0.6:
resolved "https://registry.yarnpkg.com/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz#a527d31fb23279281dde5f385c77b5de70a72435"
integrity sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==
+is-core-module@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a"
+ integrity sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==
+ dependencies:
+ has "^1.0.3"
+
is-data-descriptor@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56"
@@ -1883,6 +3144,11 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
is-data-descriptor "^1.0.0"
kind-of "^6.0.2"
+is-docker@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
is-even@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-even/-/is-even-1.0.0.tgz#76b5055fbad8d294a86b6a949015e1c97b717c06"
@@ -1917,6 +3183,11 @@ is-fullwidth-code-point@^3.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+is-generator-fn@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118"
+ integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==
+
is-generator-function@^1.0.7:
version "1.0.8"
resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.8.tgz#dfb5c2b120e02b0a8d9d2c6806cd5621aa922f7b"
@@ -1990,6 +3261,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"
+is-potential-custom-element-name@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
+ integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
+
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"
@@ -1997,6 +3273,16 @@ is-self-closing@^1.0.1:
dependencies:
self-closing-tags "^1.0.1"
+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-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3"
+ integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==
+
is-type-of@^1.0.0:
version "1.2.1"
resolved "https://registry.yarnpkg.com/is-type-of/-/is-type-of-1.2.1.tgz#e263ec3857aceb4f28c47130ec78db09a920f8c5"
@@ -2006,7 +3292,7 @@ is-type-of@^1.0.0:
is-class-hotfix "~0.0.6"
isstream "~0.1.2"
-is-typedarray@^1.0.0:
+is-typedarray@^1.0.0, is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
@@ -2016,6 +3302,13 @@ is-windows@^1.0.2:
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+is-wsl@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
is-yarn-global@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232"
@@ -2031,6 +3324,11 @@ 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=
+isexe@^2.0.0:
+ version "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"
@@ -2053,6 +3351,420 @@ isstream@~0.1.2:
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+istanbul-lib-coverage@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz#f5944a37c70b550b02a78a5c3b2055b280cec8ec"
+ integrity sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==
+
+istanbul-lib-instrument@^4.0.0, istanbul-lib-instrument@^4.0.3:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz#873c6fff897450118222774696a3f28902d77c1d"
+ integrity sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==
+ dependencies:
+ "@babel/core" "^7.7.5"
+ "@istanbuljs/schema" "^0.1.2"
+ istanbul-lib-coverage "^3.0.0"
+ semver "^6.3.0"
+
+istanbul-lib-report@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6"
+ integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==
+ dependencies:
+ istanbul-lib-coverage "^3.0.0"
+ make-dir "^3.0.0"
+ supports-color "^7.1.0"
+
+istanbul-lib-source-maps@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz#75743ce6d96bb86dc7ee4352cf6366a23f0b1ad9"
+ integrity sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==
+ dependencies:
+ debug "^4.1.1"
+ istanbul-lib-coverage "^3.0.0"
+ source-map "^0.6.1"
+
+istanbul-reports@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.0.2.tgz#d593210e5000683750cb09fc0644e4b6e27fd53b"
+ integrity sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==
+ dependencies:
+ html-escaper "^2.0.0"
+ istanbul-lib-report "^3.0.0"
+
+jest-changed-files@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0"
+ integrity sha512-fDS7szLcY9sCtIip8Fjry9oGf3I2ht/QT21bAHm5Dmf0mD4X3ReNUf17y+bO6fR8WgbIZTlbyG1ak/53cbRzKQ==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ execa "^4.0.0"
+ throat "^5.0.0"
+
+jest-cli@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-26.6.3.tgz#43117cfef24bc4cd691a174a8796a532e135e92a"
+ integrity sha512-GF9noBSa9t08pSyl3CY4frMrqp+aQXFGFkf5hEPbh/pIUFYWMK6ZLTfbmadxJVcJrdRoChlWQsA2VkJcDFK8hg==
+ dependencies:
+ "@jest/core" "^26.6.3"
+ "@jest/test-result" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ chalk "^4.0.0"
+ exit "^0.1.2"
+ graceful-fs "^4.2.4"
+ import-local "^3.0.2"
+ is-ci "^2.0.0"
+ jest-config "^26.6.3"
+ jest-util "^26.6.2"
+ jest-validate "^26.6.2"
+ prompts "^2.0.1"
+ yargs "^15.4.1"
+
+jest-config@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-26.6.3.tgz#64f41444eef9eb03dc51d5c53b75c8c71f645349"
+ integrity sha512-t5qdIj/bCj2j7NFVHb2nFB4aUdfucDn3JRKgrZnplb8nieAirAzRSHP8uDEd+qV6ygzg9Pz4YG7UTJf94LPSyg==
+ dependencies:
+ "@babel/core" "^7.1.0"
+ "@jest/test-sequencer" "^26.6.3"
+ "@jest/types" "^26.6.2"
+ babel-jest "^26.6.3"
+ chalk "^4.0.0"
+ deepmerge "^4.2.2"
+ glob "^7.1.1"
+ graceful-fs "^4.2.4"
+ jest-environment-jsdom "^26.6.2"
+ jest-environment-node "^26.6.2"
+ jest-get-type "^26.3.0"
+ jest-jasmine2 "^26.6.3"
+ jest-regex-util "^26.0.0"
+ jest-resolve "^26.6.2"
+ jest-util "^26.6.2"
+ jest-validate "^26.6.2"
+ micromatch "^4.0.2"
+ pretty-format "^26.6.2"
+
+jest-diff@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-26.6.2.tgz#1aa7468b52c3a68d7d5c5fdcdfcd5e49bd164394"
+ integrity sha512-6m+9Z3Gv9wN0WFVasqjCL/06+EFCMTqDEUl/b87HYK2rAPTyfz4ZIuSlPhY51PIQRWx5TaxeF1qmXKe9gfN3sA==
+ dependencies:
+ chalk "^4.0.0"
+ diff-sequences "^26.6.2"
+ jest-get-type "^26.3.0"
+ pretty-format "^26.6.2"
+
+jest-docblock@^26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5"
+ integrity sha512-RDZ4Iz3QbtRWycd8bUEPxQsTlYazfYn/h5R65Fc6gOfwozFhoImx+affzky/FFBuqISPTqjXomoIGJVKBWoo0w==
+ dependencies:
+ detect-newline "^3.0.0"
+
+jest-each@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-26.6.2.tgz#02526438a77a67401c8a6382dfe5999952c167cb"
+ integrity sha512-Mer/f0KaATbjl8MCJ+0GEpNdqmnVmDYqCTJYTvoo7rqmRiDllmp2AYN+06F93nXcY3ur9ShIjS+CO/uD+BbH4A==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ chalk "^4.0.0"
+ jest-get-type "^26.3.0"
+ jest-util "^26.6.2"
+ pretty-format "^26.6.2"
+
+jest-environment-jsdom@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-26.6.2.tgz#78d09fe9cf019a357009b9b7e1f101d23bd1da3e"
+ integrity sha512-jgPqCruTlt3Kwqg5/WVFyHIOJHsiAvhcp2qiR2QQstuG9yWox5+iHpU3ZrcBxW14T4fe5Z68jAfLRh7joCSP2Q==
+ dependencies:
+ "@jest/environment" "^26.6.2"
+ "@jest/fake-timers" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ "@types/node" "*"
+ jest-mock "^26.6.2"
+ jest-util "^26.6.2"
+ jsdom "^16.4.0"
+
+jest-environment-node@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-26.6.2.tgz#824e4c7fb4944646356f11ac75b229b0035f2b0c"
+ integrity sha512-zhtMio3Exty18dy8ee8eJ9kjnRyZC1N4C1Nt/VShN1apyXc8rWGtJ9lI7vqiWcyyXS4BVSEn9lxAM2D+07/Tag==
+ dependencies:
+ "@jest/environment" "^26.6.2"
+ "@jest/fake-timers" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ "@types/node" "*"
+ jest-mock "^26.6.2"
+ jest-util "^26.6.2"
+
+jest-get-type@^26.3.0:
+ version "26.3.0"
+ resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0"
+ integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==
+
+jest-haste-map@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa"
+ integrity sha512-easWIJXIw71B2RdR8kgqpjQrbMRWQBgiBwXYEhtGUTaX+doCjBheluShdDMeR8IMfJiTqH4+zfhtg29apJf/8w==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ "@types/graceful-fs" "^4.1.2"
+ "@types/node" "*"
+ anymatch "^3.0.3"
+ fb-watchman "^2.0.0"
+ graceful-fs "^4.2.4"
+ jest-regex-util "^26.0.0"
+ jest-serializer "^26.6.2"
+ jest-util "^26.6.2"
+ jest-worker "^26.6.2"
+ micromatch "^4.0.2"
+ sane "^4.0.3"
+ walker "^1.0.7"
+ optionalDependencies:
+ fsevents "^2.1.2"
+
+jest-jasmine2@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-26.6.3.tgz#adc3cf915deacb5212c93b9f3547cd12958f2edd"
+ integrity sha512-kPKUrQtc8aYwBV7CqBg5pu+tmYXlvFlSFYn18ev4gPFtrRzB15N2gW/Roew3187q2w2eHuu0MU9TJz6w0/nPEg==
+ dependencies:
+ "@babel/traverse" "^7.1.0"
+ "@jest/environment" "^26.6.2"
+ "@jest/source-map" "^26.6.2"
+ "@jest/test-result" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ co "^4.6.0"
+ expect "^26.6.2"
+ is-generator-fn "^2.0.0"
+ jest-each "^26.6.2"
+ jest-matcher-utils "^26.6.2"
+ jest-message-util "^26.6.2"
+ jest-runtime "^26.6.3"
+ jest-snapshot "^26.6.2"
+ jest-util "^26.6.2"
+ pretty-format "^26.6.2"
+ throat "^5.0.0"
+
+jest-leak-detector@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-26.6.2.tgz#7717cf118b92238f2eba65054c8a0c9c653a91af"
+ integrity sha512-i4xlXpsVSMeKvg2cEKdfhh0H39qlJlP5Ex1yQxwF9ubahboQYMgTtz5oML35AVA3B4Eu+YsmwaiKVev9KCvLxg==
+ dependencies:
+ jest-get-type "^26.3.0"
+ pretty-format "^26.6.2"
+
+jest-matcher-utils@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-26.6.2.tgz#8e6fd6e863c8b2d31ac6472eeb237bc595e53e7a"
+ integrity sha512-llnc8vQgYcNqDrqRDXWwMr9i7rS5XFiCwvh6DTP7Jqa2mqpcCBBlpCbn+trkG0KNhPu/h8rzyBkriOtBstvWhw==
+ dependencies:
+ chalk "^4.0.0"
+ jest-diff "^26.6.2"
+ jest-get-type "^26.3.0"
+ pretty-format "^26.6.2"
+
+jest-message-util@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07"
+ integrity sha512-rGiLePzQ3AzwUshu2+Rn+UMFk0pHN58sOG+IaJbk5Jxuqo3NYO1U2/MIR4S1sKgsoYSXSzdtSa0TgrmtUwEbmA==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ "@jest/types" "^26.6.2"
+ "@types/stack-utils" "^2.0.0"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.4"
+ micromatch "^4.0.2"
+ pretty-format "^26.6.2"
+ slash "^3.0.0"
+ stack-utils "^2.0.2"
+
+jest-mock@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-26.6.2.tgz#d6cb712b041ed47fe0d9b6fc3474bc6543feb302"
+ integrity sha512-YyFjePHHp1LzpzYcmgqkJ0nm0gg/lJx2aZFzFy1S6eUqNjXsOqTK10zNRff2dNfssgokjkG65OlWNcIlgd3zew==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ "@types/node" "*"
+
+jest-pnp-resolver@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c"
+ integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==
+
+jest-regex-util@^26.0.0:
+ version "26.0.0"
+ resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-26.0.0.tgz#d25e7184b36e39fd466c3bc41be0971e821fee28"
+ integrity sha512-Gv3ZIs/nA48/Zvjrl34bf+oD76JHiGDUxNOVgUjh3j890sblXryjY4rss71fPtD/njchl6PSE2hIhvyWa1eT0A==
+
+jest-resolve-dependencies@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-26.6.3.tgz#6680859ee5d22ee5dcd961fe4871f59f4c784fb6"
+ integrity sha512-pVwUjJkxbhe4RY8QEWzN3vns2kqyuldKpxlxJlzEYfKSvY6/bMvxoFrYYzUO1Gx28yKWN37qyV7rIoIp2h8fTg==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ jest-regex-util "^26.0.0"
+ jest-snapshot "^26.6.2"
+
+jest-resolve@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-26.6.2.tgz#a3ab1517217f469b504f1b56603c5bb541fbb507"
+ integrity sha512-sOxsZOq25mT1wRsfHcbtkInS+Ek7Q8jCHUB0ZUTP0tc/c41QHriU/NunqMfCUWsL4H3MHpvQD4QR9kSYhS7UvQ==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.4"
+ jest-pnp-resolver "^1.2.2"
+ jest-util "^26.6.2"
+ read-pkg-up "^7.0.1"
+ resolve "^1.18.1"
+ slash "^3.0.0"
+
+jest-runner@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-26.6.3.tgz#2d1fed3d46e10f233fd1dbd3bfaa3fe8924be159"
+ integrity sha512-atgKpRHnaA2OvByG/HpGA4g6CSPS/1LK0jK3gATJAoptC1ojltpmVlYC3TYgdmGp+GLuhzpH30Gvs36szSL2JQ==
+ dependencies:
+ "@jest/console" "^26.6.2"
+ "@jest/environment" "^26.6.2"
+ "@jest/test-result" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ emittery "^0.7.1"
+ exit "^0.1.2"
+ graceful-fs "^4.2.4"
+ jest-config "^26.6.3"
+ jest-docblock "^26.0.0"
+ jest-haste-map "^26.6.2"
+ jest-leak-detector "^26.6.2"
+ jest-message-util "^26.6.2"
+ jest-resolve "^26.6.2"
+ jest-runtime "^26.6.3"
+ jest-util "^26.6.2"
+ jest-worker "^26.6.2"
+ source-map-support "^0.5.6"
+ throat "^5.0.0"
+
+jest-runtime@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-26.6.3.tgz#4f64efbcfac398331b74b4b3c82d27d401b8fa2b"
+ integrity sha512-lrzyR3N8sacTAMeonbqpnSka1dHNux2uk0qqDXVkMv2c/A3wYnvQ4EXuI013Y6+gSKSCxdaczvf4HF0mVXHRdw==
+ dependencies:
+ "@jest/console" "^26.6.2"
+ "@jest/environment" "^26.6.2"
+ "@jest/fake-timers" "^26.6.2"
+ "@jest/globals" "^26.6.2"
+ "@jest/source-map" "^26.6.2"
+ "@jest/test-result" "^26.6.2"
+ "@jest/transform" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ "@types/yargs" "^15.0.0"
+ chalk "^4.0.0"
+ cjs-module-lexer "^0.6.0"
+ collect-v8-coverage "^1.0.0"
+ exit "^0.1.2"
+ glob "^7.1.3"
+ graceful-fs "^4.2.4"
+ jest-config "^26.6.3"
+ jest-haste-map "^26.6.2"
+ jest-message-util "^26.6.2"
+ jest-mock "^26.6.2"
+ jest-regex-util "^26.0.0"
+ jest-resolve "^26.6.2"
+ jest-snapshot "^26.6.2"
+ jest-util "^26.6.2"
+ jest-validate "^26.6.2"
+ slash "^3.0.0"
+ strip-bom "^4.0.0"
+ yargs "^15.4.1"
+
+jest-serializer@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-serializer/-/jest-serializer-26.6.2.tgz#d139aafd46957d3a448f3a6cdabe2919ba0742d1"
+ integrity sha512-S5wqyz0DXnNJPd/xfIzZ5Xnp1HrJWBczg8mMfMpN78OJ5eDxXyf+Ygld9wX1DnUWbIbhM1YDY95NjR4CBXkb2g==
+ dependencies:
+ "@types/node" "*"
+ graceful-fs "^4.2.4"
+
+jest-snapshot@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-26.6.2.tgz#f3b0af1acb223316850bd14e1beea9837fb39c84"
+ integrity sha512-OLhxz05EzUtsAmOMzuupt1lHYXCNib0ECyuZ/PZOx9TrZcC8vL0x+DUG3TL+GLX3yHG45e6YGjIm0XwDc3q3og==
+ dependencies:
+ "@babel/types" "^7.0.0"
+ "@jest/types" "^26.6.2"
+ "@types/babel__traverse" "^7.0.4"
+ "@types/prettier" "^2.0.0"
+ chalk "^4.0.0"
+ expect "^26.6.2"
+ graceful-fs "^4.2.4"
+ jest-diff "^26.6.2"
+ jest-get-type "^26.3.0"
+ jest-haste-map "^26.6.2"
+ jest-matcher-utils "^26.6.2"
+ jest-message-util "^26.6.2"
+ jest-resolve "^26.6.2"
+ natural-compare "^1.4.0"
+ pretty-format "^26.6.2"
+ semver "^7.3.2"
+
+jest-util@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-26.6.2.tgz#907535dbe4d5a6cb4c47ac9b926f6af29576cbc1"
+ integrity sha512-MDW0fKfsn0OI7MS7Euz6h8HNDXVQ0gaM9uW6RjfDmd1DAFcaxX9OqIakHIqhbnmF08Cf2DLDG+ulq8YQQ0Lp0Q==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ "@types/node" "*"
+ chalk "^4.0.0"
+ graceful-fs "^4.2.4"
+ is-ci "^2.0.0"
+ micromatch "^4.0.2"
+
+jest-validate@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-26.6.2.tgz#23d380971587150467342911c3d7b4ac57ab20ec"
+ integrity sha512-NEYZ9Aeyj0i5rQqbq+tpIOom0YS1u2MVu6+euBsvpgIme+FOfRmoC4R5p0JiAUpaFvFy24xgrpMknarR/93XjQ==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ camelcase "^6.0.0"
+ chalk "^4.0.0"
+ jest-get-type "^26.3.0"
+ leven "^3.1.0"
+ pretty-format "^26.6.2"
+
+jest-watcher@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-26.6.2.tgz#a5b683b8f9d68dbcb1d7dae32172d2cca0592975"
+ integrity sha512-WKJob0P/Em2csiVthsI68p6aGKTIcsfjH9Gsx1f0A3Italz43e3ho0geSAVsmj09RWOELP1AZ/DXyJgOgDKxXQ==
+ dependencies:
+ "@jest/test-result" "^26.6.2"
+ "@jest/types" "^26.6.2"
+ "@types/node" "*"
+ ansi-escapes "^4.2.1"
+ chalk "^4.0.0"
+ jest-util "^26.6.2"
+ string-length "^4.0.1"
+
+jest-worker@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
+ integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^7.0.0"
+
+jest@^26.6.3:
+ version "26.6.3"
+ resolved "https://registry.yarnpkg.com/jest/-/jest-26.6.3.tgz#40e8fdbe48f00dfa1f0ce8121ca74b88ac9148ef"
+ integrity sha512-lGS5PXGAzR4RF7V5+XObhqz2KZIDUA1yD0DG6pBVmy10eh0ZIXQImRuzocsI/N2XZ1GrLFwTS27In2i2jlpq1Q==
+ dependencies:
+ "@jest/core" "^26.6.3"
+ import-local "^3.0.2"
+ jest-cli "^26.6.3"
+
jmespath@0.15.0, jmespath@^0.15.0:
version "0.15.0"
resolved "https://registry.yarnpkg.com/jmespath/-/jmespath-0.15.0.tgz#a3f222a9aae9f966f5d27c796510e28091764217"
@@ -2074,6 +3786,61 @@ joycon@^2.2.5:
resolved "https://registry.yarnpkg.com/joycon/-/joycon-2.2.5.tgz#8d4cf4cbb2544d7b7583c216fcdfec19f6be1615"
integrity sha512-YqvUxoOcVPnCp0VU1/56f+iKSdvIRJYPznH22BdXV3xMk75SFXhWeJkZ8C9XxUWt1b5x2X1SxuFygW1U0FmkEQ==
+js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-yaml@^3.13.1:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+jsdom@^16.4.0:
+ version "16.5.3"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-16.5.3.tgz#13a755b3950eb938b4482c407238ddf16f0d2136"
+ integrity sha512-Qj1H+PEvUsOtdPJ056ewXM4UJPCi4hhLA8wpiz9F2YvsRBhuFsXxtrIFAgGBDynQA9isAMGE91PfUYbdMPXuTA==
+ dependencies:
+ abab "^2.0.5"
+ acorn "^8.1.0"
+ acorn-globals "^6.0.0"
+ cssom "^0.4.4"
+ cssstyle "^2.3.0"
+ data-urls "^2.0.0"
+ decimal.js "^10.2.1"
+ domexception "^2.0.1"
+ escodegen "^2.0.0"
+ html-encoding-sniffer "^2.0.1"
+ is-potential-custom-element-name "^1.0.0"
+ nwsapi "^2.2.0"
+ parse5 "6.0.1"
+ request "^2.88.2"
+ request-promise-native "^1.0.9"
+ saxes "^5.0.1"
+ symbol-tree "^3.2.4"
+ tough-cookie "^4.0.0"
+ w3c-hr-time "^1.0.2"
+ w3c-xmlserializer "^2.0.0"
+ webidl-conversions "^6.1.0"
+ whatwg-encoding "^1.0.5"
+ whatwg-mimetype "^2.3.0"
+ whatwg-url "^8.5.0"
+ ws "^7.4.4"
+ xml-name-validator "^3.0.0"
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
json-buffer@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
@@ -2084,6 +3851,33 @@ json-buffer@3.0.1:
resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+json-parse-even-better-errors@^2.3.0:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.2.3:
+ version "0.2.3"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
+ integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+json5@^2.1.2:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3"
+ integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==
+ dependencies:
+ minimist "^1.2.5"
+
jsonwebtoken@^8.2.0:
version "8.5.1"
resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz#00e71e0b8df54c2121a1f26137df2280673bcc0d"
@@ -2100,6 +3894,16 @@ jsonwebtoken@^8.2.0:
ms "^2.1.1"
semver "^5.6.0"
+jsprim@^1.2.2:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2"
+ integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.2.3"
+ verror "1.10.0"
+
jstransform@~11.0.0:
version "11.0.3"
resolved "https://registry.yarnpkg.com/jstransform/-/jstransform-11.0.3.tgz#09a78993e0ae4d4ef4487f6155a91f6190cb4223"
@@ -2182,6 +3986,11 @@ kind-of@^6.0.0, kind-of@^6.0.2:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+kleur@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e"
+ integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==
+
koa-body@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/koa-body/-/koa-body-4.2.0.tgz#37229208b820761aca5822d14c5fc55cee31b26f"
@@ -2405,6 +4214,19 @@ leven@2.1.0:
resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580"
integrity sha1-wuep93IJTe6dNCAq6KzORoeHVYA=
+leven@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
+ integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
+
+levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
+ integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
lie@3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/lie/-/lie-3.0.4.tgz#bc7ae1ebe7f1c8de39afdcd4f789076b47b0f634"
@@ -2415,6 +4237,18 @@ lie@3.0.4:
inline-process-browser "^1.0.0"
unreachable-branch-transform "^0.3.0"
+lines-and-columns@^1.1.6:
+ version "1.1.6"
+ resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00"
+ integrity sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ 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"
@@ -2470,7 +4304,7 @@ lodash.templatesettings@^4.0.0:
dependencies:
lodash._reinterpolate "^3.0.0"
-lodash@^4.17.20:
+lodash@^4.17.19, lodash@^4.17.20, lodash@^4.7.0:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -2514,6 +4348,13 @@ lowercase-keys@^2.0.0:
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
ltgt@2.2.1, ltgt@^2.1.2, ltgt@~2.2.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
@@ -2526,6 +4367,13 @@ make-dir@^3.0.0:
dependencies:
semver "^6.0.0"
+makeerror@1.0.x:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c"
+ integrity sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=
+ dependencies:
+ tmpl "1.0.x"
+
map-cache@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf"
@@ -2555,6 +4403,11 @@ memdown@1.4.1:
ltgt "~2.2.0"
safe-buffer "~5.1.1"
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
methods@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
@@ -2579,16 +4432,36 @@ micromatch@^3.1.4:
snapdragon "^0.8.1"
to-regex "^3.0.2"
+micromatch@^4.0.2:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9"
+ integrity sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==
+ dependencies:
+ braces "^3.0.1"
+ picomatch "^2.2.3"
+
mime-db@1.44.0:
version "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.47.0:
+ version "1.47.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c"
+ integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==
+
"mime-db@>= 1.43.0 < 2":
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-types@^2.1.12, mime-types@~2.1.19:
+ version "2.1.30"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d"
+ integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==
+ dependencies:
+ mime-db "1.47.0"
+
mime-types@^2.1.18, mime-types@~2.1.24:
version "2.1.27"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
@@ -2596,6 +4469,16 @@ mime-types@^2.1.18, mime-types@~2.1.24:
dependencies:
mime-db "1.44.0"
+mime@^2.4.6:
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe"
+ integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
mimic-response@^1.0.0, mimic-response@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
@@ -2613,7 +4496,7 @@ mimic-response@^3.1.0:
dependencies:
brace-expansion "^1.1.7"
-minimist@^1.2.0, minimist@^1.2.5:
+minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5:
version "1.2.5"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
@@ -2680,6 +4563,11 @@ napi-macros@~2.0.0:
resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b"
integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
+ integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+
negotiator@0.6.2:
version "0.6.2"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
@@ -2690,6 +4578,11 @@ neo-async@^2.6.0:
resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
node-fetch@2.6.0:
version "2.6.0"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd"
@@ -2705,6 +4598,33 @@ node-gyp-build@~4.1.0:
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb"
integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==
+node-int64@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
+ integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=
+
+node-modules-regexp@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40"
+ integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=
+
+node-notifier@^8.0.0:
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-8.0.2.tgz#f3167a38ef0d2c8a866a83e318c1ba0efeb702c5"
+ integrity sha512-oJP/9NAdd9+x2Q+rfphB2RJCHjod70RcRLjosiPMMu5gjIfwVnOUGq2nbTjTUbmy0DJ/tFIVT30+Qe3nzl4TJg==
+ dependencies:
+ growly "^1.3.0"
+ is-wsl "^2.2.0"
+ semver "^7.3.2"
+ shellwords "^0.1.1"
+ uuid "^8.3.0"
+ which "^2.0.2"
+
+node-releases@^1.1.71:
+ version "1.1.71"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb"
+ integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==
+
nodemailer@^6.5.0:
version "6.5.0"
resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.5.0.tgz#d12c28d8d48778918e25f1999d97910231b175d9"
@@ -2733,6 +4653,23 @@ nopt@~1.0.10:
dependencies:
abbrev "1"
+normalize-package-data@^2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9"
+ integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=
+ dependencies:
+ remove-trailing-separator "^1.0.1"
+
normalize-path@^3.0.0, normalize-path@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
@@ -2743,6 +4680,30 @@ normalize-url@^4.1.0:
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.0.tgz#453354087e6ca96957bd8f5baf753f5982142129"
integrity sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==
+npm-run-path@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f"
+ integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=
+ dependencies:
+ path-key "^2.0.0"
+
+npm-run-path@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+nwsapi@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.0.tgz#204879a9e3d068ff2a55139c2c772780681a38b7"
+ integrity sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
oauth@0.9.x:
version "0.9.15"
resolved "https://registry.yarnpkg.com/oauth/-/oauth-0.9.15.tgz#bd1fefaf686c96b75475aed5196412ff60cfb9c1"
@@ -2762,6 +4723,11 @@ object-copy@^0.1.0:
define-property "^0.2.5"
kind-of "^3.0.3"
+object-inspect@^1.9.0:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.10.2.tgz#b6385a3e2b7cae0b5eafcf90cddf85d128767f30"
+ integrity sha512-gz58rdPpadwztRrPjZE9DZLOABUpTGdcANUgOwBFO1C+HZZhePoP83M65WGDmbpwFYJSWqavbl4SgDn4k8RYTA==
+
object-keys@^1.0.6:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
@@ -2795,11 +4761,30 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0:
dependencies:
wrappy "1"
+onetime@^5.1.0:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
only@~0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4"
integrity sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=
+optionator@^0.8.1:
+ version "0.8.3"
+ resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
+ integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+ dependencies:
+ deep-is "~0.1.3"
+ fast-levenshtein "~2.0.6"
+ levn "~0.3.0"
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+ word-wrap "~1.2.3"
+
p-cancelable@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
@@ -2810,6 +4795,35 @@ p-cancelable@^2.0.0:
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.0.0.tgz#4a3740f5bdaf5ed5d7c3e34882c6fb5d6b266a6e"
integrity sha512-wvPXDmbMmu2ksjkB4Z3nZWTSkJEb9lqVdMaCKpZUGJG9TMiNp9XcbG3fn9fPKjem04fJMJnXoyFPk2FmgiaiNg==
+p-each-series@^2.1.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a"
+ integrity sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==
+
+p-finally@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae"
+ integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=
+
+p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
package-json@^6.3.0:
version "6.5.0"
resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0"
@@ -2820,6 +4834,21 @@ package-json@^6.3.0:
registry-url "^5.0.0"
semver "^6.2.0"
+parse-json@^5.0.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
+ integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==
+ dependencies:
+ "@babel/code-frame" "^7.0.0"
+ error-ex "^1.3.1"
+ json-parse-even-better-errors "^2.3.0"
+ lines-and-columns "^1.1.6"
+
+parse5@6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-6.0.1.tgz#e1a1c085c569b3dc08321184f19a39cc27f7c30b"
+ integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==
+
parseurl@^1.3.2:
version "1.3.3"
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
@@ -2900,11 +4929,31 @@ passport@^0.4.0:
passport-strategy "1.x.x"
pause "0.0.1"
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
path-is-absolute@1.0.1, path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+path-key@^2.0.0, path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=
+
+path-key@^3.0.0, path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.6:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c"
+ integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==
+
path-to-regexp@1.x:
version "1.8.0"
resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a"
@@ -2917,11 +4966,21 @@ pause@0.0.1:
resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d"
integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
picomatch@^2.0.4, picomatch@^2.2.1:
version "2.2.2"
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad"
integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==
+picomatch@^2.2.3:
+ version "2.2.3"
+ resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.3.tgz#465547f359ccc206d3c48e46a1bcb89bf7ee619d"
+ integrity sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==
+
pino-http@^5.0.1:
version "5.3.0"
resolved "https://registry.yarnpkg.com/pino-http/-/pino-http-5.3.0.tgz#8ad9c296a60220b8d7067800a63c8716a622c661"
@@ -2965,6 +5024,20 @@ pino@^6.0.0:
quick-format-unescaped "^4.0.1"
sonic-boom "^1.0.2"
+pirates@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.1.tgz#643a92caf894566f91b2b986d2c66950a8e2fb87"
+ integrity sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==
+ dependencies:
+ node-modules-regexp "^1.0.0"
+
+pkg-dir@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
posix-character-classes@^0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
@@ -3108,11 +5181,26 @@ pouchdb@^7.2.1:
uuid "8.1.0"
vuvuzela "1.0.3"
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
+ integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
+
prepend-http@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
+pretty-format@^26.6.2:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-26.6.2.tgz#e35c2705f14cb7fe2fe94fa078345b444120fc93"
+ integrity sha512-7AeGuCYNGmycyQbCqd/3PWH4eOoX/OiCa0uphp57NVTeAGdJGaAliecxwBDHYQCIvrW7aDBZCYeNTP/WX69mkg==
+ dependencies:
+ "@jest/types" "^26.6.2"
+ ansi-regex "^5.0.0"
+ ansi-styles "^4.0.0"
+ react-is "^17.0.1"
+
private@^0.1.6, private@~0.1.5:
version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
@@ -3123,12 +5211,20 @@ 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==
+prompts@^2.0.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61"
+ integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==
+ dependencies:
+ kleur "^3.0.3"
+ sisteransi "^1.0.5"
+
prr@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
integrity sha1-0/wRS6BplaRexok/SEzrHXj19HY=
-psl@^1.1.33:
+psl@^1.1.28, psl@^1.1.33:
version "1.8.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
@@ -3156,7 +5252,7 @@ punycode@^1.3.2:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
-punycode@^2.1.1:
+punycode@^2.1.0, punycode@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
@@ -3178,6 +5274,18 @@ qs@^6.4.0:
resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==
+qs@^6.9.4:
+ version "6.10.1"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a"
+ integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg==
+ dependencies:
+ side-channel "^1.0.4"
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
querystring@0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620"
@@ -3213,6 +5321,30 @@ rc@^1.2.8:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
+react-is@^17.0.1:
+ version "17.0.2"
+ resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0"
+ integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==
+
+read-pkg-up@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-7.0.1.tgz#f3a6135758459733ae2b95638056e1854e7ef507"
+ integrity sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==
+ dependencies:
+ find-up "^4.1.0"
+ read-pkg "^5.2.0"
+ type-fest "^0.8.1"
+
+read-pkg@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
+ integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==
+ dependencies:
+ "@types/normalize-package-data" "^2.4.0"
+ normalize-package-data "^2.5.0"
+ parse-json "^5.0.0"
+ type-fest "^0.6.0"
+
readable-stream@1.1.14:
version "1.1.14"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
@@ -3324,6 +5456,11 @@ remarkable@^1.6.2, remarkable@^1.7.1:
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"
+ integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8=
+
repeat-element@^1.1.2:
version "1.1.4"
resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9"
@@ -3334,11 +5471,75 @@ repeat-string@^1.6.1:
resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
+request-promise-core@1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.4.tgz#3eedd4223208d419867b78ce815167d10593a22f"
+ integrity sha512-TTbAfBBRdWD7aNNOoVOBH4pN/KigV6LyapYNNlAPA8JwbovRti1E88m3sYAwsLi5ryhPKsE9APwnjFTgdUjTpw==
+ dependencies:
+ lodash "^4.17.19"
+
+request-promise-native@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.9.tgz#e407120526a5efdc9a39b28a5679bf47b9d9dc28"
+ integrity sha512-wcW+sIUiWnKgNY0dqCpOZkUbF/I+YPi+f09JZIDa39Ec+q82CpSYniDp+ISgTTbKmnpJWASeJBPZmoxH84wt3g==
+ dependencies:
+ request-promise-core "1.1.4"
+ stealthy-require "^1.1.1"
+ tough-cookie "^2.3.3"
+
+request@^2.88.2:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.8.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
+ forever-agent "~0.6.1"
+ form-data "~2.3.2"
+ har-validator "~5.1.3"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
resolve-alpn@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.0.0.tgz#745ad60b3d6aff4b4a48e01b8c0bdc70959e0e8c"
integrity sha512-rTuiIEqFmGxne4IovivKSDzld2lWW9QCjqv80SYjPgf+gS35eaCAjaP54CCwGAwBtnCsvNLYtqxe1Nw+i6JEmA==
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
resolve-path@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7"
@@ -3352,6 +5553,14 @@ resolve-url@^0.2.1:
resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
+resolve@^1.10.0, resolve@^1.18.1:
+ version "1.20.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975"
+ integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==
+ dependencies:
+ is-core-module "^2.2.0"
+ path-parse "^1.0.6"
+
responselike@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7"
@@ -3371,12 +5580,24 @@ ret@~0.1.10:
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
+rimraf@^3.0.0:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+rsvp@^4.8.4:
+ version "4.8.5"
+ resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
+ integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
+
safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
-safe-buffer@^5.0.1, safe-buffer@~5.2.0:
+safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -3388,11 +5609,26 @@ safe-regex@^1.1.0:
dependencies:
ret "~0.1.10"
-"safer-buffer@>= 2.1.2 < 3":
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+sane@^4.0.3:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/sane/-/sane-4.1.0.tgz#ed881fd922733a6c461bc189dc2b6c006f3ffded"
+ integrity sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==
+ dependencies:
+ "@cnakazawa/watch" "^1.0.3"
+ anymatch "^2.0.0"
+ capture-exit "^2.0.0"
+ exec-sh "^0.3.2"
+ execa "^1.0.0"
+ fb-watchman "^2.0.0"
+ micromatch "^3.1.4"
+ minimist "^1.1.1"
+ walker "~1.0.5"
+
sax@1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a"
@@ -3403,6 +5639,13 @@ sax@>=0.6.0:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
+saxes@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/saxes/-/saxes-5.0.1.tgz#eebab953fa3b7608dbe94e5dadb15c888fa6696d"
+ integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==
+ dependencies:
+ xmlchars "^2.2.0"
+
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"
@@ -3415,7 +5658,7 @@ semver-diff@^3.1.1:
dependencies:
semver "^6.3.0"
-semver@^5.6.0, semver@^5.7.1:
+"semver@2 || 3 || 4 || 5", semver@^5.5.0, semver@^5.6.0, semver@^5.7.1:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -3425,11 +5668,23 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+semver@^7.3.2:
+ version "7.3.5"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7"
+ integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==
+ dependencies:
+ lru-cache "^6.0.0"
+
server-destroy@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/server-destroy/-/server-destroy-1.0.1.tgz#f13bf928e42b9c3e79383e61cc3998b5d14e6cdd"
integrity sha1-8Tv5KOQrnD55OD5hzDmYtdFObN0=
+set-blocking@^2.0.0:
+ version "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"
@@ -3462,11 +5717,59 @@ setprototypeof@1.2.0:
resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
-signal-exit@^3.0.2:
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+shellwords@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b"
+ integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==
+
+side-channel@^1.0.4:
+ 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"
integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==
+sisteransi@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
+ integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
+
+slash@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
+ integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
+
snapdragon-node@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@@ -3516,6 +5819,14 @@ source-map-resolve@^0.5.0:
source-map-url "^0.4.0"
urix "^0.1.0"
+source-map-support@^0.5.6:
+ version "0.5.19"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"
+ integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
source-map-url@^0.4.0:
version "0.4.1"
resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56"
@@ -3535,21 +5846,52 @@ source-map@^0.4.2:
dependencies:
amdefine ">=0.0.4"
-source-map@^0.5.6, source-map@~0.5.0:
+source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.0:
version "0.5.7"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
-source-map@^0.6.1:
+source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+source-map@^0.7.3:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383"
+ integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==
+
spark-md5@3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.1.tgz#83a0e255734f2ab4e5c466e5a2cfc9ba2aa2124d"
integrity sha512-0tF3AGSD1ppQeuffsLDIOWlKUd3lS92tFxcsrh5Pe3ZphhnoK+oXIBTzOAThZCiuINZLvpiLH/1VS1/ANEJVig==
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65"
+ integrity sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==
+
split-string@^3.0.1, split-string@^3.0.2:
version "3.1.0"
resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2"
@@ -3569,6 +5911,28 @@ sprintf-js@~1.0.2:
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ bcrypt-pbkdf "^1.0.0"
+ dashdash "^1.12.0"
+ ecc-jsbn "~0.1.1"
+ getpass "^0.1.1"
+ jsbn "~0.1.0"
+ safer-buffer "^2.0.2"
+ tweetnacl "~0.14.0"
+
+stack-utils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-2.0.3.tgz#cd5f030126ff116b78ccb3c027fe302713b61277"
+ integrity sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==
+ dependencies:
+ escape-string-regexp "^2.0.0"
+
static-extend@^0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6"
@@ -3587,6 +5951,19 @@ statuses@^2.0.0:
resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.0.tgz#aa7b107e018eb33e08e8aee2e7337e762dda1028"
integrity sha512-w9jNUUQdpuVoYqXxnyOakhckBbOxRaoYqJscyIBYCS5ixyCnO7nQn7zBZvP9zf5QOPZcz2DLUpE3KsNPbJBOFA==
+stealthy-require@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
+ integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
+
+string-length@^4.0.1:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a"
+ integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==
+ dependencies:
+ char-regex "^1.0.2"
+ strip-ansi "^6.0.0"
+
string-width@^3.0.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
@@ -3596,7 +5973,7 @@ string-width@^3.0.0:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^5.1.0"
-string-width@^4.0.0, string-width@^4.1.0:
+string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0:
version "4.2.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.2.tgz#dafd4f9559a7585cfba529c6a0a4f73488ebd4c5"
integrity sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==
@@ -3638,6 +6015,21 @@ strip-ansi@^6.0.0:
dependencies:
ansi-regex "^5.0.0"
+strip-bom@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
+ integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==
+
+strip-eof@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
+ integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
strip-json-comments@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006"
@@ -3668,6 +6060,31 @@ success-symbol@^0.1.0:
resolved "https://registry.yarnpkg.com/success-symbol/-/success-symbol-0.1.0.tgz#24022e486f3bf1cdca094283b769c472d3b72897"
integrity sha1-JAIuSG878c3KCUKDt2nEctO3KJc=
+superagent@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/superagent/-/superagent-6.1.0.tgz#09f08807bc41108ef164cfb4be293cebd480f4a6"
+ integrity sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==
+ dependencies:
+ component-emitter "^1.3.0"
+ cookiejar "^2.1.2"
+ debug "^4.1.1"
+ fast-safe-stringify "^2.0.7"
+ form-data "^3.0.0"
+ formidable "^1.2.2"
+ methods "^1.1.2"
+ mime "^2.4.6"
+ qs "^6.9.4"
+ readable-stream "^3.6.0"
+ semver "^7.3.2"
+
+supertest@^6.1.3:
+ version "6.1.3"
+ resolved "https://registry.yarnpkg.com/supertest/-/supertest-6.1.3.tgz#3f49ea964514c206c334073e8dc4e70519c7403f"
+ integrity sha512-v2NVRyP73XDewKb65adz+yug1XMtmvij63qIWHZzSX8tp6wiq6xBLUy4SUAd2NII6wIipOmHT/FD9eicpJwdgQ==
+ dependencies:
+ methods "^1.1.2"
+ superagent "^6.1.0"
+
supports-color@^5.3.0, supports-color@^5.5.0:
version "5.5.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f"
@@ -3675,18 +6092,53 @@ supports-color@^5.3.0, supports-color@^5.5.0:
dependencies:
has-flag "^3.0.0"
-supports-color@^7.1.0:
+supports-color@^7.0.0, supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
dependencies:
has-flag "^4.0.0"
+supports-hyperlinks@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb"
+ integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ==
+ dependencies:
+ has-flag "^4.0.0"
+ supports-color "^7.0.0"
+
+symbol-tree@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+ integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
term-size@^2.1.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/term-size/-/term-size-2.2.1.tgz#2a6a54840432c2fb6320fea0f415531e90189f54"
integrity sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==
+terminal-link@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994"
+ integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==
+ dependencies:
+ ansi-escapes "^4.2.1"
+ supports-hyperlinks "^2.0.0"
+
+test-exclude@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e"
+ integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==
+ dependencies:
+ "@istanbuljs/schema" "^0.1.2"
+ glob "^7.1.4"
+ minimatch "^3.0.4"
+
+throat@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/throat/-/throat-5.0.0.tgz#c5199235803aad18754a667d659b5e72ce16764b"
+ integrity sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==
+
through2@3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4"
@@ -3726,6 +6178,16 @@ tiny-queue@^0.2.0:
resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.1.tgz#25a67f2c6e253b2ca941977b5ef7442ef97a6046"
integrity sha1-JaZ/LG4lOyypQZd7XvdELvl6YEY=
+tmpl@1.0.x:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
+ integrity sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=
+
+to-fast-properties@^2.0.0:
+ version "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"
@@ -3780,7 +6242,15 @@ touch@^3.1.0:
dependencies:
nopt "~1.0.10"
-"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0":
+tough-cookie@^2.3.3, tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0", tough-cookie@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.0.0.tgz#d822234eeca882f991f0f908824ad2622ddbece4"
integrity sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==
@@ -3789,11 +6259,52 @@ touch@^3.1.0:
punycode "^2.1.1"
universalify "^0.1.2"
+tr46@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-2.0.2.tgz#03273586def1595ae08fedb38d7733cee91d2479"
+ integrity sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==
+ dependencies:
+ punycode "^2.1.1"
+
tsscmp@1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
integrity sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72"
+ integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-detect@4.0.8:
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c"
+ integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==
+
+type-fest@^0.21.3:
+ version "0.21.3"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
+ integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
+
+type-fest@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz#8d2a2370d3df886eb5c90ada1c5bf6188acf838b"
+ integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==
+
type-fest@^0.8.1:
version "0.8.1"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
@@ -3901,6 +6412,13 @@ update-notifier@^4.1.0:
semver-diff "^3.1.1"
xdg-basedir "^4.0.0"
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
urijs@^1.19.2:
version "1.19.2"
resolved "https://registry.yarnpkg.com/urijs/-/urijs-1.19.2.tgz#f9be09f00c4c5134b7cb3cf475c1dd394526265a"
@@ -3956,21 +6474,123 @@ uuid@^3.3.2:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+uuid@^8.3.0:
+ version "8.3.2"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
+v8-to-istanbul@^7.0.0:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-7.1.1.tgz#04bfd1026ba4577de5472df4f5e89af49de5edda"
+ integrity sha512-p0BB09E5FRjx0ELN6RgusIPsSPhtgexSRcKETybEs6IGOTXJSZqfwxp7r//55nnu0f1AxltY5VvdVqy2vZf9AA==
+ dependencies:
+ "@types/istanbul-lib-coverage" "^2.0.1"
+ convert-source-map "^1.6.0"
+ source-map "^0.7.3"
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
vary@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
vuvuzela@1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/vuvuzela/-/vuvuzela-1.0.3.tgz#3be145e58271c73ca55279dd851f12a682114b0b"
integrity sha1-O+FF5YJxxzylUnndhR8SpoIRSws=
+w3c-hr-time@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz#0a89cdf5cc15822df9c360543676963e0cc308cd"
+ integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==
+ dependencies:
+ browser-process-hrtime "^1.0.0"
+
+w3c-xmlserializer@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz#3e7104a05b75146cc60f564380b7f683acf1020a"
+ integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==
+ dependencies:
+ xml-name-validator "^3.0.0"
+
+walker@^1.0.7, walker@~1.0.5:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb"
+ integrity sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=
+ 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@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff"
+ integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==
+
+webidl-conversions@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514"
+ integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==
+
+whatwg-encoding@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
+ integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==
+ dependencies:
+ iconv-lite "0.4.24"
+
+whatwg-mimetype@^2.3.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf"
+ integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==
+
+whatwg-url@^8.0.0, whatwg-url@^8.5.0:
+ version "8.5.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-8.5.0.tgz#7752b8464fc0903fec89aa9846fc9efe07351fd3"
+ integrity sha512-fy+R77xWv0AiqfLl4nuGUlQ3/6b5uNfQ4WAbGQVMYshCTCCPK9psC1nWh3XHuxGVCtlcDDQPQW1csmmIQo+fwg==
+ dependencies:
+ lodash "^4.7.0"
+ tr46 "^2.0.2"
+ webidl-conversions "^6.1.0"
+
+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@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+which@^2.0.1, which@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
widest-line@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca"
@@ -3978,11 +6598,25 @@ widest-line@^3.1.0:
dependencies:
string-width "^4.0.0"
+word-wrap@~1.2.3:
+ version "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=
+wrap-ansi@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+ integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@@ -4005,11 +6639,21 @@ write-stream@~0.4.3:
dependencies:
readable-stream "~0.0.2"
+ws@^7.4.4:
+ version "7.4.5"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.5.tgz#a484dd851e9beb6fdb420027e3885e8ce48986c1"
+ integrity sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==
+
xdg-basedir@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13"
integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==
+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"
+ integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==
+
xml2js@0.4.19:
version "0.4.19"
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
@@ -4023,11 +6667,51 @@ xmlbuilder@~9.0.1:
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d"
integrity sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=
+xmlchars@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+ integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+
"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yargs-parser@^18.1.2:
+ version "18.1.3"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0"
+ integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs@^15.4.1:
+ version "15.4.1"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
+ integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==
+ dependencies:
+ cliui "^6.0.0"
+ decamelize "^1.2.0"
+ find-up "^4.1.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^4.2.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^18.1.2"
+
year@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/year/-/year-0.2.1.tgz#4083ae520a318b23ec86037f3000cb892bdf9bb0"
From 6564c85a30be41d01345846f55c421ff4258d471 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Fri, 23 Apr 2021 15:14:28 +0100
Subject: [PATCH 127/135] continuing work on smtp testing.
---
packages/worker/src/api/routes/tests/email.spec.js | 1 -
.../src/api/routes/tests/utilities/TestConfiguration.js | 9 +++++----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/packages/worker/src/api/routes/tests/email.spec.js b/packages/worker/src/api/routes/tests/email.spec.js
index 2f571e86a..b67bce2be 100644
--- a/packages/worker/src/api/routes/tests/email.spec.js
+++ b/packages/worker/src/api/routes/tests/email.spec.js
@@ -26,6 +26,5 @@ describe("/api/admin/email", () => {
.set(config.defaultHeaders())
.expect("Content-Type", /json/)
.expect(200)
- expect(res.body._rev).toBeDefined()
})
})
\ No newline at end of file
diff --git a/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js b/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
index 7266fe4fd..18656a0a2 100644
--- a/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
+++ b/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
@@ -1,4 +1,4 @@
-const env = require("../../environment")
+const env = require("../../../../environment")
const controllers = require("./controllers")
const supertest = require("supertest")
const { jwt } = require("@budibase/auth").auth
@@ -67,9 +67,10 @@ class TestConfiguration {
await this._req({
type: Configs.SMTP,
config: {
- url: "http://localhost:10000",
- logoUrl: "http://localhost:10000/logo",
- company: "TestCompany",
+ port: 12345,
+ host: "smtptesthost.com",
+ from: "testfrom@test.com",
+
}
}, null, controllers.config.save)
}
From d985d338ec4d5b84987452498eabf33d19028ce5 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Fri, 23 Apr 2021 18:07:39 +0100
Subject: [PATCH 128/135] Updating test cases and some re-work of the email
system.
---
packages/auth/src/index.js | 2 +-
packages/auth/src/middleware/authenticated.js | 21 ++++--
packages/auth/src/utils.js | 2 +-
.../server/src/api/routes/tests/query.spec.js | 2 +-
.../src/api/routes/tests/routing.spec.js | 12 +++-
.../server/src/api/routes/tests/user.spec.js | 4 +-
.../routes/tests/utilities/TestFunctions.js | 15 +++--
packages/server/src/middleware/currentapp.js | 8 +--
.../src/middleware/tests/currentapp.spec.js | 8 +--
.../src/tests/utilities/TestConfiguration.js | 66 ++++++++++++++-----
.../worker/src/api/controllers/admin/email.js | 6 +-
packages/worker/src/api/index.js | 7 ++
.../worker/src/api/routes/admin/templates.js | 2 +
packages/worker/src/api/routes/index.js | 12 +++-
.../tests/utilities/TestConfiguration.js | 14 +++-
.../worker/src/constants/templates/index.js | 10 ++-
packages/worker/src/utilities/email.js | 2 +-
packages/worker/src/utilities/templates.js | 2 +-
18 files changed, 138 insertions(+), 57 deletions(-)
diff --git a/packages/auth/src/index.js b/packages/auth/src/index.js
index 5be91cc10..348f911f8 100644
--- a/packages/auth/src/index.js
+++ b/packages/auth/src/index.js
@@ -36,7 +36,7 @@ module.exports = {
buildAuthMiddleware: authenticated,
passport,
google,
- jwt,
+ jwt: require("jsonwebtoken"),
},
StaticDatabases,
constants: require("./constants"),
diff --git a/packages/auth/src/middleware/authenticated.js b/packages/auth/src/middleware/authenticated.js
index 443384ee7..d64c30a70 100644
--- a/packages/auth/src/middleware/authenticated.js
+++ b/packages/auth/src/middleware/authenticated.js
@@ -1,6 +1,6 @@
const { Cookies } = require("../constants")
const database = require("../db")
-const { getCookie } = require("../utils")
+const { getCookie, clearCookie } = require("../utils")
const { StaticDatabases } = require("../db/utils")
module.exports = (noAuthPatterns = []) => {
@@ -15,11 +15,20 @@ module.exports = (noAuthPatterns = []) => {
const authCookie = getCookie(ctx, Cookies.Auth)
if (authCookie) {
- const db = database.getDB(StaticDatabases.GLOBAL.name)
- const user = await db.get(authCookie.userId)
- delete user.password
- ctx.isAuthenticated = true
- ctx.user = user
+ try {
+ const db = database.getDB(StaticDatabases.GLOBAL.name)
+ const user = await db.get(authCookie.userId)
+ delete user.password
+ ctx.isAuthenticated = true
+ ctx.user = user
+ } catch (err) {
+ // remove the cookie as the use does not exist anymore
+ clearCookie(ctx, Cookies.Auth)
+ }
+ }
+ // be explicit
+ if (ctx.isAuthenticated !== true) {
+ ctx.isAuthenticated = false
}
return next()
diff --git a/packages/auth/src/utils.js b/packages/auth/src/utils.js
index b9514d059..10507410b 100644
--- a/packages/auth/src/utils.js
+++ b/packages/auth/src/utils.js
@@ -92,7 +92,7 @@ exports.setCookie = (ctx, value, name = "builder") => {
* Utility function, simply calls setCookie with an empty string for value
*/
exports.clearCookie = (ctx, name) => {
- exports.setCookie(ctx, "", name)
+ exports.setCookie(ctx, null, name)
}
/**
diff --git a/packages/server/src/api/routes/tests/query.spec.js b/packages/server/src/api/routes/tests/query.spec.js
index 2755c0230..eadd475ed 100644
--- a/packages/server/src/api/routes/tests/query.spec.js
+++ b/packages/server/src/api/routes/tests/query.spec.js
@@ -93,7 +93,7 @@ describe("/queries", () => {
const query = await config.createQuery()
const res = await request
.get(`/api/queries/${query._id}`)
- .set(await config.roleHeaders())
+ .set(await config.roleHeaders({}))
.expect("Content-Type", /json/)
.expect(200)
expect(res.body.fields).toBeUndefined()
diff --git a/packages/server/src/api/routes/tests/routing.spec.js b/packages/server/src/api/routes/tests/routing.spec.js
index 5fe0e26f1..d40b35ba8 100644
--- a/packages/server/src/api/routes/tests/routing.spec.js
+++ b/packages/server/src/api/routes/tests/routing.spec.js
@@ -35,7 +35,11 @@ describe("/routing", () => {
})
const res = await request
.get(`/api/routing/client`)
- .set(await config.roleHeaders("basic@test.com", BUILTIN_ROLE_IDS.BASIC))
+ .set(await config.roleHeaders({
+ email: "basic@test.com",
+ roleId: BUILTIN_ROLE_IDS.BASIC,
+ builder: false
+ }))
.expect("Content-Type", /json/)
.expect(200)
expect(res.body.routes).toBeDefined()
@@ -59,7 +63,11 @@ describe("/routing", () => {
})
const res = await request
.get(`/api/routing/client`)
- .set(await config.roleHeaders("basic@test.com", BUILTIN_ROLE_IDS.POWER))
+ .set(await config.roleHeaders({
+ email: "basic@test.com",
+ roleId: BUILTIN_ROLE_IDS.POWER,
+ builder: false,
+ }))
.expect("Content-Type", /json/)
.expect(200)
expect(res.body.routes).toBeDefined()
diff --git a/packages/server/src/api/routes/tests/user.spec.js b/packages/server/src/api/routes/tests/user.spec.js
index e80672284..b474e360a 100644
--- a/packages/server/src/api/routes/tests/user.spec.js
+++ b/packages/server/src/api/routes/tests/user.spec.js
@@ -5,7 +5,9 @@ const { basicUser } = setup.structures
const workerRequests = require("../../../utilities/workerRequests")
jest.mock("../../../utilities/workerRequests", () => ({
- getGlobalUsers: jest.fn(),
+ getGlobalUsers: jest.fn(() => {
+ return {}
+ }),
saveGlobalUser: jest.fn(() => {
const uuid = require("uuid/v4")
return {
diff --git a/packages/server/src/api/routes/tests/utilities/TestFunctions.js b/packages/server/src/api/routes/tests/utilities/TestFunctions.js
index 9ee68c283..0e11dd205 100644
--- a/packages/server/src/api/routes/tests/utilities/TestFunctions.js
+++ b/packages/server/src/api/routes/tests/utilities/TestFunctions.js
@@ -46,7 +46,10 @@ exports.createRequest = (request, method, url, body) => {
}
exports.checkBuilderEndpoint = async ({ config, method, url, body }) => {
- const headers = await config.login()
+ const headers = await config.login("test@test.com", "test", {
+ userId: "us_fail",
+ builder: false,
+ })
await exports
.createRequest(config.request, method, url, body)
.set(headers)
@@ -62,9 +65,10 @@ exports.checkPermissionsEndpoint = async ({
failRole,
}) => {
const password = "PASSWORD"
- await config.createUser("passUser@budibase.com", password, passRole)
- const passHeader = await config.login("passUser@budibase.com", password, {
+ let user = await config.createUser("pass@budibase.com", password, passRole)
+ const passHeader = await config.login("pass@budibase.com", password, {
roleId: passRole,
+ userId: user.globalId,
})
await exports
@@ -72,9 +76,10 @@ exports.checkPermissionsEndpoint = async ({
.set(passHeader)
.expect(200)
- await config.createUser("failUser@budibase.com", password, failRole)
- const failHeader = await config.login("failUser@budibase.com", password, {
+ user = await config.createUser("fail@budibase.com", password, failRole)
+ const failHeader = await config.login("fail@budibase.com", password, {
roleId: failRole,
+ userId: user.globalId,
})
await exports
diff --git a/packages/server/src/middleware/currentapp.js b/packages/server/src/middleware/currentapp.js
index d85d2158c..0828c809c 100644
--- a/packages/server/src/middleware/currentapp.js
+++ b/packages/server/src/middleware/currentapp.js
@@ -3,10 +3,7 @@ const { Cookies } = require("@budibase/auth").constants
const { getRole } = require("../utilities/security/roles")
const { getGlobalUsers } = require("../utilities/workerRequests")
const { BUILTIN_ROLE_IDS } = require("../utilities/security/roles")
-const {
- getGlobalIDFromUserMetadataID,
- generateUserMetadataID,
-} = require("../db/utils")
+const { generateUserMetadataID } = require("../db/utils")
module.exports = async (ctx, next) => {
// try to get the appID from the request
@@ -31,8 +28,7 @@ module.exports = async (ctx, next) => {
appCookie.roleId === BUILTIN_ROLE_IDS.PUBLIC)
) {
// Different App ID means cookie needs reset, or if the same public user has logged in
- const globalId = getGlobalIDFromUserMetadataID(ctx.user._id)
- const globalUser = await getGlobalUsers(ctx, requestAppId, globalId)
+ const globalUser = await getGlobalUsers(ctx, requestAppId, ctx.user._id)
updateCookie = true
appId = requestAppId
if (globalUser.roles && globalUser.roles[requestAppId]) {
diff --git a/packages/server/src/middleware/tests/currentapp.spec.js b/packages/server/src/middleware/tests/currentapp.spec.js
index 61d5bf018..e83b364cb 100644
--- a/packages/server/src/middleware/tests/currentapp.spec.js
+++ b/packages/server/src/middleware/tests/currentapp.spec.js
@@ -5,7 +5,7 @@ function mockWorker() {
jest.mock("../../utilities/workerRequests", () => ({
getGlobalUsers: () => {
return {
- email: "us_uuid1",
+ _id: "us_uuid1",
roles: {
"app_test": "BASIC",
}
@@ -67,7 +67,8 @@ class TestConfiguration {
setUser() {
this.ctx.user = {
- userId: "ro_ta_user_us_uuid1",
+ userId: "us_uuid1",
+ _id: "us_uuid1",
}
}
@@ -159,5 +160,4 @@ describe("Current app middleware", () => {
await checkExpected(false)
})
})
-
-})
\ No newline at end of file
+})
diff --git a/packages/server/src/tests/utilities/TestConfiguration.js b/packages/server/src/tests/utilities/TestConfiguration.js
index 0b19a74b9..9b4328ba3 100644
--- a/packages/server/src/tests/utilities/TestConfiguration.js
+++ b/packages/server/src/tests/utilities/TestConfiguration.js
@@ -16,7 +16,10 @@ const supertest = require("supertest")
const { cleanup } = require("../../utilities/fileSystem")
const { Cookies } = require("@budibase/auth").constants
const { jwt } = require("@budibase/auth").auth
+const { StaticDatabases } = require("@budibase/auth").db
+const CouchDB = require("../../db")
+const GLOBAL_USER_ID = "us_uuid1"
const EMAIL = "babs@babs.com"
const PASSWORD = "babs_password"
@@ -57,7 +60,27 @@ class TestConfiguration {
return request.body
}
+ async globalUser(id = GLOBAL_USER_ID, builder = true) {
+ const db = new CouchDB(StaticDatabases.GLOBAL.name)
+ let existing
+ try {
+ existing = await db.get(id)
+ } catch (err) {
+ existing = {}
+ }
+ const user = {
+ _id: id,
+ ...existing,
+ roles: {},
+ }
+ if (builder) {
+ user.builder = { global: true }
+ }
+ await db.put(user)
+ }
+
async init(appName = "test_application") {
+ await this.globalUser()
return this.createApp(appName)
}
@@ -69,17 +92,14 @@ class TestConfiguration {
}
defaultHeaders() {
- const user = {
- userId: "ro_ta_user_us_uuid1",
- builder: {
- global: true,
- },
+ const auth = {
+ userId: GLOBAL_USER_ID,
}
const app = {
roleId: BUILTIN_ROLE_IDS.BUILDER,
appId: this.appId,
}
- const authToken = jwt.sign(user, env.JWT_SECRET)
+ const authToken = jwt.sign(auth, env.JWT_SECRET)
const appToken = jwt.sign(app, env.JWT_SECRET)
const headers = {
Accept: "application/json",
@@ -104,14 +124,18 @@ class TestConfiguration {
return headers
}
- async roleHeaders(email = EMAIL, roleId = BUILTIN_ROLE_IDS.ADMIN) {
+ async roleHeaders({
+ email = EMAIL,
+ roleId = BUILTIN_ROLE_IDS.ADMIN,
+ builder = false,
+ }) {
let user
try {
user = await this.createUser(email, PASSWORD, roleId)
} catch (err) {
// allow errors here
}
- return this.login(email, PASSWORD, { roleId, userId: user._id })
+ return this.login(email, PASSWORD, { roleId, userId: user._id, builder })
}
async createApp(appName) {
@@ -282,7 +306,9 @@ class TestConfiguration {
password = PASSWORD,
roleId = BUILTIN_ROLE_IDS.POWER
) {
- return this._req(
+ const globalId = `us_${Math.random()}`
+ await this.globalUser(globalId, roleId === BUILTIN_ROLE_IDS.BUILDER)
+ const user = await this._req(
{
email,
password,
@@ -291,28 +317,34 @@ class TestConfiguration {
null,
controllers.user.createMetadata
)
+ return {
+ ...user,
+ globalId,
+ }
}
- async login(email, password, { roleId, userId } = {}) {
- if (!roleId) {
- roleId = BUILTIN_ROLE_IDS.BUILDER
- }
+ async login(email, password, { roleId, userId, builder } = {}) {
+ roleId = !roleId ? BUILTIN_ROLE_IDS.BUILDER : roleId
+ userId = !userId ? `us_uuid1` : userId
if (!this.request) {
throw "Server has not been opened, cannot login."
}
+ // make sure the user exists in the global DB
+ if (roleId !== BUILTIN_ROLE_IDS.PUBLIC) {
+ await this.globalUser(userId, builder)
+ }
if (!email || !password) {
await this.createUser()
}
// have to fake this
- const user = {
- userId: userId || `us_uuid1`,
- email: email || EMAIL,
+ const auth = {
+ userId,
}
const app = {
roleId: roleId,
appId: this.appId,
}
- const authToken = jwt.sign(user, env.JWT_SECRET)
+ const authToken = jwt.sign(auth, env.JWT_SECRET)
const appToken = jwt.sign(app, env.JWT_SECRET)
// returning necessary request headers
diff --git a/packages/worker/src/api/controllers/admin/email.js b/packages/worker/src/api/controllers/admin/email.js
index 075559684..d735023f7 100644
--- a/packages/worker/src/api/controllers/admin/email.js
+++ b/packages/worker/src/api/controllers/admin/email.js
@@ -66,5 +66,9 @@ exports.sendEmail = async ctx => {
to: email,
html: await buildEmail(purpose, email, user),
}
- await transport.sendMail(message)
+ const response = await transport.sendMail(message)
+ ctx.body = {
+ ...response,
+ message: `Email sent to ${email}.`,
+ }
}
diff --git a/packages/worker/src/api/index.js b/packages/worker/src/api/index.js
index bc3c74aac..df346c8e0 100644
--- a/packages/worker/src/api/index.js
+++ b/packages/worker/src/api/index.js
@@ -23,6 +23,13 @@ router
)
.use("/health", ctx => (ctx.status = 200))
.use(buildAuthMiddleware(NO_AUTH_ENDPOINTS))
+ // for now no public access is allowed to worker (bar health check)
+ .use((ctx, next) => {
+ if (!ctx.isAuthenticated) {
+ ctx.throw(403, "Unauthorized - no public worker access")
+ }
+ return next()
+ })
// error handling middleware
router.use(async (ctx, next) => {
diff --git a/packages/worker/src/api/routes/admin/templates.js b/packages/worker/src/api/routes/admin/templates.js
index 81bd814cb..a00278cca 100644
--- a/packages/worker/src/api/routes/admin/templates.js
+++ b/packages/worker/src/api/routes/admin/templates.js
@@ -27,3 +27,5 @@ router
.get("/api/admin/template/:ownerId", controller.fetchByOwner)
.get("/api/admin/template/:id", controller.find)
.delete("/api/admin/template/:id/:rev", controller.destroy)
+
+module.exports = router
diff --git a/packages/worker/src/api/routes/index.js b/packages/worker/src/api/routes/index.js
index aa1c6874e..419c80e50 100644
--- a/packages/worker/src/api/routes/index.js
+++ b/packages/worker/src/api/routes/index.js
@@ -1,7 +1,17 @@
const userRoutes = require("./admin/users")
const configRoutes = require("./admin/configs")
const groupRoutes = require("./admin/groups")
+const templateRoutes = require("./admin/templates")
+const emailRoutes = require("./admin/email")
const authRoutes = require("./auth")
const appRoutes = require("./app")
-exports.routes = [configRoutes, userRoutes, groupRoutes, authRoutes, appRoutes]
+exports.routes = [
+ configRoutes,
+ userRoutes,
+ groupRoutes,
+ authRoutes,
+ appRoutes,
+ templateRoutes,
+ emailRoutes
+]
diff --git a/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js b/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
index 18656a0a2..6e499642d 100644
--- a/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
+++ b/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
@@ -36,12 +36,20 @@ class TestConfiguration {
return request.body
}
+ async init() {
+ // create a test user
+ await this._req({
+ _id: "us_uuid1",
+ builder: {
+ global: true,
+ }
+ }, null, controllers.users.save)
+ }
+
defaultHeaders() {
const user = {
+ _id: "us_uuid1",
userId: "us_uuid1",
- builder: {
- global: true,
- },
}
const authToken = jwt.sign(user, env.JWT_SECRET)
return {
diff --git a/packages/worker/src/constants/templates/index.js b/packages/worker/src/constants/templates/index.js
index 16ec84a37..1333baa39 100644
--- a/packages/worker/src/constants/templates/index.js
+++ b/packages/worker/src/constants/templates/index.js
@@ -8,18 +8,16 @@ const { join } = require("path")
const CouchDB = require("../../db")
const { getTemplateParams, StaticDatabases } = require("@budibase/auth").db
-const TEMPLATE_PATH = join(__dirname, "..", "constants", "templates")
-
exports.EmailTemplates = {
[EmailTemplatePurpose.PASSWORD_RECOVERY]: readStaticFile(
- join(TEMPLATE_PATH, "passwordRecovery.html")
+ join(__dirname, "passwordRecovery.html")
),
[EmailTemplatePurpose.INVITATION]: readStaticFile(
- join(TEMPLATE_PATH, "invitation.html")
+ join(__dirname, "invitation.html")
),
- [EmailTemplatePurpose.BASE]: readStaticFile(join(TEMPLATE_PATH, "base.html")),
+ [EmailTemplatePurpose.BASE]: readStaticFile(join(__dirname, "base.html")),
[EmailTemplatePurpose.STYLES]: readStaticFile(
- join(TEMPLATE_PATH, "style.css")
+ join(__dirname, "style.css")
),
}
diff --git a/packages/worker/src/utilities/email.js b/packages/worker/src/utilities/email.js
index bc3933531..b5e64a279 100644
--- a/packages/worker/src/utilities/email.js
+++ b/packages/worker/src/utilities/email.js
@@ -1,6 +1,6 @@
const nodemailer = require("nodemailer")
-exports.createSMTPTransport = (config) => {
+exports.createSMTPTransport = config => {
const options = {
port: config.port,
host: config.host,
diff --git a/packages/worker/src/utilities/templates.js b/packages/worker/src/utilities/templates.js
index 9a3e2d291..22a926836 100644
--- a/packages/worker/src/utilities/templates.js
+++ b/packages/worker/src/utilities/templates.js
@@ -1,4 +1,4 @@
-const CouchDB = require("../../../db")
+const CouchDB = require("../db")
const { getConfigParams, StaticDatabases } = require("@budibase/auth").db
const { Configs, TemplateBindings, LOGO_URL } = require("../constants")
const { checkSlashesInUrl } = require("./index")
From 73ad093a50c3f116320a8f66f0c50b112c2e6e94 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Fri, 23 Apr 2021 18:54:12 +0100
Subject: [PATCH 129/135] Major update, fixing email test case.
---
.../worker/src/api/controllers/admin/email.js | 9 +++++++++
.../src/api/controllers/admin/templates.js | 7 +++++--
.../worker/src/api/controllers/admin/users.js | 10 +++++-----
packages/worker/src/api/routes/admin/configs.js | 2 +-
packages/worker/src/api/routes/admin/users.js | 8 ++++----
.../worker/src/api/routes/tests/email.spec.js | 14 +++++++++++++-
.../routes/tests/utilities/TestConfiguration.js | 6 ++++--
.../api/routes/tests/utilities/controllers.js | 6 +++---
packages/worker/src/constants/index.js | 3 ++-
.../constants/templates/{base.html => base.hbs} | 7 ++++---
.../worker/src/constants/templates/index.js | 17 +++++++++++------
.../{invitation.html => invitation.hbs} | 0
...sswordRecovery.html => passwordRecovery.hbs} | 0
.../templates/{style.css => style.hbs} | 0
packages/worker/src/utilities/templates.js | 11 ++++++-----
15 files changed, 67 insertions(+), 33 deletions(-)
rename packages/worker/src/constants/templates/{base.html => base.hbs} (94%)
rename packages/worker/src/constants/templates/{invitation.html => invitation.hbs} (100%)
rename packages/worker/src/constants/templates/{passwordRecovery.html => passwordRecovery.hbs} (100%)
rename packages/worker/src/constants/templates/{style.css => style.hbs} (100%)
diff --git a/packages/worker/src/api/controllers/admin/email.js b/packages/worker/src/api/controllers/admin/email.js
index d735023f7..f11edbd2e 100644
--- a/packages/worker/src/api/controllers/admin/email.js
+++ b/packages/worker/src/api/controllers/admin/email.js
@@ -28,6 +28,12 @@ async function buildEmail(purpose, email, user) {
getTemplateByPurpose(TYPE, EmailTemplatePurpose.STYLES),
getTemplateByPurpose(TYPE, purpose),
])
+ if (!base || !styles || !body) {
+ throw "Unable to build email, missing base components"
+ }
+ base = base.contents
+ styles = styles.contents
+ body = body.contents
// TODO: need to extend the context as much as possible
const context = {
@@ -59,6 +65,9 @@ exports.sendEmail = async ctx => {
user = db.get(userId)
}
const config = await determineScopedConfig(db, params)
+ if (!config) {
+ ctx.throw(400, "Unable to find SMTP configuration")
+ }
const transport = createSMTPTransport(config)
const message = {
from: config.from,
diff --git a/packages/worker/src/api/controllers/admin/templates.js b/packages/worker/src/api/controllers/admin/templates.js
index 8d4065b77..30c90d50b 100644
--- a/packages/worker/src/api/controllers/admin/templates.js
+++ b/packages/worker/src/api/controllers/admin/templates.js
@@ -1,10 +1,13 @@
const { generateTemplateID, StaticDatabases } = require("@budibase/auth").db
const { CouchDB } = require("../../../db")
-const { TemplateMetadata, TemplateBindings } = require("../../../constants")
+const {
+ TemplateMetadata,
+ TemplateBindings,
+ GLOBAL_OWNER,
+} = require("../../../constants")
const { getTemplates } = require("../../../constants/templates")
const GLOBAL_DB = StaticDatabases.GLOBAL.name
-const GLOBAL_OWNER = "global"
exports.save = async ctx => {
const db = new CouchDB(GLOBAL_DB)
diff --git a/packages/worker/src/api/controllers/admin/users.js b/packages/worker/src/api/controllers/admin/users.js
index 95dd474e9..146373e67 100644
--- a/packages/worker/src/api/controllers/admin/users.js
+++ b/packages/worker/src/api/controllers/admin/users.js
@@ -11,7 +11,7 @@ const FIRST_USER_EMAIL = "test@test.com"
const FIRST_USER_PASSWORD = "test"
const GLOBAL_DB = StaticDatabases.GLOBAL.name
-exports.userSave = async ctx => {
+exports.save = async ctx => {
const db = new CouchDB(GLOBAL_DB)
const { email, password, _id } = ctx.request.body
@@ -69,10 +69,10 @@ exports.firstUser = async ctx => {
global: true,
},
}
- await exports.userSave(ctx)
+ await exports.save(ctx)
}
-exports.userDelete = async ctx => {
+exports.destroy = async ctx => {
const db = new CouchDB(GLOBAL_DB)
const dbUser = await db.get(ctx.params.id)
await db.remove(dbUser._id, dbUser._rev)
@@ -82,7 +82,7 @@ exports.userDelete = async ctx => {
}
// called internally by app server user fetch
-exports.userFetch = async ctx => {
+exports.fetch = async ctx => {
const db = new CouchDB(GLOBAL_DB)
const response = await db.allDocs(
getGlobalUserParams(null, {
@@ -100,7 +100,7 @@ exports.userFetch = async ctx => {
}
// called internally by app server user find
-exports.userFind = async ctx => {
+exports.find = async ctx => {
const db = new CouchDB(GLOBAL_DB)
let user
try {
diff --git a/packages/worker/src/api/routes/admin/configs.js b/packages/worker/src/api/routes/admin/configs.js
index 826f9535c..4b9b8396c 100644
--- a/packages/worker/src/api/routes/admin/configs.js
+++ b/packages/worker/src/api/routes/admin/configs.js
@@ -25,7 +25,7 @@ function smtpValidation() {
function settingValidation() {
// prettier-ignore
return Joi.object({
- url: Joi.string().valid("", null),
+ platformUrl: Joi.string().valid("", null),
logoUrl: Joi.string().valid("", null),
company: Joi.string().required(),
}).unknown(true)
diff --git a/packages/worker/src/api/routes/admin/users.js b/packages/worker/src/api/routes/admin/users.js
index f06153385..d4bc4b6b6 100644
--- a/packages/worker/src/api/routes/admin/users.js
+++ b/packages/worker/src/api/routes/admin/users.js
@@ -25,10 +25,10 @@ function buildUserSaveValidation() {
}
router
- .post("/api/admin/users", buildUserSaveValidation(), controller.userSave)
- .get("/api/admin/users", controller.userFetch)
+ .post("/api/admin/users", buildUserSaveValidation(), controller.save)
+ .get("/api/admin/users", controller.fetch)
.post("/api/admin/users/first", controller.firstUser)
- .delete("/api/admin/users/:id", controller.userDelete)
- .get("/api/admin/users/:id", controller.userFind)
+ .delete("/api/admin/users/:id", controller.destroy)
+ .get("/api/admin/users/:id", controller.find)
module.exports = router
diff --git a/packages/worker/src/api/routes/tests/email.spec.js b/packages/worker/src/api/routes/tests/email.spec.js
index b67bce2be..797b0326e 100644
--- a/packages/worker/src/api/routes/tests/email.spec.js
+++ b/packages/worker/src/api/routes/tests/email.spec.js
@@ -5,12 +5,19 @@ const { EmailTemplatePurpose } = require("../../../constants")
const sendMailMock = jest.fn()
jest.mock("nodemailer")
const nodemailer = require("nodemailer")
-nodemailer.createTransport.mockReturnValue({"sendMail": sendMailMock});
+nodemailer.createTransport.mockReturnValue({
+ sendMail: sendMailMock,
+ verify: jest.fn()
+})
describe("/api/admin/email", () => {
let request = setup.getRequest()
let config = setup.getConfig()
+ beforeAll(async () => {
+ await config.init()
+ })
+
afterAll(setup.afterAll)
it("should be able to send an email (with mocking)", async () => {
@@ -26,5 +33,10 @@ describe("/api/admin/email", () => {
.set(config.defaultHeaders())
.expect("Content-Type", /json/)
.expect(200)
+ expect(res.body.message).toBeDefined()
+ expect(sendMailMock).toHaveBeenCalled()
+ const emailCall = sendMailMock.mock.calls[0][0]
+ expect(emailCall.subject).toBe("Hello!")
+ expect(emailCall.html).not.toContain("Invalid Binding")
})
})
\ No newline at end of file
diff --git a/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js b/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
index 6e499642d..900e5dea1 100644
--- a/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
+++ b/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
@@ -39,6 +39,8 @@ class TestConfiguration {
async init() {
// create a test user
await this._req({
+ email: "test@test.com",
+ password: "test",
_id: "us_uuid1",
builder: {
global: true,
@@ -64,7 +66,7 @@ class TestConfiguration {
await this._req({
type: Configs.SETTINGS,
config: {
- url: "http://localhost:10000",
+ platformUrl: "http://localhost:10000",
logoUrl: "http://localhost:10000/logo",
company: "TestCompany",
}
@@ -78,7 +80,7 @@ class TestConfiguration {
port: 12345,
host: "smtptesthost.com",
from: "testfrom@test.com",
-
+ subject: "Hello!",
}
}, null, controllers.config.save)
}
diff --git a/packages/worker/src/api/routes/tests/utilities/controllers.js b/packages/worker/src/api/routes/tests/utilities/controllers.js
index e74e6dc35..b0d2441c0 100644
--- a/packages/worker/src/api/routes/tests/utilities/controllers.js
+++ b/packages/worker/src/api/routes/tests/utilities/controllers.js
@@ -1,7 +1,7 @@
module.exports = {
email: require("../../../controllers/admin/email"),
groups: require("../../../controllers/admin/groups"),
- config: require("../../../controllers/admin/groups"),
- templates: require("../../../controllers/admin/groups"),
- users: require("../../../controllers/admin/groups"),
+ config: require("../../../controllers/admin/configs"),
+ templates: require("../../../controllers/admin/templates"),
+ users: require("../../../controllers/admin/users"),
}
diff --git a/packages/worker/src/constants/index.js b/packages/worker/src/constants/index.js
index 7406db0bd..3bc8dbc03 100644
--- a/packages/worker/src/constants/index.js
+++ b/packages/worker/src/constants/index.js
@@ -30,7 +30,7 @@ const EmailTemplatePurpose = {
}
const TemplateBindings = {
- URL: "url",
+ PLATFORM_URL: "platformUrl",
COMPANY: "company",
LOGO_URL: "logoUrl",
STYLES: "styles",
@@ -76,3 +76,4 @@ exports.TemplateTypes = TemplateTypes
exports.EmailTemplatePurpose = EmailTemplatePurpose
exports.TemplateMetadata = TemplateMetadata
exports.TemplateBindings = TemplateBindings
+exports.GLOBAL_OWNER = "global"
diff --git a/packages/worker/src/constants/templates/base.html b/packages/worker/src/constants/templates/base.hbs
similarity index 94%
rename from packages/worker/src/constants/templates/base.html
rename to packages/worker/src/constants/templates/base.hbs
index f728404be..1d8ff5270 100644
--- a/packages/worker/src/constants/templates/base.html
+++ b/packages/worker/src/constants/templates/base.hbs
@@ -47,7 +47,7 @@
@@ -64,7 +64,7 @@
- © 2021 Restobar. All Rights Reserved
+ © 2021 {{ company }}. All Rights Reserved
@@ -79,4 +79,5 @@
-
\ No newline at end of file
+
+
\ No newline at end of file
diff --git a/packages/worker/src/constants/templates/index.js b/packages/worker/src/constants/templates/index.js
index 1333baa39..dd375d1e8 100644
--- a/packages/worker/src/constants/templates/index.js
+++ b/packages/worker/src/constants/templates/index.js
@@ -3,6 +3,7 @@ const {
EmailTemplatePurpose,
TemplateTypes,
TemplatePurpose,
+ GLOBAL_OWNER,
} = require("../index")
const { join } = require("path")
const CouchDB = require("../../db")
@@ -10,14 +11,14 @@ const { getTemplateParams, StaticDatabases } = require("@budibase/auth").db
exports.EmailTemplates = {
[EmailTemplatePurpose.PASSWORD_RECOVERY]: readStaticFile(
- join(__dirname, "passwordRecovery.html")
+ join(__dirname, "passwordRecovery.hbs")
),
[EmailTemplatePurpose.INVITATION]: readStaticFile(
- join(__dirname, "invitation.html")
+ join(__dirname, "invitation.hbs")
),
- [EmailTemplatePurpose.BASE]: readStaticFile(join(__dirname, "base.html")),
+ [EmailTemplatePurpose.BASE]: readStaticFile(join(__dirname, "base.hbs")),
[EmailTemplatePurpose.STYLES]: readStaticFile(
- join(__dirname, "style.css")
+ join(__dirname, "style.hbs")
),
}
@@ -37,7 +38,11 @@ exports.addBaseTemplates = (templates, type = null) => {
continue
}
if (exports.EmailTemplates[purpose]) {
- templates.push(exports.EmailTemplates[purpose])
+ templates.push({
+ contents: exports.EmailTemplates[purpose],
+ purpose,
+ type,
+ })
}
}
return templates
@@ -46,7 +51,7 @@ exports.addBaseTemplates = (templates, type = null) => {
exports.getTemplates = async ({ ownerId, type, id } = {}) => {
const db = new CouchDB(StaticDatabases.GLOBAL.name)
const response = await db.allDocs(
- getTemplateParams(ownerId, id, {
+ getTemplateParams(ownerId || GLOBAL_OWNER, id, {
include_docs: true,
})
)
diff --git a/packages/worker/src/constants/templates/invitation.html b/packages/worker/src/constants/templates/invitation.hbs
similarity index 100%
rename from packages/worker/src/constants/templates/invitation.html
rename to packages/worker/src/constants/templates/invitation.hbs
diff --git a/packages/worker/src/constants/templates/passwordRecovery.html b/packages/worker/src/constants/templates/passwordRecovery.hbs
similarity index 100%
rename from packages/worker/src/constants/templates/passwordRecovery.html
rename to packages/worker/src/constants/templates/passwordRecovery.hbs
diff --git a/packages/worker/src/constants/templates/style.css b/packages/worker/src/constants/templates/style.hbs
similarity index 100%
rename from packages/worker/src/constants/templates/style.css
rename to packages/worker/src/constants/templates/style.hbs
diff --git a/packages/worker/src/utilities/templates.js b/packages/worker/src/utilities/templates.js
index 22a926836..53c492557 100644
--- a/packages/worker/src/utilities/templates.js
+++ b/packages/worker/src/utilities/templates.js
@@ -15,17 +15,18 @@ exports.getSettingsTemplateContext = async () => {
})
)
let settings = response.rows.map(row => row.doc)[0] || {}
- if (!settings.url) {
- settings.url = LOCAL_URL
+ if (!settings.platformUrl) {
+ settings.platformUrl = LOCAL_URL
}
// TODO: need to fully spec out the context
+ const URL = settings.platformUrl
return {
[TemplateBindings.LOGO_URL]: settings.logoUrl || LOGO_URL,
- [TemplateBindings.URL]: settings.url,
+ [TemplateBindings.PLATFORM_URL]: URL,
[TemplateBindings.REGISTRATION_URL]: checkSlashesInUrl(
- `${settings.url}/registration`
+ `${URL}/registration`
),
- [TemplateBindings.RESET_URL]: checkSlashesInUrl(`${settings.url}/reset`),
+ [TemplateBindings.RESET_URL]: checkSlashesInUrl(`${URL}/reset`),
[TemplateBindings.COMPANY]: settings.company || BASE_COMPANY,
}
}
From 84e66f826bd7e795b4ac0ac82b028ef55554cc0c Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Mon, 26 Apr 2021 14:14:51 +0100
Subject: [PATCH 130/135] Updates after finding a better template to use and
adding some real email testing with Ethereal platform.
---
.../src/tests/utilities/TestConfiguration.js | 1 +
.../src/api/controllers/admin/configs.js | 2 +-
.../worker/src/api/controllers/admin/email.js | 1 +
.../worker/src/api/routes/admin/configs.js | 1 +
.../src/api/routes/tests/realEmail.spec.js | 60 ++
.../tests/utilities/TestConfiguration.js | 39 +-
packages/worker/src/constants/index.js | 4 +
.../worker/src/constants/templates/base.hbs | 99 +--
.../worker/src/constants/templates/index.js | 1 +
.../src/constants/templates/invitation.hbs | 73 +-
.../constants/templates/passwordRecovery.hbs | 69 +-
.../worker/src/constants/templates/style.hbs | 653 +++++++++++-------
.../src/constants/templates/welcome.hbs | 62 ++
packages/worker/src/utilities/templates.js | 2 +
14 files changed, 710 insertions(+), 357 deletions(-)
create mode 100644 packages/worker/src/api/routes/tests/realEmail.spec.js
create mode 100644 packages/worker/src/constants/templates/welcome.hbs
diff --git a/packages/server/src/tests/utilities/TestConfiguration.js b/packages/server/src/tests/utilities/TestConfiguration.js
index 9b4328ba3..c031cf082 100644
--- a/packages/server/src/tests/utilities/TestConfiguration.js
+++ b/packages/server/src/tests/utilities/TestConfiguration.js
@@ -50,6 +50,7 @@ class TestConfiguration {
request.config = { jwtSecret: env.JWT_SECRET }
request.appId = this.appId
request.user = { appId: this.appId }
+ request.query = {}
request.request = {
body: config,
}
diff --git a/packages/worker/src/api/controllers/admin/configs.js b/packages/worker/src/api/controllers/admin/configs.js
index dfd616fc6..c8d1c3d63 100644
--- a/packages/worker/src/api/controllers/admin/configs.js
+++ b/packages/worker/src/api/controllers/admin/configs.js
@@ -34,7 +34,7 @@ exports.save = async function(ctx) {
}
try {
- const response = await db.post(config)
+ const response = await db.put(config)
ctx.body = {
type,
_id: response.id,
diff --git a/packages/worker/src/api/controllers/admin/email.js b/packages/worker/src/api/controllers/admin/email.js
index f11edbd2e..9f4060d20 100644
--- a/packages/worker/src/api/controllers/admin/email.js
+++ b/packages/worker/src/api/controllers/admin/email.js
@@ -16,6 +16,7 @@ const TYPE = TemplateTypes.EMAIL
const FULL_EMAIL_PURPOSES = [
EmailTemplatePurpose.INVITATION,
EmailTemplatePurpose.PASSWORD_RECOVERY,
+ EmailTemplatePurpose.WELCOME,
]
async function buildEmail(purpose, email, user) {
diff --git a/packages/worker/src/api/routes/admin/configs.js b/packages/worker/src/api/routes/admin/configs.js
index 4b9b8396c..5865259a2 100644
--- a/packages/worker/src/api/routes/admin/configs.js
+++ b/packages/worker/src/api/routes/admin/configs.js
@@ -27,6 +27,7 @@ function settingValidation() {
return Joi.object({
platformUrl: Joi.string().valid("", null),
logoUrl: Joi.string().valid("", null),
+ docsUrl: Joi.string().valid("", null),
company: Joi.string().required(),
}).unknown(true)
}
diff --git a/packages/worker/src/api/routes/tests/realEmail.spec.js b/packages/worker/src/api/routes/tests/realEmail.spec.js
new file mode 100644
index 000000000..c96b8ab56
--- /dev/null
+++ b/packages/worker/src/api/routes/tests/realEmail.spec.js
@@ -0,0 +1,60 @@
+const setup = require("./utilities")
+const { EmailTemplatePurpose } = require("../../../constants")
+const nodemailer = require("nodemailer")
+const fetch = require("node-fetch")
+
+describe("/api/admin/email", () => {
+ let request = setup.getRequest()
+ let config = setup.getConfig()
+
+ beforeAll(async () => {
+ await config.init()
+ })
+
+ afterAll(setup.afterAll)
+
+ async function sendRealEmail(purpose) {
+ await config.saveEtherealSmtpConfig()
+ await config.saveSettingsConfig()
+ const res = await request
+ .post(`/api/admin/email/send`)
+ .send({
+ email: "test@test.com",
+ purpose,
+ })
+ .set(config.defaultHeaders())
+ .expect("Content-Type", /json/)
+ .expect(200)
+ expect(res.body.message).toBeDefined()
+ const testUrl = nodemailer.getTestMessageUrl(res.body)
+ expect(testUrl).toBeDefined()
+ const response = await fetch(testUrl)
+ const text = await response.text()
+ let toCheckFor
+ switch (purpose) {
+ case EmailTemplatePurpose.WELCOME:
+ toCheckFor = `Thanks for getting started with Budibase's Budibase platform.`
+ break
+ case EmailTemplatePurpose.INVITATION:
+ toCheckFor = `Use the button below to set up your account and get started:`
+ break
+ case EmailTemplatePurpose.PASSWORD_RECOVERY:
+ toCheckFor = `You recently requested to reset your password for your Budibase account in your Budibase platform`
+ break
+ }
+ expect(text).toContain(toCheckFor)
+ }
+
+ it("should be able to send a welcome email", async () => {
+ await sendRealEmail(EmailTemplatePurpose.WELCOME)
+
+ })
+
+ it("should be able to send a invitation email", async () => {
+ await sendRealEmail(EmailTemplatePurpose.INVITATION)
+ })
+
+ it("should be able to send a password recovery email", async () => {
+ const res = await sendRealEmail(EmailTemplatePurpose.PASSWORD_RECOVERY)
+ })
+})
\ No newline at end of file
diff --git a/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js b/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
index 900e5dea1..7ef4fa9ca 100644
--- a/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
+++ b/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
@@ -3,7 +3,7 @@ const controllers = require("./controllers")
const supertest = require("supertest")
const { jwt } = require("@budibase/auth").auth
const { Cookies } = require("@budibase/auth").constants
-const { Configs } = require("../../../../constants")
+const { Configs, LOGO_URL } = require("../../../../constants")
class TestConfiguration {
constructor(openServer = true) {
@@ -26,6 +26,7 @@ class TestConfiguration {
request.config = { jwtSecret: env.JWT_SECRET }
request.appId = this.appId
request.user = { appId: this.appId }
+ request.query = {}
request.request = {
body: config,
}
@@ -62,18 +63,34 @@ class TestConfiguration {
}
}
+ async deleteConfig(type) {
+ try {
+ const cfg = await this._req(null,{
+ type,
+ }, controllers.config.find)
+ if (cfg) {
+ await this._req(null, {
+ id: cfg._id,
+ rev: cfg._rev,
+ }, controllers.config.destroy)
+ }
+ } catch (err) {}
+ }
+
async saveSettingsConfig() {
+ await this.deleteConfig(Configs.SETTINGS)
await this._req({
type: Configs.SETTINGS,
config: {
platformUrl: "http://localhost:10000",
- logoUrl: "http://localhost:10000/logo",
- company: "TestCompany",
+ logoUrl: LOGO_URL,
+ company: "Budibase",
}
}, null, controllers.config.save)
}
async saveSmtpConfig() {
+ await this.deleteConfig(Configs.SMTP)
await this._req({
type: Configs.SMTP,
config: {
@@ -84,6 +101,22 @@ class TestConfiguration {
}
}, null, controllers.config.save)
}
+
+ async saveEtherealSmtpConfig() {
+ await this.deleteConfig(Configs.SMTP)
+ await this._req({
+ type: Configs.SMTP,
+ config: {
+ port: 587,
+ host: "smtp.ethereal.email",
+ secure: false,
+ auth: {
+ user: "don.bahringer@ethereal.email",
+ pass: "yCKSH8rWyUPbnhGYk9",
+ },
+ }
+ }, null, controllers.config.save)
+ }
}
module.exports = TestConfiguration
\ No newline at end of file
diff --git a/packages/worker/src/constants/index.js b/packages/worker/src/constants/index.js
index 3bc8dbc03..141a742ce 100644
--- a/packages/worker/src/constants/index.js
+++ b/packages/worker/src/constants/index.js
@@ -26,6 +26,7 @@ const EmailTemplatePurpose = {
STYLES: "styles",
PASSWORD_RECOVERY: "password_recovery",
INVITATION: "invitation",
+ WELCOME: "welcome",
CUSTOM: "custom",
}
@@ -39,6 +40,9 @@ const TemplateBindings = {
EMAIL: "email",
RESET_URL: "resetUrl",
USER: "user",
+ REQUEST: "request",
+ DOCS_URL: "docsUrl",
+ LOGIN_URL: "loginUrl",
}
const TemplateMetadata = {
diff --git a/packages/worker/src/constants/templates/base.hbs b/packages/worker/src/constants/templates/base.hbs
index 1d8ff5270..f80460502 100644
--- a/packages/worker/src/constants/templates/base.hbs
+++ b/packages/worker/src/constants/templates/base.hbs
@@ -1,83 +1,32 @@
-
-
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
-
+{{ body }}
+
\ No newline at end of file
diff --git a/packages/worker/src/constants/templates/index.js b/packages/worker/src/constants/templates/index.js
index dd375d1e8..7ddb85af4 100644
--- a/packages/worker/src/constants/templates/index.js
+++ b/packages/worker/src/constants/templates/index.js
@@ -20,6 +20,7 @@ exports.EmailTemplates = {
[EmailTemplatePurpose.STYLES]: readStaticFile(
join(__dirname, "style.hbs")
),
+ [EmailTemplatePurpose.WELCOME]: readStaticFile(join(__dirname, "welcome.hbs")),
}
exports.addBaseTemplates = (templates, type = null) => {
diff --git a/packages/worker/src/constants/templates/invitation.hbs b/packages/worker/src/constants/templates/invitation.hbs
index 8e154fe18..16b011a17 100644
--- a/packages/worker/src/constants/templates/invitation.hbs
+++ b/packages/worker/src/constants/templates/invitation.hbs
@@ -1,14 +1,67 @@
-
-
+
+
+
-
-
-
Budibase Invitation
-
You've been invited to join {{ company }}'s Budibase platform!
-
Please follow the below link to finish your registration.
-
Finish registration
-
+
+
+
+
+
+ {{ company }}
+
+
+
+
+
+
+
+
+
+
+
+
Hi, {{ email }}!
+
+ {{#if request}}
+ {{ request.inviter }} has invited you to use {{ company }}'s Budibase platform.<
+ {{else}}
+ You've been invited to use {{ company }}'s Budibase platform.
+ {{/if}}
+ Use the button below to set up your account and get started:
+
+
+
+
If you have any questions contact your Budibase platform administrator.
+
Welcome aboard,
+ The {{ company }} Team
+
P.S. Need help getting started? Check out our help documentation .
+
+
+
+
+ If you’re having trouble with the button above, copy and paste the URL below into your web browser.
+ {{ registrationUrl }}
+
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
diff --git a/packages/worker/src/constants/templates/passwordRecovery.hbs b/packages/worker/src/constants/templates/passwordRecovery.hbs
index 11f4eac1f..838e8f816 100644
--- a/packages/worker/src/constants/templates/passwordRecovery.hbs
+++ b/packages/worker/src/constants/templates/passwordRecovery.hbs
@@ -1,15 +1,62 @@
-
-
+
+
+
-
-
-
Budibase Password reset
-
Please follow the below link to reset your password.
-
Reset password
-
This password reset was required for {{ email }} if you did not
- request this then please contact your administrator.
-
+
+
+
+
+
+ {{ company }}
+
+
+
+
+
+
+
+
+
+
+
+
Hi {{ email }},
+
You recently requested to reset your password for your {{ company }} account in your Budibase platform. Use the button below to reset it. This password reset is only valid for the next 24 hours.
+
+
+ {{#if request}}
+
For security, this request was received from a {{ request.os }} device.
+ {{/if}}
+
If you did not request a password reset, please ignore this email or contact support if you have questions.
+
Thanks,
+ The {{ company }} Team
+
+
+
+
+ If you’re having trouble with the button above, copy and paste the URL below into your web browser.
+ {{ resetUrl }}
+
+
+
+
+
+
+
+
+
+
-
\ No newline at end of file
diff --git a/packages/worker/src/constants/templates/style.hbs b/packages/worker/src/constants/templates/style.hbs
index abcd79783..244e90178 100644
--- a/packages/worker/src/constants/templates/style.hbs
+++ b/packages/worker/src/constants/templates/style.hbs
@@ -1,269 +1,408 @@
-@font-face {
- font-family: 'Playfair Display';
- font-style: italic;
- font-weight: 400;
- src: url(/fonts.gstatic.com/s/playfairdisplay/v22/nuFkD-vYSZviVYUb_rj3ij__anPXDTnohkk72xU.woff2) format('woff2');
- unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
-}
-html,
+/* Based on templates: https://github.com/wildbit/postmark-templates/blob/master/templates/plain */
+/* Base ------------------------------ */
+
+@import url('https://fonts.googleapis.com/css2?family=Source+Sans+Pro&display=swap');
body {
- margin: 0 auto !important;
- padding: 0 !important;
- height: 100% !important;
- width: 100% !important;
- background: #f1f1f1;
+width: 100% !important;
+height: 100%;
+margin: 0;
+-webkit-text-size-adjust: none;
}
-* {
- -ms-text-size-adjust: 100%;
- -webkit-text-size-adjust: 100%;
+
+a {
+color: #3869D4;
}
-div[style*="margin: 16px 0"] {
- margin: 0 !important;
+
+a img {
+border: none;
}
-table,
+
td {
- mso-table-lspace: 0pt !important;
- mso-table-rspace: 0pt !important;
+word-break: break-word;
}
-table {
- border-spacing: 0 !important;
- border-collapse: collapse !important;
- table-layout: fixed !important;
- margin: 0 auto !important;
+
+.preheader {
+display: none !important;
+visibility: hidden;
+mso-hide: all;
+font-size: 1px;
+line-height: 1px;
+max-height: 0;
+max-width: 0;
+opacity: 0;
+overflow: hidden;
+}
+/* Type ------------------------------ */
+
+body,
+td,
+th {
+font-family: "Source Sans Pro", Helvetica, Arial, sans-serif;
}
-img {
- -ms-interpolation-mode:bicubic;
+
+h1 {
+margin-top: 0;
+color: #333333;
+font-size: 22px;
+font-weight: bold;
+text-align: left;
}
-a {
- text-decoration: none;
+
+h2 {
+margin-top: 0;
+color: #333333;
+font-size: 16px;
+font-weight: bold;
+text-align: left;
+}
+
+h3 {
+margin-top: 0;
+color: #333333;
+font-size: 14px;
+font-weight: bold;
+text-align: left;
}
-*[x-apple-data-detectors], /* iOS */
-.unstyle-auto-detected-links *,
-.aBn {
- border-bottom: 0 !important;
- cursor: default !important;
- color: inherit !important;
- text-decoration: none !important;
- font-size: inherit !important;
- font-family: inherit !important;
- font-weight: inherit !important;
- line-height: inherit !important;
+
+td,
+th {
+font-size: 16px;
+}
+
+p,
+ul,
+ol,
+blockquote {
+margin: .4em 0 1.1875em;
+font-size: 16px;
+line-height: 1.625;
+}
+
+p.sub {
+font-size: 13px;
+}
+/* Utilities ------------------------------ */
+
+.align-right {
+text-align: right;
+}
+
+.align-left {
+text-align: left;
+}
+
+.align-center {
+text-align: center;
+}
+/* Buttons ------------------------------ */
+
+.button {
+background-color: #3869D4;
+border-top: 10px solid #3869D4;
+border-right: 18px solid #3869D4;
+border-bottom: 10px solid #3869D4;
+border-left: 18px solid #3869D4;
+display: inline-block;
+color: #FFF;
+text-decoration: none;
+border-radius: 3px;
+box-shadow: 0 2px 3px rgba(0, 0, 0, 0.16);
+-webkit-text-size-adjust: none;
+box-sizing: border-box;
+}
+
+.button--green {
+background-color: #22BC66;
+border-top: 10px solid #22BC66;
+border-right: 18px solid #22BC66;
+border-bottom: 10px solid #22BC66;
+border-left: 18px solid #22BC66;
+}
+
+.button--red {
+background-color: #FF6136;
+border-top: 10px solid #FF6136;
+border-right: 18px solid #FF6136;
+border-bottom: 10px solid #FF6136;
+border-left: 18px solid #FF6136;
}
-.a6S {
- display: none !important;
- opacity: 0.01 !important;
+
+@media only screen and (max-width: 500px) {
+.button {
+width: 100% !important;
+text-align: center !important;
+}
+}
+/* Attribute list ------------------------------ */
+
+.attributes {
+margin: 0 0 21px;
+}
+
+.attributes_content {
+background-color: #F4F4F7;
+padding: 16px;
+}
+
+.attributes_item {
+padding: 0;
+}
+/* Related Items ------------------------------ */
+
+.related {
+width: 100%;
+margin: 0;
+padding: 25px 0 0 0;
+-premailer-width: 100%;
+-premailer-cellpadding: 0;
+-premailer-cellspacing: 0;
+}
+
+.related_item {
+padding: 10px 0;
+color: #CBCCCF;
+font-size: 15px;
+line-height: 18px;
+}
+
+.related_item-title {
+display: block;
+margin: .5em 0 0;
+}
+
+.related_item-thumb {
+display: block;
+padding-bottom: 10px;
+}
+
+.related_heading {
+border-top: 1px solid #CBCCCF;
+text-align: center;
+padding: 25px 0 10px;
+}
+/* Discount Code ------------------------------ */
+
+.discount {
+width: 100%;
+margin: 0;
+padding: 24px;
+-premailer-width: 100%;
+-premailer-cellpadding: 0;
+-premailer-cellspacing: 0;
+background-color: #F4F4F7;
+border: 2px dashed #CBCCCF;
+}
+
+.discount_heading {
+text-align: center;
+}
+
+.discount_body {
+text-align: center;
+font-size: 15px;
+}
+/* Social Icons ------------------------------ */
+
+.social {
+width: auto;
+}
+
+.social td {
+padding: 0;
+width: auto;
}
-.im {
- color: inherit !important;
-}
-img.g-img + div {
- display: none !important;
-}
-@media only screen and (min-device-width: 320px) and (max-device-width: 374px) {
- u ~ div .email-container {
- min-width: 320px !important;
- }
-}
-@media only screen and (min-device-width: 375px) and (max-device-width: 413px) {
- u ~ div .email-container {
- min-width: 375px !important;
- }
-}
-@media only screen and (min-device-width: 414px) {
- u ~ div .email-container {
- min-width: 414px !important;
- }
-}
-.primary{
- background: #f3a333;
-}
-.bg_white{
- background: #ffffff;
-}
-.bg_light{
- background: #fafafa;
-}
-.bg_black{
- background: #000000;
-}
-.bg_dark{
- background: rgba(0,0,0,.8);
-}
-.email-section{
- padding:2.5em;
-}
-.btn{
- padding: 10px 15px;
-}
-.btn.btn-primary{
- border-radius: 30px;
- background: #f3a333;
- color: #ffffff;
-}
-h1,h2,h3,h4,h5,h6{
- font-family: 'Playfair Display', serif;
- color: #000000;
- margin-top: 0;
-}
-body{
- font-family: 'Montserrat', sans-serif;
- font-weight: 400;
- font-size: 15px;
- line-height: 1.8;
- color: rgba(0,0,0,.4);
-}
-a{
- color: #f3a333;
-}
-table{
-}
-.logo h1{
- margin: 0;
-}
-.logo h1 a{
- color: #000;
- font-size: 20px;
- font-weight: 700;
- text-transform: uppercase;
- font-family: 'Montserrat', sans-serif;
-}
-.hero{
- position: relative;
-}
-.hero img{
-
-}
-.hero .text{
- color: rgba(255,255,255,.8);
-}
-.hero .text h2{
- color: #ffffff;
- font-size: 30px;
- margin-bottom: 0;
-}
-.heading-section{
-}
-.heading-section h2{
- color: #000000;
- font-size: 28px;
- margin-top: 0;
- line-height: 1.4;
-}
-.heading-section .subheading{
- margin-bottom: 20px !important;
- display: inline-block;
- font-size: 13px;
- text-transform: uppercase;
- letter-spacing: 2px;
- color: rgba(0,0,0,.4);
- position: relative;
-}
-.heading-section .subheading::after{
- position: absolute;
- left: 0;
- right: 0;
- bottom: -10px;
- content: '';
- width: 100%;
- height: 2px;
- background: #f3a333;
- margin: 0 auto;
-}
-.heading-section-white{
- color: rgba(255,255,255,.8);
-}
-.heading-section-white h2{
- font-size: 28px;
- line-height: 1;
- padding-bottom: 0;
-}
-.heading-section-white h2{
- color: #ffffff;
-}
-.heading-section-white .subheading{
- margin-bottom: 0;
- display: inline-block;
- font-size: 13px;
- text-transform: uppercase;
- letter-spacing: 2px;
- color: rgba(255,255,255,.4);
-}
-.icon{
- text-align: center;
-}
-.icon img{
-}
-.text-services{
- padding: 10px 10px 0;
- text-align: center;
-}
-.text-services h3{
- font-size: 20px;
-}
-.text-services .meta{
- text-transform: uppercase;
- font-size: 14px;
-}
-.img{
- width: 100%;
- height: auto;
- position: relative;
-}
-.img .icon{
- position: absolute;
- top: 50%;
- left: 0;
- right: 0;
- bottom: 0;
- margin-top: -25px;
-}
-.img .icon a{
- display: block;
- width: 60px;
- position: absolute;
- top: 0;
- left: 50%;
- margin-left: -25px;
-}
-.counter-text{
- text-align: center;
-}
-.counter-text .num{
- display: block;
- color: #ffffff;
- font-size: 34px;
- font-weight: 700;
-}
-.counter-text .name{
- display: block;
- color: rgba(255,255,255,.9);
- font-size: 13px;
-}
-.footer{
- color: rgba(255,255,255,.5);
-}
-.footer .heading{
- color: #ffffff;
- font-size: 20px;
-}
-.footer ul{
- margin: 0;
- padding: 0;
-}
-.footer ul li{
- list-style: none;
- margin-bottom: 10px;
-}
-.footer ul li a{
- color: rgba(255,255,255,1);
-}
-@media screen and (max-width: 500px) {
- .icon{
- text-align: left;
- }
- .text-services{
- padding-left: 0;
- padding-right: 20px;
- text-align: left;
- }
+
+.social_icon {
+height: 20px;
+margin: 0 8px 10px 8px;
+padding: 0;
+}
+/* Data table ------------------------------ */
+
+.purchase {
+width: 100%;
+margin: 0;
+padding: 35px 0;
+-premailer-width: 100%;
+-premailer-cellpadding: 0;
+-premailer-cellspacing: 0;
+}
+
+.purchase_content {
+width: 100%;
+margin: 0;
+padding: 25px 0 0 0;
+-premailer-width: 100%;
+-premailer-cellpadding: 0;
+-premailer-cellspacing: 0;
+}
+
+.purchase_item {
+padding: 10px 0;
+color: #51545E;
+font-size: 15px;
+line-height: 18px;
+}
+
+.purchase_heading {
+padding-bottom: 8px;
+border-bottom: 1px solid #EAEAEC;
+}
+
+.purchase_heading p {
+margin: 0;
+color: #85878E;
+font-size: 12px;
+}
+
+.purchase_footer {
+padding-top: 15px;
+border-top: 1px solid #EAEAEC;
+}
+
+.purchase_total {
+margin: 0;
+text-align: right;
+font-weight: bold;
+color: #333333;
+}
+
+.purchase_total--label {
+padding: 0 15px 0 0;
+}
+
+body {
+background-color: #FFF;
+color: #333;
+}
+
+p {
+color: #333;
+}
+
+.email-wrapper {
+width: 100%;
+margin: 0;
+padding: 0;
+-premailer-width: 100%;
+-premailer-cellpadding: 0;
+-premailer-cellspacing: 0;
+}
+
+.email-content {
+width: 100%;
+margin: 0;
+padding: 0;
+-premailer-width: 100%;
+-premailer-cellpadding: 0;
+-premailer-cellspacing: 0;
+}
+/* Masthead ----------------------- */
+
+.email-masthead {
+padding: 25px 0;
+text-align: center;
+}
+
+.email-masthead_logo {
+width: 94px;
+}
+
+.email-masthead_name {
+font-size: 16px;
+font-weight: bold;
+color: #A8AAAF;
+text-decoration: none;
+text-shadow: 0 1px 0 white;
+}
+/* Body ------------------------------ */
+
+.email-body {
+width: 100%;
+margin: 0;
+padding: 0;
+-premailer-width: 100%;
+-premailer-cellpadding: 0;
+-premailer-cellspacing: 0;
+}
+
+.email-body_inner {
+width: 570px;
+margin: 0 auto;
+padding: 0;
+-premailer-width: 570px;
+-premailer-cellpadding: 0;
+-premailer-cellspacing: 0;
+}
+
+.email-footer {
+width: 570px;
+margin: 0 auto;
+padding: 0;
+-premailer-width: 570px;
+-premailer-cellpadding: 0;
+-premailer-cellspacing: 0;
+text-align: center;
+}
+
+.email-footer p {
+color: #A8AAAF;
+}
+
+.body-action {
+width: 100%;
+margin: 30px auto;
+padding: 0;
+-premailer-width: 100%;
+-premailer-cellpadding: 0;
+-premailer-cellspacing: 0;
+text-align: center;
+}
+
+.body-sub {
+margin-top: 25px;
+padding-top: 25px;
+border-top: 1px solid #EAEAEC;
+}
+
+.content-cell {
+padding: 35px;
+}
+/*Media Queries ------------------------------ */
+
+@media only screen and (max-width: 600px) {
+.email-body_inner,
+.email-footer {
+width: 100% !important;
+}
+}
+
+@media (prefers-color-scheme: dark) {
+body {
+background-color: #333333 !important;
+color: #FFF !important;
+}
+p,
+ul,
+ol,
+blockquote,
+h1,
+h2,
+h3,
+span,
+.purchase_item {
+color: #FFF !important;
+}
+.attributes_content,
+.discount {
+background-color: #222 !important;
+}
+.email-masthead_name {
+text-shadow: none !important;
+}
+}
+
+:root {
+color-scheme: light dark;
+supported-color-schemes: light dark;
}
\ No newline at end of file
diff --git a/packages/worker/src/constants/templates/welcome.hbs b/packages/worker/src/constants/templates/welcome.hbs
new file mode 100644
index 000000000..89d413612
--- /dev/null
+++ b/packages/worker/src/constants/templates/welcome.hbs
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+ {{ company }}
+
+
+
+
+
+
+
+
+
+
+
+
Welcome, {{ email }}!
+
Thanks for getting started with {{ company }}'s Budibase platform.
+
For reference, here's your login information:
+
+
+
+
+
+
+
+ Login Page: {{ loginUrl }}
+
+
+
+ {{#if request}}
+
+
+
+ Username: {{ request.loginUsername }}
+
+
+
+ {{/if}}
+
+
+
+
+
If you have any questions get in contact with your {{ company }}'s Budibase platform administration team.
+
Thanks,
+ The {{ company }} Team
+
P.S. Need immediate help getting started? Check out our help documentation .
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/worker/src/utilities/templates.js b/packages/worker/src/utilities/templates.js
index 53c492557..56c4340a7 100644
--- a/packages/worker/src/utilities/templates.js
+++ b/packages/worker/src/utilities/templates.js
@@ -28,5 +28,7 @@ exports.getSettingsTemplateContext = async () => {
),
[TemplateBindings.RESET_URL]: checkSlashesInUrl(`${URL}/reset`),
[TemplateBindings.COMPANY]: settings.company || BASE_COMPANY,
+ [TemplateBindings.DOCS_URL]: settings.docsUrl || "https://docs.budibase.com/",
+ [TemplateBindings.LOGIN_URL]: checkSlashesInUrl(`${URL}/login`),
}
}
From 5de2b26335f18853853636ace5357743f72b73e2 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Mon, 26 Apr 2021 14:16:05 +0100
Subject: [PATCH 131/135] Formatting.
---
.../src/api/controllers/admin/configs.js | 2 +-
packages/worker/src/api/routes/index.js | 2 +-
.../tests/utilities/TestConfiguration.js | 116 +++++++++++-------
.../worker/src/constants/templates/index.js | 6 +-
packages/worker/src/utilities/templates.js | 3 +-
5 files changed, 76 insertions(+), 53 deletions(-)
diff --git a/packages/worker/src/api/controllers/admin/configs.js b/packages/worker/src/api/controllers/admin/configs.js
index c8d1c3d63..107c0c8fa 100644
--- a/packages/worker/src/api/controllers/admin/configs.js
+++ b/packages/worker/src/api/controllers/admin/configs.js
@@ -30,7 +30,7 @@ exports.save = async function(ctx) {
switch (type) {
case Configs.SMTP:
await email.verifyConfig(config)
- break;
+ break
}
try {
diff --git a/packages/worker/src/api/routes/index.js b/packages/worker/src/api/routes/index.js
index 419c80e50..412d8c255 100644
--- a/packages/worker/src/api/routes/index.js
+++ b/packages/worker/src/api/routes/index.js
@@ -13,5 +13,5 @@ exports.routes = [
authRoutes,
appRoutes,
templateRoutes,
- emailRoutes
+ emailRoutes,
]
diff --git a/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js b/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
index 7ef4fa9ca..06a0d8e54 100644
--- a/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
+++ b/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
@@ -39,14 +39,18 @@ class TestConfiguration {
async init() {
// create a test user
- await this._req({
- email: "test@test.com",
- password: "test",
- _id: "us_uuid1",
- builder: {
- global: true,
- }
- }, null, controllers.users.save)
+ await this._req(
+ {
+ email: "test@test.com",
+ password: "test",
+ _id: "us_uuid1",
+ builder: {
+ global: true,
+ },
+ },
+ null,
+ controllers.users.save
+ )
}
defaultHeaders() {
@@ -57,66 +61,84 @@ class TestConfiguration {
const authToken = jwt.sign(user, env.JWT_SECRET)
return {
Accept: "application/json",
- Cookie: [
- `${Cookies.Auth}=${authToken}`,
- ],
+ Cookie: [`${Cookies.Auth}=${authToken}`],
}
}
async deleteConfig(type) {
try {
- const cfg = await this._req(null,{
- type,
- }, controllers.config.find)
+ const cfg = await this._req(
+ null,
+ {
+ type,
+ },
+ controllers.config.find
+ )
if (cfg) {
- await this._req(null, {
- id: cfg._id,
- rev: cfg._rev,
- }, controllers.config.destroy)
+ await this._req(
+ null,
+ {
+ id: cfg._id,
+ rev: cfg._rev,
+ },
+ controllers.config.destroy
+ )
}
} catch (err) {}
}
async saveSettingsConfig() {
await this.deleteConfig(Configs.SETTINGS)
- await this._req({
- type: Configs.SETTINGS,
- config: {
- platformUrl: "http://localhost:10000",
- logoUrl: LOGO_URL,
- company: "Budibase",
- }
- }, null, controllers.config.save)
+ await this._req(
+ {
+ type: Configs.SETTINGS,
+ config: {
+ platformUrl: "http://localhost:10000",
+ logoUrl: LOGO_URL,
+ company: "Budibase",
+ },
+ },
+ null,
+ controllers.config.save
+ )
}
async saveSmtpConfig() {
await this.deleteConfig(Configs.SMTP)
- await this._req({
- type: Configs.SMTP,
- config: {
- port: 12345,
- host: "smtptesthost.com",
- from: "testfrom@test.com",
- subject: "Hello!",
- }
- }, null, controllers.config.save)
+ await this._req(
+ {
+ type: Configs.SMTP,
+ config: {
+ port: 12345,
+ host: "smtptesthost.com",
+ from: "testfrom@test.com",
+ subject: "Hello!",
+ },
+ },
+ null,
+ controllers.config.save
+ )
}
async saveEtherealSmtpConfig() {
await this.deleteConfig(Configs.SMTP)
- await this._req({
- type: Configs.SMTP,
- config: {
- port: 587,
- host: "smtp.ethereal.email",
- secure: false,
- auth: {
- user: "don.bahringer@ethereal.email",
- pass: "yCKSH8rWyUPbnhGYk9",
+ await this._req(
+ {
+ type: Configs.SMTP,
+ config: {
+ port: 587,
+ host: "smtp.ethereal.email",
+ secure: false,
+ auth: {
+ user: "don.bahringer@ethereal.email",
+ pass: "yCKSH8rWyUPbnhGYk9",
+ },
},
- }
- }, null, controllers.config.save)
+ },
+ null,
+ controllers.config.save
+ )
}
}
-module.exports = TestConfiguration
\ No newline at end of file
+module.exports = TestConfiguration
diff --git a/packages/worker/src/constants/templates/index.js b/packages/worker/src/constants/templates/index.js
index 7ddb85af4..23e550834 100644
--- a/packages/worker/src/constants/templates/index.js
+++ b/packages/worker/src/constants/templates/index.js
@@ -17,10 +17,10 @@ exports.EmailTemplates = {
join(__dirname, "invitation.hbs")
),
[EmailTemplatePurpose.BASE]: readStaticFile(join(__dirname, "base.hbs")),
- [EmailTemplatePurpose.STYLES]: readStaticFile(
- join(__dirname, "style.hbs")
+ [EmailTemplatePurpose.STYLES]: readStaticFile(join(__dirname, "style.hbs")),
+ [EmailTemplatePurpose.WELCOME]: readStaticFile(
+ join(__dirname, "welcome.hbs")
),
- [EmailTemplatePurpose.WELCOME]: readStaticFile(join(__dirname, "welcome.hbs")),
}
exports.addBaseTemplates = (templates, type = null) => {
diff --git a/packages/worker/src/utilities/templates.js b/packages/worker/src/utilities/templates.js
index 56c4340a7..8bb2ba9e9 100644
--- a/packages/worker/src/utilities/templates.js
+++ b/packages/worker/src/utilities/templates.js
@@ -28,7 +28,8 @@ exports.getSettingsTemplateContext = async () => {
),
[TemplateBindings.RESET_URL]: checkSlashesInUrl(`${URL}/reset`),
[TemplateBindings.COMPANY]: settings.company || BASE_COMPANY,
- [TemplateBindings.DOCS_URL]: settings.docsUrl || "https://docs.budibase.com/",
+ [TemplateBindings.DOCS_URL]:
+ settings.docsUrl || "https://docs.budibase.com/",
[TemplateBindings.LOGIN_URL]: checkSlashesInUrl(`${URL}/login`),
}
}
From 02031ce8c93694c7a41142380c7f19bc8d6411dc Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Mon, 26 Apr 2021 14:24:07 +0100
Subject: [PATCH 132/135] Formatting, linting and handling year copyright
properly.
---
.../src/api/routes/tests/utilities/TestConfiguration.js | 4 +++-
packages/worker/src/constants/index.js | 2 ++
packages/worker/src/constants/templates/base.hbs | 2 +-
packages/worker/src/utilities/templates.js | 2 ++
4 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js b/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
index 06a0d8e54..0f97b50c8 100644
--- a/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
+++ b/packages/worker/src/api/routes/tests/utilities/TestConfiguration.js
@@ -84,7 +84,9 @@ class TestConfiguration {
controllers.config.destroy
)
}
- } catch (err) {}
+ } catch (err) {
+ // don't need to handle error
+ }
}
async saveSettingsConfig() {
diff --git a/packages/worker/src/constants/index.js b/packages/worker/src/constants/index.js
index 141a742ce..f5702d3e9 100644
--- a/packages/worker/src/constants/index.js
+++ b/packages/worker/src/constants/index.js
@@ -43,6 +43,8 @@ const TemplateBindings = {
REQUEST: "request",
DOCS_URL: "docsUrl",
LOGIN_URL: "loginUrl",
+ CURRENT_YEAR: "currentYear",
+ CURRENT_DATE: "currentDate",
}
const TemplateMetadata = {
diff --git a/packages/worker/src/constants/templates/base.hbs b/packages/worker/src/constants/templates/base.hbs
index f80460502..ba0571db0 100644
--- a/packages/worker/src/constants/templates/base.hbs
+++ b/packages/worker/src/constants/templates/base.hbs
@@ -24,7 +24,7 @@
diff --git a/packages/worker/src/utilities/templates.js b/packages/worker/src/utilities/templates.js
index 8bb2ba9e9..3035dc2bb 100644
--- a/packages/worker/src/utilities/templates.js
+++ b/packages/worker/src/utilities/templates.js
@@ -31,5 +31,7 @@ exports.getSettingsTemplateContext = async () => {
[TemplateBindings.DOCS_URL]:
settings.docsUrl || "https://docs.budibase.com/",
[TemplateBindings.LOGIN_URL]: checkSlashesInUrl(`${URL}/login`),
+ [TemplateBindings.CURRENT_DATE]: new Date().toISOString(),
+ [TemplateBindings.CURRENT_YEAR]: new Date().getFullYear(),
}
}
From 02dafebe383df729862ca52eb7ec868364c8e695 Mon Sep 17 00:00:00 2001
From: mike12345567
Date: Mon, 26 Apr 2021 14:39:18 +0100
Subject: [PATCH 133/135] Moving header/footer and presentational tables to the
base hbs email template.
---
.../worker/src/constants/templates/base.hbs | 25 +++-
.../src/constants/templates/invitation.hbs | 107 ++++++++----------
.../constants/templates/passwordRecovery.hbs | 97 +++++++---------
.../src/constants/templates/welcome.hbs | 91 ++++++---------
4 files changed, 143 insertions(+), 177 deletions(-)
diff --git a/packages/worker/src/constants/templates/base.hbs b/packages/worker/src/constants/templates/base.hbs
index ba0571db0..38ceff023 100644
--- a/packages/worker/src/constants/templates/base.hbs
+++ b/packages/worker/src/constants/templates/base.hbs
@@ -20,11 +20,28 @@
-{{ body }}
-