diff --git a/.gitignore b/.gitignore
index 3a5fc5dc7b..086813c97e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,6 +3,7 @@ builder/*
.temp/
packages/server/runtime_apps/
.idea/
+bb-airgapped.tar.gz
# Logs
logs
diff --git a/hosting/scripts/airgapped/airgappedDockerBuild.js b/hosting/scripts/airgapped/airgappedDockerBuild.js
new file mode 100755
index 0000000000..5be19fdeb8
--- /dev/null
+++ b/hosting/scripts/airgapped/airgappedDockerBuild.js
@@ -0,0 +1,51 @@
+const fs = require("fs")
+const { execSync } = require("child_process")
+const path = require("path")
+
+const IMAGES = {
+ worker: "budibase/worker",
+ apps: "budibase/apps",
+ proxy: "envoyproxy/envoy:v1.16-latest",
+ minio: "minio/minio",
+ couch: "ibmcom/couchdb3",
+ curl: "curlimages/curl",
+ redis: "redis",
+ watchtower: "containrrr/watchtower"
+}
+
+const FILES = {
+ COMPOSE: "docker-compose.yaml",
+ ENVOY: "envoy.yaml",
+ PROPERTIES: "hosting.properties"
+}
+
+const OUTPUT_DIR = path.join(__dirname, "../", "bb-airgapped")
+
+function copyFile(file) {
+ fs.copyFileSync(
+ path.join(__dirname, "../", "../", file),
+ path.join(OUTPUT_DIR, file)
+ )
+}
+
+// create output dir
+console.log(`Creating ${OUTPUT_DIR} for build..`)
+fs.rmdirSync(OUTPUT_DIR, { recursive: true })
+fs.mkdirSync(OUTPUT_DIR)
+
+// package images into tar files
+for (let image in IMAGES) {
+ console.log(`Creating tar for ${image}..`)
+ execSync(`docker save ${IMAGES[image]} -o ${OUTPUT_DIR}/${image}.tar`)
+}
+
+// copy config files
+copyFile(FILES.COMPOSE)
+copyFile(FILES.ENVOY)
+copyFile(FILES.PROPERTIES)
+
+// compress
+execSync(`tar -czf bb-airgapped.tar.gz hosting/scripts/bb-airgapped`)
+
+// clean up
+fs.rmdirSync(OUTPUT_DIR, { recursive: true })
\ No newline at end of file
diff --git a/lerna.json b/lerna.json
index aebd39acab..18f9328afd 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
- "version": "0.9.173-alpha.3",
+ "version": "0.9.176-alpha.3",
"npmClient": "yarn",
"packages": [
"packages/*"
diff --git a/package.json b/package.json
index eb7b7167f1..f0326782d1 100644
--- a/package.json
+++ b/package.json
@@ -46,6 +46,7 @@
"build:docker": "lerna run build:docker && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh $BUDIBASE_RELEASE_VERSION && cd -",
"build:docker:production": "lerna run build:docker && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh $BUDIBASE_RELEASE_VERSION release && cd -",
"build:docker:develop": "node scripts/pinVersions && lerna run build:docker && cd hosting/scripts/linux/ && ./release-to-docker-hub.sh develop && cd -",
+ "build:docker:airgap": "node hosting/scripts/airgapped/airgappedDockerBuild",
"release:helm": "./scripts/release_helm_chart.sh",
"env:multi:enable": "lerna run env:multi:enable",
"env:multi:disable": "lerna run env:multi:disable",
diff --git a/packages/auth/package.json b/packages/auth/package.json
index 5f6866e9ed..b5f27ca059 100644
--- a/packages/auth/package.json
+++ b/packages/auth/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/auth",
- "version": "0.9.173-alpha.3",
+ "version": "0.9.176-alpha.3",
"description": "Authentication middlewares for budibase builder and apps",
"main": "src/index.js",
"author": "Budibase",
diff --git a/packages/auth/src/middleware/passport/local.js b/packages/auth/src/middleware/passport/local.js
index 0db40d64eb..f95c3a173e 100644
--- a/packages/auth/src/middleware/passport/local.js
+++ b/packages/auth/src/middleware/passport/local.js
@@ -9,6 +9,8 @@ const { createASession } = require("../../security/sessions")
const { getTenantId } = require("../../tenancy")
const INVALID_ERR = "Invalid Credentials"
+const SSO_NO_PASSWORD = "SSO user does not have a password set"
+const EXPIRED = "This account has expired. Please reset your password"
exports.options = {
passReqToCallback: true,
@@ -36,6 +38,19 @@ exports.authenticate = async function (ctx, email, password, done) {
return authError(done, INVALID_ERR)
}
+ // check that the user has a stored password before proceeding
+ if (!dbUser.password) {
+ if (
+ (dbUser.account && dbUser.account.authType === "sso") || // root account sso
+ dbUser.thirdPartyProfile // internal sso
+ ) {
+ return authError(done, SSO_NO_PASSWORD)
+ }
+
+ console.error("Non SSO usser has no password set", dbUser)
+ return authError(done, EXPIRED)
+ }
+
// authenticate
if (await compare(password, dbUser.password)) {
const sessionId = newid()
diff --git a/packages/auth/src/utils.js b/packages/auth/src/utils.js
index e1df289d6e..f7ab5d6990 100644
--- a/packages/auth/src/utils.js
+++ b/packages/auth/src/utils.js
@@ -181,8 +181,8 @@ exports.saveUser = async (
// check budibase users in other tenants
if (env.MULTI_TENANCY) {
- dbUser = await getTenantUser(email)
- if (dbUser != null && dbUser.tenantId !== tenantId) {
+ const tenantUser = await getTenantUser(email)
+ if (tenantUser != null && tenantUser.tenantId !== tenantId) {
throw `Email address ${email} already in use.`
}
}
diff --git a/packages/bbui/package.json b/packages/bbui/package.json
index 80bacada00..0d1c5c15bc 100644
--- a/packages/bbui/package.json
+++ b/packages/bbui/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/bbui",
"description": "A UI solution used in the different Budibase projects.",
- "version": "0.9.173-alpha.3",
+ "version": "0.9.176-alpha.3",
"license": "AGPL-3.0",
"svelte": "src/index.js",
"module": "dist/bbui.es.js",
@@ -51,6 +51,7 @@
"@spectrum-css/fieldlabel": "^3.0.1",
"@spectrum-css/icon": "^3.0.1",
"@spectrum-css/illustratedmessage": "^3.0.2",
+ "@spectrum-css/inlinealert": "^2.0.1",
"@spectrum-css/inputgroup": "^3.0.2",
"@spectrum-css/label": "^2.0.10",
"@spectrum-css/link": "^3.1.1",
diff --git a/packages/bbui/src/InlineAlert/InlineAlert.svelte b/packages/bbui/src/InlineAlert/InlineAlert.svelte
new file mode 100644
index 0000000000..a7740a68a7
--- /dev/null
+++ b/packages/bbui/src/InlineAlert/InlineAlert.svelte
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
{message}
+ {#if onConfirm}
+
+ {/if}
+
+
+
diff --git a/packages/bbui/src/index.js b/packages/bbui/src/index.js
index 08ece6b93c..377d451604 100644
--- a/packages/bbui/src/index.js
+++ b/packages/bbui/src/index.js
@@ -58,6 +58,7 @@ export { default as Pagination } from "./Pagination/Pagination.svelte"
export { default as Badge } from "./Badge/Badge.svelte"
export { default as StatusLight } from "./StatusLight/StatusLight.svelte"
export { default as ColorPicker } from "./ColorPicker/ColorPicker.svelte"
+export { default as InlineAlert } from "./InlineAlert/InlineAlert.svelte"
// Typography
export { default as Body } from "./Typography/Body.svelte"
diff --git a/packages/bbui/yarn.lock b/packages/bbui/yarn.lock
index a492c83266..a102e6c148 100644
--- a/packages/bbui/yarn.lock
+++ b/packages/bbui/yarn.lock
@@ -136,6 +136,11 @@
resolved "https://registry.yarnpkg.com/@spectrum-css/illustratedmessage/-/illustratedmessage-3.0.2.tgz#6a480be98b027e050b086e7899e40d87adb0a8c0"
integrity sha512-dqnE8X27bGcO0HN8+dYx8O4o0dNNIAqeivOzDHhe2El+V4dTzMrNIerF6G0NLm3GjVf6XliwmitsZK+K6FmbtA==
+"@spectrum-css/inlinealert@^2.0.1":
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/@spectrum-css/inlinealert/-/inlinealert-2.0.1.tgz#7521f88f6c845806403cc7d925773c7414e204a2"
+ integrity sha512-Xy5RCOwgurqUXuGQCsEDUduDd5408bmEpmFg+feynG7VFUgLFZWBeylSENB/OqjlFtO76PHXNVdHkhDscPIHTA==
+
"@spectrum-css/inputgroup@^3.0.2":
version "3.0.2"
resolved "https://registry.yarnpkg.com/@spectrum-css/inputgroup/-/inputgroup-3.0.2.tgz#f1b13603832cbd22394f3d898af13203961f8691"
diff --git a/packages/builder/package.json b/packages/builder/package.json
index d262839f12..56811c6d11 100644
--- a/packages/builder/package.json
+++ b/packages/builder/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/builder",
- "version": "0.9.173-alpha.3",
+ "version": "0.9.176-alpha.3",
"license": "AGPL-3.0",
"private": true,
"scripts": {
@@ -65,10 +65,10 @@
}
},
"dependencies": {
- "@budibase/bbui": "^0.9.173-alpha.3",
- "@budibase/client": "^0.9.173-alpha.3",
+ "@budibase/bbui": "^0.9.176-alpha.3",
+ "@budibase/client": "^0.9.176-alpha.3",
"@budibase/colorpicker": "1.1.2",
- "@budibase/string-templates": "^0.9.173-alpha.3",
+ "@budibase/string-templates": "^0.9.176-alpha.3",
"@sentry/browser": "5.19.1",
"@spectrum-css/page": "^3.0.1",
"@spectrum-css/vars": "^3.0.1",
diff --git a/packages/builder/src/components/backend/DataTable/DataTable.svelte b/packages/builder/src/components/backend/DataTable/DataTable.svelte
index 336bb51670..6bebf2ca02 100644
--- a/packages/builder/src/components/backend/DataTable/DataTable.svelte
+++ b/packages/builder/src/components/backend/DataTable/DataTable.svelte
@@ -4,6 +4,7 @@
import CreateRowButton from "./buttons/CreateRowButton.svelte"
import CreateColumnButton from "./buttons/CreateColumnButton.svelte"
import CreateViewButton from "./buttons/CreateViewButton.svelte"
+ import ExistingRelationshipButton from "./buttons/ExistingRelationshipButton.svelte"
import ExportButton from "./buttons/ExportButton.svelte"
import EditRolesButton from "./buttons/EditRolesButton.svelte"
import ManageAccessButton from "./buttons/ManageAccessButton.svelte"
@@ -98,9 +99,7 @@
on:updatecolumns={onUpdateColumns}
on:updaterows={onUpdateRows}
>
- {#if isInternal}
-
- {/if}
+
{#if schema && Object.keys(schema).length > 0}
{#if !isUsersTable}
{/if}
+ {#if !isInternal}
+
+ {/if}
diff --git a/packages/builder/src/components/backend/DataTable/RowFieldControl.svelte b/packages/builder/src/components/backend/DataTable/RowFieldControl.svelte
index e82c55679a..25ad67b52e 100644
--- a/packages/builder/src/components/backend/DataTable/RowFieldControl.svelte
+++ b/packages/builder/src/components/backend/DataTable/RowFieldControl.svelte
@@ -16,8 +16,8 @@
export let value = defaultValue || (meta.type === "boolean" ? false : "")
export let readonly
- $: type = meta.type
- $: label = capitalise(meta.name)
+ $: type = meta?.type
+ $: label = meta.name ? capitalise(meta.name) : ""
{#if type === "options"}
diff --git a/packages/builder/src/components/backend/DataTable/Table.svelte b/packages/builder/src/components/backend/DataTable/Table.svelte
index 78c3cc37f8..512324254c 100644
--- a/packages/builder/src/components/backend/DataTable/Table.svelte
+++ b/packages/builder/src/components/backend/DataTable/Table.svelte
@@ -129,7 +129,7 @@
bind:selectedRows
allowSelectRows={allowEditing && !isUsersTable}
allowEditRows={allowEditing}
- allowEditColumns={allowEditing && isInternal}
+ allowEditColumns={allowEditing}
showAutoColumns={!hideAutocolumns}
on:editcolumn={e => editColumn(e.detail)}
on:editrow={e => editRow(e.detail)}
diff --git a/packages/builder/src/components/backend/DataTable/buttons/ExistingRelationshipButton.svelte b/packages/builder/src/components/backend/DataTable/buttons/ExistingRelationshipButton.svelte
new file mode 100644
index 0000000000..4a7abf487f
--- /dev/null
+++ b/packages/builder/src/components/backend/DataTable/buttons/ExistingRelationshipButton.svelte
@@ -0,0 +1,54 @@
+
+
+{#if table.sourceId}
+
+
+ Define existing relationship
+
+
+
+
+
+{/if}
diff --git a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte
index cd437bcad2..ebfea9cee6 100644
--- a/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte
+++ b/packages/builder/src/components/backend/DataTable/modals/CreateEditColumn.svelte
@@ -31,6 +31,9 @@
const AUTO_TYPE = "auto"
const FORMULA_TYPE = FIELDS.FORMULA.type
const LINK_TYPE = FIELDS.LINK.type
+ const STRING_TYPE = FIELDS.STRING.type
+ const NUMBER_TYPE = FIELDS.NUMBER.type
+
const dispatch = createEventDispatcher()
const PROHIBITED_COLUMN_NAMES = ["type", "_id", "_rev", "tableId"]
const { hide } = getContext(Context.Modal)
@@ -55,8 +58,9 @@
let confirmDeleteDialog
let deletion
+ $: checkConstraints(field)
$: tableOptions = $tables.list.filter(
- table => table._id !== $tables.draft._id && table.type !== "external"
+ opt => opt._id !== $tables.draft._id && opt.type === table.type
)
$: required = !!field?.constraints?.presence || primaryDisplay
$: uneditable =
@@ -83,6 +87,7 @@
$: canBeRequired =
field.type !== LINK_TYPE && !uneditable && field.type !== AUTO_TYPE
$: relationshipOptions = getRelationshipOptions(field)
+ $: external = table.type === "external"
async function saveColumn() {
if (field.type === AUTO_TYPE) {
@@ -193,6 +198,45 @@
},
]
}
+
+ function getAllowedTypes() {
+ if (!external) {
+ return [
+ ...Object.values(fieldDefinitions),
+ { name: "Auto Column", type: AUTO_TYPE },
+ ]
+ } else {
+ return [
+ FIELDS.STRING,
+ FIELDS.LONGFORM,
+ FIELDS.OPTIONS,
+ FIELDS.DATETIME,
+ FIELDS.NUMBER,
+ FIELDS.BOOLEAN,
+ FIELDS.ARRAY,
+ FIELDS.FORMULA,
+ FIELDS.LINK,
+ ]
+ }
+ }
+
+ function checkConstraints(fieldToCheck) {
+ // most types need this, just make sure its always present
+ if (fieldToCheck && !fieldToCheck.constraints) {
+ fieldToCheck.constraints = {}
+ }
+ // some string types may have been built by server, may not always have constraints
+ if (fieldToCheck.type === STRING_TYPE && !fieldToCheck.constraints.length) {
+ fieldToCheck.constraints.length = {}
+ }
+ // some number types made server-side will be missing constraints
+ if (
+ fieldToCheck.type === NUMBER_TYPE &&
+ !fieldToCheck.constraints.numericality
+ ) {
+ fieldToCheck.constraints.numericality = {}
+ }
+ }
field.name}
getOptionValue={field => field.type}
/>
@@ -245,7 +286,7 @@
{/if}
- {#if canBeSearched}
+ {#if canBeSearched && !external}
Search Indexes
($touched.from = true)}
bind:error={errors.from}
bind:value={toRelationship.tableId}
diff --git a/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/CreateEditRelationship/TableSelect.svelte b/packages/builder/src/components/backend/Datasources/TableSelect.svelte
similarity index 100%
rename from packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/CreateEditRelationship/TableSelect.svelte
rename to packages/builder/src/components/backend/Datasources/TableSelect.svelte
diff --git a/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte b/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte
index 2513c6c7e5..04094b881a 100644
--- a/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte
+++ b/packages/builder/src/components/backend/TableNavigator/popovers/EditTablePopover.svelte
@@ -1,7 +1,7 @@
diff --git a/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/index.svelte b/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/index.svelte
index fc82e3a11c..b1867db248 100644
--- a/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/index.svelte
+++ b/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/index.svelte
@@ -1,16 +1,25 @@
@@ -117,8 +127,8 @@
/>
-
-
+
+
{#if datasource && integration}
@@ -154,15 +164,15 @@
@@ -171,6 +181,14 @@
your tables directly from the database and you can use them without
having to write any queries at all.
+ {#if schemaError}
+
+ {/if}
{#each plusTables as table}
onClickTable(table)}>
@@ -179,14 +197,23 @@
→
{/each}
+
+ Create new table
+
{#if plusTables?.length !== 0}
Tell budibase how your tables are related to get even more smart
@@ -301,11 +328,14 @@
.table-buttons {
display: grid;
- grid-gap: var(--spacing-l);
grid-template-columns: 1fr 1fr;
}
.table-buttons div {
grid-column-end: -1;
}
+
+ .add-table {
+ margin-top: var(--spacing-m);
+ }
diff --git a/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/modals/CreateExternalTableModal.svelte b/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/modals/CreateExternalTableModal.svelte
new file mode 100644
index 0000000000..1d9e246d20
--- /dev/null
+++ b/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/modals/CreateExternalTableModal.svelte
@@ -0,0 +1,45 @@
+
+
+
+ Provide a name for your new table; you can add columns once it is created.
+
+
diff --git a/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/modals/EditDisplayColumnsModal.svelte b/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/modals/EditDisplayColumnsModal.svelte
deleted file mode 100644
index ffb6b3c58e..0000000000
--- a/packages/builder/src/pages/builder/app/[application]/data/datasource/[selectedDatasource]/modals/EditDisplayColumnsModal.svelte
+++ /dev/null
@@ -1,43 +0,0 @@
-
-
-
- Select the columns that will be shown when displaying relationships.
- {#each plusTables as table}
-
- {/each}
-
diff --git a/packages/builder/src/pages/builder/auth/login.svelte b/packages/builder/src/pages/builder/auth/login.svelte
index 7374678236..5a5a27eb6e 100644
--- a/packages/builder/src/pages/builder/auth/login.svelte
+++ b/packages/builder/src/pages/builder/auth/login.svelte
@@ -44,7 +44,7 @@
}
} catch (err) {
console.error(err)
- notifications.error("Invalid credentials")
+ notifications.error(err.message ? err.message : "Invalid Credentials")
}
}
diff --git a/packages/builder/src/stores/backend/datasources.js b/packages/builder/src/stores/backend/datasources.js
index 7c74074e03..91719ae9b7 100644
--- a/packages/builder/src/stores/backend/datasources.js
+++ b/packages/builder/src/stores/backend/datasources.js
@@ -5,12 +5,35 @@ import api from "../../builderStore/api"
export const INITIAL_DATASOURCE_VALUES = {
list: [],
selected: null,
+ schemaError: null,
}
export function createDatasourcesStore() {
const store = writable(INITIAL_DATASOURCE_VALUES)
const { subscribe, update, set } = store
+ async function updateDatasource(response) {
+ if (response.status !== 200) {
+ throw new Error(await response.text())
+ }
+
+ const { datasource, error } = await response.json()
+ update(state => {
+ const currentIdx = state.list.findIndex(ds => ds._id === datasource._id)
+
+ const sources = state.list
+
+ if (currentIdx >= 0) {
+ sources.splice(currentIdx, 1, datasource)
+ } else {
+ sources.push(datasource)
+ }
+
+ return { list: sources, selected: datasource._id, schemaError: error }
+ })
+ return datasource
+ }
+
return {
subscribe,
update,
@@ -46,61 +69,20 @@ export function createDatasourcesStore() {
let url = `/api/datasources/${datasource._id}/schema`
const response = await api.post(url)
- const json = await response.json()
-
- if (response.status !== 200) {
- throw new Error(json.message)
- }
-
- update(state => {
- const currentIdx = state.list.findIndex(ds => ds._id === json._id)
-
- const sources = state.list
-
- if (currentIdx >= 0) {
- sources.splice(currentIdx, 1, json)
- } else {
- sources.push(json)
- }
-
- return { list: sources, selected: json._id }
- })
- return json
+ return updateDatasource(response)
},
- save: async (datasource, fetchSchema = false) => {
+ save: async (body, fetchSchema = false) => {
let response
- if (datasource._id) {
- response = await api.put(
- `/api/datasources/${datasource._id}`,
- datasource
- )
+ if (body._id) {
+ response = await api.put(`/api/datasources/${body._id}`, body)
} else {
response = await api.post("/api/datasources", {
- datasource: datasource,
+ datasource: body,
fetchSchema,
})
}
- const json = await response.json()
-
- if (response.status !== 200) {
- throw new Error(json.message)
- }
-
- update(state => {
- const currentIdx = state.list.findIndex(ds => ds._id === json._id)
-
- const sources = state.list
-
- if (currentIdx >= 0) {
- sources.splice(currentIdx, 1, json)
- } else {
- sources.push(json)
- }
-
- return { list: sources, selected: json._id }
- })
- return json
+ return updateDatasource(response)
},
delete: async datasource => {
const response = await api.delete(
@@ -115,6 +97,11 @@ export function createDatasourcesStore() {
return response
},
+ removeSchemaError: () => {
+ update(state => {
+ return { ...state, schemaError: null }
+ })
+ },
}
}
diff --git a/packages/builder/src/stores/backend/tables.js b/packages/builder/src/stores/backend/tables.js
index 161877f660..baa9e38ab9 100644
--- a/packages/builder/src/stores/backend/tables.js
+++ b/packages/builder/src/stores/backend/tables.js
@@ -11,6 +11,7 @@ export function createTablesStore() {
const tablesResponse = await api.get(`/api/tables`)
const tables = await tablesResponse.json()
update(state => ({ ...state, list: tables }))
+ return tables
}
async function select(table) {
@@ -62,6 +63,9 @@ export function createTablesStore() {
const response = await api.post(`/api/tables`, updatedTable)
const savedTable = await response.json()
await fetch()
+ if (table.type === "external") {
+ await datasources.fetch()
+ }
await select(savedTable)
return savedTable
}
diff --git a/packages/builder/src/stores/backend/tests/datasources.spec.js b/packages/builder/src/stores/backend/tests/datasources.spec.js
index fb175f03b9..46e9568b50 100644
--- a/packages/builder/src/stores/backend/tests/datasources.spec.js
+++ b/packages/builder/src/stores/backend/tests/datasources.spec.js
@@ -53,7 +53,7 @@ describe("Datasources Store", () => {
})
- expect(get(store).list).toEqual(expect.arrayContaining([SAVE_DATASOURCE]))
+ expect(get(store).list).toEqual(expect.arrayContaining([SAVE_DATASOURCE.datasource]))
})
it("deletes a datasource, updates the store and returns status message", async () => {
api.get.mockReturnValue({ json: () => SOME_DATASOURCE})
diff --git a/packages/builder/src/stores/backend/tests/fixtures/datasources.js b/packages/builder/src/stores/backend/tests/fixtures/datasources.js
index 550b662787..933fe157ad 100644
--- a/packages/builder/src/stores/backend/tests/fixtures/datasources.js
+++ b/packages/builder/src/stores/backend/tests/fixtures/datasources.js
@@ -13,13 +13,15 @@ export const SOME_DATASOURCE = [
]
export const SAVE_DATASOURCE = {
- type: "datasource",
- name: "CoolDB",
- source: "REST",
- config: {
- url: "localhost",
- defaultHeaders: {},
+ datasource: {
+ type: "datasource",
+ name: "CoolDB",
+ source: "REST",
+ config: {
+ url: "localhost",
+ defaultHeaders: {},
+ },
+ _id: "datasource_04b003a7b4a8428eadd3bb2f7eae0255",
+ _rev: "1-4e72002f1011e9392e655948469b7908",
},
- _id: "datasource_04b003a7b4a8428eadd3bb2f7eae0255",
- _rev: "1-4e72002f1011e9392e655948469b7908",
}
diff --git a/packages/builder/src/stores/portal/auth.js b/packages/builder/src/stores/portal/auth.js
index 333226e3ba..134232dd74 100644
--- a/packages/builder/src/stores/portal/auth.js
+++ b/packages/builder/src/stores/portal/auth.js
@@ -112,7 +112,7 @@ export function createAuthStore() {
if (response.status === 200) {
setUser(json.user)
} else {
- throw "Invalid credentials"
+ throw new Error(json.message ? json.message : "Invalid credentials")
}
return json
},
diff --git a/packages/builder/yarn.lock b/packages/builder/yarn.lock
index 0ecaf7bcb5..443d00680b 100644
--- a/packages/builder/yarn.lock
+++ b/packages/builder/yarn.lock
@@ -2,11 +2,6 @@
# yarn lockfile v1
-"@adobe/spectrum-css-workflow-icons@^1.2.1":
- version "1.2.1"
- resolved "https://registry.yarnpkg.com/@adobe/spectrum-css-workflow-icons/-/spectrum-css-workflow-icons-1.2.1.tgz#7e2cb3fcfb5c8b12d7275afafbb6ec44913551b4"
- integrity sha512-uVgekyBXnOVkxp+CUssjN/gefARtudZC8duEn1vm0lBQFwGRZFlDEzU1QC+aIRWCrD1Z8OgRpmBYlSZ7QS003w==
-
"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@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"
@@ -875,177 +870,11 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
-"@budibase/bbui@^0.9.139":
- version "0.9.169"
- resolved "https://registry.yarnpkg.com/@budibase/bbui/-/bbui-0.9.169.tgz#e8dac59b9792a7edf03c4301a9069760e2ebd2f4"
- integrity sha512-2hks6GEjcXbDUzC37WgJvgloiqTP5ZS7IuRjlHU9kStDr6dAnXuy8pO6JNJmKrTXt+rgtwhHHrVWzzcmNLIYxA==
- dependencies:
- "@adobe/spectrum-css-workflow-icons" "^1.2.1"
- "@spectrum-css/actionbutton" "^1.0.1"
- "@spectrum-css/actiongroup" "^1.0.1"
- "@spectrum-css/avatar" "^3.0.2"
- "@spectrum-css/button" "^3.0.1"
- "@spectrum-css/buttongroup" "^3.0.2"
- "@spectrum-css/checkbox" "^3.0.2"
- "@spectrum-css/dialog" "^3.0.1"
- "@spectrum-css/divider" "^1.0.3"
- "@spectrum-css/dropzone" "^3.0.2"
- "@spectrum-css/fieldgroup" "^3.0.2"
- "@spectrum-css/fieldlabel" "^3.0.1"
- "@spectrum-css/icon" "^3.0.1"
- "@spectrum-css/illustratedmessage" "^3.0.2"
- "@spectrum-css/inputgroup" "^3.0.2"
- "@spectrum-css/label" "^2.0.10"
- "@spectrum-css/link" "^3.1.1"
- "@spectrum-css/menu" "^3.0.1"
- "@spectrum-css/modal" "^3.0.1"
- "@spectrum-css/pagination" "^3.0.3"
- "@spectrum-css/picker" "^1.0.1"
- "@spectrum-css/popover" "^3.0.1"
- "@spectrum-css/progressbar" "^1.0.2"
- "@spectrum-css/progresscircle" "^1.0.2"
- "@spectrum-css/radio" "^3.0.2"
- "@spectrum-css/search" "^3.0.2"
- "@spectrum-css/sidenav" "^3.0.2"
- "@spectrum-css/statuslight" "^3.0.2"
- "@spectrum-css/stepper" "^3.0.3"
- "@spectrum-css/switch" "^1.0.2"
- "@spectrum-css/table" "^3.0.1"
- "@spectrum-css/tabs" "^3.0.1"
- "@spectrum-css/tags" "^3.0.2"
- "@spectrum-css/textfield" "^3.0.1"
- "@spectrum-css/toast" "^3.0.1"
- "@spectrum-css/tooltip" "^3.0.3"
- "@spectrum-css/treeview" "^3.0.2"
- "@spectrum-css/typography" "^3.0.1"
- "@spectrum-css/underlay" "^2.0.9"
- "@spectrum-css/vars" "^3.0.1"
- dayjs "^1.10.4"
- svelte-flatpickr "^3.2.3"
- svelte-portal "^1.0.0"
-
-"@budibase/bbui@^0.9.169-alpha.12", "@budibase/bbui@^0.9.171":
- version "0.9.171"
- resolved "https://registry.yarnpkg.com/@budibase/bbui/-/bbui-0.9.171.tgz#2785ce376a0da51a0695137a9013b59bb181b8c0"
- integrity sha512-l6ncDzU/UaM9x96htHoHZzgULd9ETZlLamezXFuo3KxASbNJKS91tC5Xl/kAeDRZNLApk9bMKzKVsahxillqWw==
- dependencies:
- "@adobe/spectrum-css-workflow-icons" "^1.2.1"
- "@spectrum-css/actionbutton" "^1.0.1"
- "@spectrum-css/actiongroup" "^1.0.1"
- "@spectrum-css/avatar" "^3.0.2"
- "@spectrum-css/button" "^3.0.1"
- "@spectrum-css/buttongroup" "^3.0.2"
- "@spectrum-css/checkbox" "^3.0.2"
- "@spectrum-css/dialog" "^3.0.1"
- "@spectrum-css/divider" "^1.0.3"
- "@spectrum-css/dropzone" "^3.0.2"
- "@spectrum-css/fieldgroup" "^3.0.2"
- "@spectrum-css/fieldlabel" "^3.0.1"
- "@spectrum-css/icon" "^3.0.1"
- "@spectrum-css/illustratedmessage" "^3.0.2"
- "@spectrum-css/inputgroup" "^3.0.2"
- "@spectrum-css/label" "^2.0.10"
- "@spectrum-css/link" "^3.1.1"
- "@spectrum-css/menu" "^3.0.1"
- "@spectrum-css/modal" "^3.0.1"
- "@spectrum-css/pagination" "^3.0.3"
- "@spectrum-css/picker" "^1.0.1"
- "@spectrum-css/popover" "^3.0.1"
- "@spectrum-css/progressbar" "^1.0.2"
- "@spectrum-css/progresscircle" "^1.0.2"
- "@spectrum-css/radio" "^3.0.2"
- "@spectrum-css/search" "^3.0.2"
- "@spectrum-css/sidenav" "^3.0.2"
- "@spectrum-css/statuslight" "^3.0.2"
- "@spectrum-css/stepper" "^3.0.3"
- "@spectrum-css/switch" "^1.0.2"
- "@spectrum-css/table" "^3.0.1"
- "@spectrum-css/tabs" "^3.0.1"
- "@spectrum-css/tags" "^3.0.2"
- "@spectrum-css/textfield" "^3.0.1"
- "@spectrum-css/toast" "^3.0.1"
- "@spectrum-css/tooltip" "^3.0.3"
- "@spectrum-css/treeview" "^3.0.2"
- "@spectrum-css/typography" "^3.0.1"
- "@spectrum-css/underlay" "^2.0.9"
- "@spectrum-css/vars" "^3.0.1"
- dayjs "^1.10.4"
- svelte-flatpickr "^3.2.3"
- svelte-portal "^1.0.0"
-
-"@budibase/client@^0.9.169-alpha.12":
- version "0.9.171"
- resolved "https://registry.yarnpkg.com/@budibase/client/-/client-0.9.171.tgz#21c4f2106bd127aa7638564cd96b6bcb5fef5632"
- integrity sha512-IqOgfP/sH0rbXHz4mGVrFghtmpKcudysVwbki4koQYjpBZWeqVUtPDrYowYAqLpOiyOLYMBTCN6jt3xHu0VaUg==
- dependencies:
- "@budibase/bbui" "^0.9.171"
- "@budibase/standard-components" "^0.9.139"
- "@budibase/string-templates" "^0.9.171"
- regexparam "^1.3.0"
- shortid "^2.2.15"
- svelte-spa-router "^3.0.5"
-
"@budibase/colorpicker@1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@budibase/colorpicker/-/colorpicker-1.1.2.tgz#f7436924ee746d7be9b2009c2fa193e710c30f89"
integrity sha512-2PlZBVkATDqDC4b4Ri8Xi8X3OxhuHOGfmZwtXbZL38lNIeofaQT3Qyc1ECzEY5N+HrdGrWhY9EnliF6QM+LIuA==
-"@budibase/handlebars-helpers@^0.11.7":
- version "0.11.7"
- resolved "https://registry.yarnpkg.com/@budibase/handlebars-helpers/-/handlebars-helpers-0.11.7.tgz#8e5f9843d7dd10503e9f608555a96ccf4d836c46"
- integrity sha512-PvGHAv22cWSFExs1kc0WglwsmCEUEOqWvSp6JCFZwtc3qAAr5yMfLK8WGVQ63ALvyzWZiyxF+yrlzeeaohCMJw==
- dependencies:
- array-sort "^1.0.0"
- define-property "^2.0.2"
- extend-shallow "^3.0.2"
- for-in "^1.0.2"
- get-object "^0.2.0"
- get-value "^3.0.1"
- handlebars "^4.7.7"
- handlebars-utils "^1.0.6"
- has-value "^2.0.2"
- 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.1"
- kind-of "^6.0.3"
- micromatch "^3.1.5"
- relative "^3.0.2"
- striptags "^3.1.1"
- to-gfm-code-block "^0.1.1"
- year "^0.2.1"
-
-"@budibase/standard-components@^0.9.139":
- version "0.9.139"
- resolved "https://registry.yarnpkg.com/@budibase/standard-components/-/standard-components-0.9.139.tgz#cf8e2b759ae863e469e50272b3ca87f2827e66e3"
- integrity sha512-Av0u9Eq2jerjhG6Atta+c0mOQGgE5K0QI3cm+8s/3Vki6/PXkO1YL5Alo3BOn9ayQAVZ/xp4rtZPuN/rzRibHw==
- dependencies:
- "@budibase/bbui" "^0.9.139"
- "@spectrum-css/button" "^3.0.3"
- "@spectrum-css/card" "^3.0.3"
- "@spectrum-css/divider" "^1.0.3"
- "@spectrum-css/link" "^3.1.3"
- "@spectrum-css/page" "^3.0.1"
- "@spectrum-css/typography" "^3.0.2"
- "@spectrum-css/vars" "^3.0.1"
- apexcharts "^3.22.1"
- dayjs "^1.10.5"
- svelte-apexcharts "^1.0.2"
- svelte-flatpickr "^3.1.0"
-
-"@budibase/string-templates@^0.9.169-alpha.12", "@budibase/string-templates@^0.9.171":
- version "0.9.171"
- resolved "https://registry.yarnpkg.com/@budibase/string-templates/-/string-templates-0.9.171.tgz#69ca6586c3692ad63aa1dc63bcfe13f2eaee3b16"
- integrity sha512-yMuAMHjiRDSCJy2d/gHw2kToOmLFpG38PpV98XaaYX3ohEtApy/u5FDSFh70i5tPBtFRqI9GqbNaehm1mZIH7Q==
- dependencies:
- "@budibase/handlebars-helpers" "^0.11.7"
- dayjs "^1.10.4"
- handlebars "^4.7.6"
- 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"
@@ -1377,56 +1206,56 @@
dependencies:
any-observable "^0.3.0"
-"@sentry/browser@6.0.0":
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.0.0.tgz#599ba0b64b0fb4045135a7b544dd6876df12e785"
- integrity sha512-R4+MHb5FyVZCz3EVnaquvT1mwOM2MWP4gBqjYEADY5m0XWoHiJf0skFkWt8iEKJanzGbhl4PMb9gHuJj6YfVLw==
+"@sentry/browser@5.19.1":
+ version "5.19.1"
+ resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-5.19.1.tgz#b22f36fc71f36719ad352a54e6b31722622128c0"
+ integrity sha512-Aon5Nc2n8sIXKg6Xbr4RM3/Xs7vFpXksL56z3yIuGrmpCM8ToQ25/tQv8h+anYi72x5bn1npzaXB/NwU1Qwfhg==
dependencies:
- "@sentry/core" "6.0.0"
- "@sentry/types" "6.0.0"
- "@sentry/utils" "6.0.0"
+ "@sentry/core" "5.19.1"
+ "@sentry/types" "5.19.1"
+ "@sentry/utils" "5.19.1"
tslib "^1.9.3"
-"@sentry/core@6.0.0":
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.0.0.tgz#831c1737cad10c48a299e6ded4a3b4539657a25b"
- integrity sha512-afAiOachs/WfGWc9LsJBFnJMhqQVENyzfSMnf7sLRvxPAw8n7IrXY0R09MKmG0SlAnTKN2pWoQFzFF+J3NuHBA==
+"@sentry/core@5.19.1":
+ version "5.19.1"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.19.1.tgz#f5ff7feb1118035f75f1d0bc2a76e2b040d2aa8e"
+ integrity sha512-BGGxjeT95Og/hloBhQXAVcndVXPmIU6drtF3oKRT12cBpiG965xEDEUwiJVvyb5MAvojdVEZBK2LURUFY/d7Zw==
dependencies:
- "@sentry/hub" "6.0.0"
- "@sentry/minimal" "6.0.0"
- "@sentry/types" "6.0.0"
- "@sentry/utils" "6.0.0"
+ "@sentry/hub" "5.19.1"
+ "@sentry/minimal" "5.19.1"
+ "@sentry/types" "5.19.1"
+ "@sentry/utils" "5.19.1"
tslib "^1.9.3"
-"@sentry/hub@6.0.0":
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.0.0.tgz#c0d8cf1d1f19384d1d3f23fe8c00bc6b7134b002"
- integrity sha512-s8IsW6LvEH7ACnniQcxxb/9uEyjmoQ/TAoryTJN2qyPzzrHTw8NCyMuJvK+8ivUvRViz5AvtuOFf8AJlh9lzeA==
+"@sentry/hub@5.19.1":
+ version "5.19.1"
+ resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.19.1.tgz#f3bc8500680974ce43c1eedcd8e90696cc18b306"
+ integrity sha512-XjfbNGWVeDsP38alm5Cm08YPIw5Hu6HbPkw7a3y1piViTrg4HdtsE+ZJqq0YcURo2RTpg6Ks6coCS/zJxIPygQ==
dependencies:
- "@sentry/types" "6.0.0"
- "@sentry/utils" "6.0.0"
+ "@sentry/types" "5.19.1"
+ "@sentry/utils" "5.19.1"
tslib "^1.9.3"
-"@sentry/minimal@6.0.0":
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.0.0.tgz#f38e1325937770c7d038fdde11737e70804eb444"
- integrity sha512-daYdEzTr+ERMwViu6RpWHOfk0oZrSNqdx+7bejTqmFHqO4pt+9ZrMiw3vinL+MWQcKXwD95uXBz6O/ryrVdPtg==
+"@sentry/minimal@5.19.1":
+ version "5.19.1"
+ resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.19.1.tgz#04043d93a7dc90cbed1a31d80f6bf59688ea3100"
+ integrity sha512-pgNfsaCroEsC8gv+NqmPTIkj4wyK6ZgYLV12IT4k2oJLkGyg45TSAKabyB7oEP5jsj8sRzm8tDomu8M4HpaCHg==
dependencies:
- "@sentry/hub" "6.0.0"
- "@sentry/types" "6.0.0"
+ "@sentry/hub" "5.19.1"
+ "@sentry/types" "5.19.1"
tslib "^1.9.3"
-"@sentry/types@6.0.0":
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.0.0.tgz#250ae7287875bf729eddfe30346611bb11034f47"
- integrity sha512-yueRSRGPCahuju/UMdtOt8LIIncbpwLINQd9Q8E4OXtoPpMHR6Oun8sMKCPd+Wq3piI5yRDzKkGCl+sH7mHVrA==
+"@sentry/types@5.19.1":
+ version "5.19.1"
+ resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.19.1.tgz#8762f668d3fc2416fbde31d15d13009544caeb54"
+ integrity sha512-M5MhTLnjqYFwxMwcFPBpBgYQqI9hCvtVuj/A+NvcBHpe7VWOXdn/Sys+zD6C76DWGFYQdw3OWCsZimP24dL8mA==
-"@sentry/utils@6.0.0":
- version "6.0.0"
- resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.0.0.tgz#87a8e7c29c3b05483d31654c106df6b7ed95d10a"
- integrity sha512-dMMWOT69bQ4CF1R33dOnXIOyiHRWsUAON3nFVljV1JNNTDA69YwaF9f5FIT0DKpO4qhgTlElsm8WgHI9prAVEQ==
+"@sentry/utils@5.19.1":
+ version "5.19.1"
+ resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.19.1.tgz#e1134db40e4bb9732251e515721cec7ee94d4d9c"
+ integrity sha512-neUiNBnZSHjWTZWy2QV02EHTx1C2L3DBPzRXlh0ca5xrI7LMBLmhkHlhebn1E5ky3PW1teqZTgmh0jZoL99TEA==
dependencies:
- "@sentry/types" "6.0.0"
+ "@sentry/types" "5.19.1"
tslib "^1.9.3"
"@sideway/address@^4.1.0":
@@ -1460,103 +1289,6 @@
dependencies:
"@sinonjs/commons" "^1.7.0"
-"@spectrum-css/actionbutton@^1.0.1":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/actionbutton/-/actionbutton-1.0.4.tgz#7140dcfc35365a9887ac3885e041f319fb780d8b"
- integrity sha512-BRFd+99C2KKrRI8FOhzF4PZoiDaP2CXhsI+Ay/sk9OGubMqdTwkxyz6rSa9WI1bM1NcVEjB9b1V6MgN3L64KSg==
-
-"@spectrum-css/actiongroup@^1.0.1":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/actiongroup/-/actiongroup-1.0.4.tgz#7cfc5d1efe6e3fa411bc9b4fb06397573ff103c1"
- integrity sha512-C7u9A+G1TSX6RJZtmbppmI5yxJSQqvftSakrJEQKUUCLLZMz765PnO9cPsSs1fM4ICxm3DhLkTDfclEUsWTqjQ==
-
-"@spectrum-css/avatar@^3.0.2":
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/@spectrum-css/avatar/-/avatar-3.0.2.tgz#4f1826223eae330e64b6d3cc899e9bc2e98dac95"
- integrity sha512-wEczvSqxttTWSiL3cOvXV/RmGRwSkw2w6+slcHhnf0kb7ovymMM+9oz8vvEpEsSeo5u598bc+7ktrKFpAd6soQ==
-
-"@spectrum-css/button@^3.0.1", "@spectrum-css/button@^3.0.3":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/button/-/button-3.0.3.tgz#2df1efaab6c7e0b3b06cb4b59e1eae59c7f1fc84"
- integrity sha512-6CnLPqqtaU/PcSSIGeGRi0iFIIxIUByYLKFO6zn5NEUc12KQ28dJ4PLwB6WBa0L8vRoAGlnWWH2ZZweTijbXgg==
-
-"@spectrum-css/buttongroup@^3.0.2":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/buttongroup/-/buttongroup-3.0.4.tgz#bce3611135ec257386fdea6da06b8b825031ef4c"
- integrity sha512-II5irZHspzKfZPT/yClpYrDqLTRyggWQtrKmWk4ZSZAX3s1/z2iHjSEvEhnQmIF7Gh1p3yolEBDAeYN/rKAwfA==
-
-"@spectrum-css/card@^3.0.3":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/card/-/card-3.0.3.tgz#56b2e2da6b80c1583228baa279de7407383bfb6b"
- integrity sha512-+oKLUI2a0QmQP9EzySeq/G4FpUkkdaDNbuEbqCj2IkPMc/2v/nwzsPhh1fj2UIghGAiiUwXfPpzax1e8fyhQUg==
-
-"@spectrum-css/checkbox@^3.0.2":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/checkbox/-/checkbox-3.0.4.tgz#9611b426fde12c9d8a22f2dd4debf71abd424f65"
- integrity sha512-504pqynFTCzxwwSJAXOppPIcOzX3Oc6lG/3kRP1gBizqre6+Z1vJYWnbIHdNdw/NlmdssTfzCprn6SjdRESQiw==
-
-"@spectrum-css/dialog@^3.0.1":
- version "3.0.5"
- resolved "https://registry.yarnpkg.com/@spectrum-css/dialog/-/dialog-3.0.5.tgz#1733b45ae8f43b9395b9038001e6ae1607d625cd"
- integrity sha512-zBtmAdrKtnUC4ZW9VybhTLA014/fCRF6COc4LwJMBA9AC0aN7Bqs/e1NXizaUzbxLEkPgHiGe8KjBhx10OZSBw==
-
-"@spectrum-css/divider@^1.0.3":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/divider/-/divider-1.0.4.tgz#c52a4bfcb5faced50b1e3448852d6aa24eabb86c"
- integrity sha512-kXH8WICwfipIwr/xwP6OEg2croGac8ls35KNzCfm/+XfaYBJtCXAMOObv0SidJ95M8ZrVQn3k6K0TH9luDCX9Q==
- dependencies:
- "@spectrum-css/vars" "^4.0.0"
-
-"@spectrum-css/dropzone@^3.0.2":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/dropzone/-/dropzone-3.0.4.tgz#b7ea0e0e53ff1321270b9affa7402049b6a4599b"
- integrity sha512-joOaw5S75bn2feu/vcnZNYtTk2Cws6/k11XsQlsUiaxOY+EmLF3xe8zgQcThl64eff2I2US7i00cDZ5gHW+tJA==
-
-"@spectrum-css/fieldgroup@^3.0.2":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/fieldgroup/-/fieldgroup-3.0.4.tgz#ce3b18ff4ba0739c7dba0a579d004305c91479f0"
- integrity sha512-0azR3Ziy04wwcee3bo1iytD7nNtkapcbGW70X32e89KHtmNR2HYkXqQlI/toX0dNqg8YsI+Zc8HowOutN4ENtQ==
-
-"@spectrum-css/fieldlabel@^3.0.1":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/fieldlabel/-/fieldlabel-3.0.3.tgz#f73c04d20734d4718ffb620dc46458904685b449"
- integrity sha512-nEvIkEXCD5n4fW67Unq6Iu7VXoauEd/JGpfTY02VsC5p4FJLnwKfPDbJUuUsqClAxqw7nAsmXVKtn4zQFf5yPQ==
-
-"@spectrum-css/icon@^3.0.1":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/icon/-/icon-3.0.4.tgz#9837ebf3c7ed2dedbd48fe4d3e42e56eca1e346f"
- integrity sha512-ZNxAwzY3uVEZ1/a+aTPuL7XxZ+/78rbzB56H4+loJFZdkRG3i72Yn/AQGtukCth7AvdXjEkzc/gvHLnMiIvaxA==
-
-"@spectrum-css/illustratedmessage@^3.0.2":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/illustratedmessage/-/illustratedmessage-3.0.3.tgz#760a0eff771df66e200ceabd6475bada02ce6524"
- integrity sha512-Zp85dqwvyVT5XFH68XZylRLXEddkhk7XWuck4xA/Klc8OlbqEoc1wTAcIRr3MewankI3pS/uV8FItag7elNAWw==
-
-"@spectrum-css/inputgroup@^3.0.2":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/inputgroup/-/inputgroup-3.0.4.tgz#d13fa73500fcd6a0b76f04f22d1d33781f7e8b2a"
- integrity sha512-BhhA3h2U758KF7XBFuCyGn1fRruiQx4WRWIMFwJY4xdp2BpV2IXLn4sB2QbbTtM5dvX0jxEynqv/61koC/6hWQ==
-
-"@spectrum-css/label@^2.0.10":
- version "2.0.10"
- resolved "https://registry.yarnpkg.com/@spectrum-css/label/-/label-2.0.10.tgz#2368651d7636a19385b5d300cdf6272db1916001"
- integrity sha512-xCbtEiQkZIlLdWFikuw7ifDCC21DOC/KMgVrrVJHXFc4KRQe9LTZSqmGF3tovm+CSq1adE59mYoTbojVQ9YuEQ==
-
-"@spectrum-css/link@^3.1.1", "@spectrum-css/link@^3.1.3":
- version "3.1.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/link/-/link-3.1.4.tgz#b3b6f8df895b95a7a094fa9c0c321374278ce2a2"
- integrity sha512-SW7V4f8TFgvkPmoM5i+/2xtMs5erURB4Mertmw9nzaiHBRFebBSd3dpSmP7HD/s1pHMk8PUGmr2bUT6cfcToYA==
-
-"@spectrum-css/menu@^3.0.1":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/menu/-/menu-3.0.4.tgz#daae70a3e8af08eba9afd72ae07c5b737e30fc3b"
- integrity sha512-kKlNZ08GZv0/jQ/lh/JrIz0rYCO8GIPud/Iw/3+4ziKlA7LTa6lAQTWPghSWwBb3QGt1StOF12xM3RAAML3PUQ==
-
-"@spectrum-css/modal@^3.0.1":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/modal/-/modal-3.0.3.tgz#22671e3d3fa6c99cfd0f85dabb0e1ffd808beece"
- integrity sha512-GtqvEXE7JGIHgEZXSa+40jTCp5jwugcWobXxM1DYMGJUdV0z1NHb26/sa2ZShFrbuIUMAg3tdZoswYJAyWOoOw==
-
"@spectrum-css/page@^3.0.1":
version "3.0.1"
resolved "https://registry.yarnpkg.com/@spectrum-css/page/-/page-3.0.1.tgz#5e1c3dd5b1a1ee591f9d636b75f03665f542d846"
@@ -1564,116 +1296,11 @@
dependencies:
"@spectrum-css/vars" "^3.0.1"
-"@spectrum-css/pagination@^3.0.3":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/pagination/-/pagination-3.0.4.tgz#a8fec4e16db693ad3f0b225110708b696111acc8"
- integrity sha512-5n9Ylrpca5+BN8s5H53MIk0POcJ5vF6P5KWoJL/5FD71pf6aEpZFh2Pnu9g1r6qWCnugOyCAwAEPRkYWnP6e6g==
-
-"@spectrum-css/picker@^1.0.1":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/picker/-/picker-1.0.4.tgz#bb3d537b757c8135db10ace1f822dc99d048c51d"
- integrity sha512-iyaJcZLnU3J6kdmJOJMlgzaTO8ToyuiUPlEDwGS17a/4ZAW6LFw/RADcG2y3CFbAaRPhcoPuQMxKvL02HaDBOw==
-
-"@spectrum-css/popover@^3.0.1":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/popover/-/popover-3.0.4.tgz#1b03c1b498393fa04263004cc2e8413dba725ada"
- integrity sha512-tcOmhdTGUjG14oKxVpwHVFurvw3YbPhH0HhJOzK+4ffLa0rGcm28fvPLZu93cek2BKdoUd4m0tsJHQ6+zfENQQ==
-
-"@spectrum-css/progressbar@^1.0.2":
- version "1.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/progressbar/-/progressbar-1.0.4.tgz#2d29a9d016e356837a8f4973155c6c92581300fc"
- integrity sha512-zZqKg5Cf/NJrASyoqKpEcAKcVkw+fwwC3N7RinINXeTZdmxrRktbhe4NyE+MZW/+STtZqlhqNhJYAkQtpL47WA==
-
-"@spectrum-css/progresscircle@^1.0.2":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/progresscircle/-/progresscircle-1.0.3.tgz#d898d5ac4948549a0bd25ce2c53073c5c1a41fb3"
- integrity sha512-jTj8mSd+TpWfrWAw6UGEuEj6ud1mDWBZ3oUflVgYXKGS8xzpGFqT0kPObwzRLT50hzXME/T5du6ND5x7kAovig==
-
-"@spectrum-css/radio@^3.0.2":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/radio/-/radio-3.0.4.tgz#db111f93608cb18657da18c27df98cc9e0709e86"
- integrity sha512-0OsHBw/cC4rRaaVMjNqTYIhe1xg6Q/q6tigVtAEnxv13JAHbSoJFV2nGw/PAg8dfHKKDrep53cwnUxv4e8sQkQ==
-
-"@spectrum-css/search@^3.0.2":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/search/-/search-3.0.4.tgz#1bb745834ab11c71292f960f3c8f6d75d4d969f3"
- integrity sha512-BP/TO0bPSSMuFuRdcBcdlT4OxtxvFFAdlSwBU0Dlb2Fm0q4SgIFyR5kwns4XmsVjvxKUJn2Jv2pq5/tWZFzP+w==
-
-"@spectrum-css/sidenav@^3.0.2":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/sidenav/-/sidenav-3.0.4.tgz#6a727390307525c13433afd5b57cfe069922e4f2"
- integrity sha512-PnP4RDj0v6KU26fLwTexad72JhDiz0Fr5F+dihXeaFiLKr+Pcr8R4EY3y1Rpjd0x7PfRKVHOc7+gsMrshnCw5g==
-
-"@spectrum-css/statuslight@^3.0.2":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/statuslight/-/statuslight-3.0.3.tgz#6611aca08c742f4298d4800f1626db99fbd2d6ff"
- integrity sha512-4p+JfXfh+pojCu8mkzeBHoneJlG3ga7wA9yixgw3aWcATtGMjIxVZMEtYlhfjCRcA6sSVM15XdIL0wqePOuWKQ==
-
-"@spectrum-css/stepper@^3.0.3":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/stepper/-/stepper-3.0.4.tgz#1cd0851daa4a0dcd6ef892e7220bb23b16fd3929"
- integrity sha512-UVeCIXCbF6WeenGlbZuwxE5YhwXYC+rS2mNMH33hZylM/flMu2jSySZQRY5T8sb9pX7NDUgqPd9TEkGWvqZ25Q==
-
-"@spectrum-css/switch@^1.0.2":
- version "1.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/switch/-/switch-1.0.3.tgz#6a13309001cf64216ebe8e219e72127a75fd351e"
- integrity sha512-Vs0wh3KwQaMPU5TWqHfD/0ckqFfi3Aj9aGA9LXOOXfdvL/EsI0EEMXAMysnX8/oEbHClrQzOsBSThuesSSVQXA==
-
-"@spectrum-css/table@^3.0.1":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/table/-/table-3.0.3.tgz#7f7f19905ef3275cbf907ce3a5818e63c30b2caf"
- integrity sha512-nxwzVjLPsXoY/v4sdxOVYLcC+cEbGgJyLcLclT5LT9MGSbngFeUMJzzVR4EvehzuN4dH7hrATG7Mbuq29Mf0Hg==
-
-"@spectrum-css/tabs@^3.0.1":
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/@spectrum-css/tabs/-/tabs-3.1.0.tgz#04604d7e55da93bf5406ef40dd308568a6e52a97"
- integrity sha512-wH3lR2IG3qJ6J4lG7akcmq8gMsBS96m5TH5c+7YZMexD71fPPd7ykx3xrR6SvwVf90SXqGfOaE8uBGVAejkS3A==
-
-"@spectrum-css/tags@^3.0.2":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/tags/-/tags-3.0.3.tgz#fc76d2735cdc442de91b7eb3bee49a928c0767ac"
- integrity sha512-SL8vPxVDfWcY5VdIuyl0TImEXcOU1I7yCyXkk7MudMwfnYs81FaIyY32hFV9OHj0Tz/36UzRzc7AVMSuRQ53pw==
-
-"@spectrum-css/textfield@^3.0.1":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/textfield/-/textfield-3.0.3.tgz#0ea8d56ce58790586ef3433a2bcee31d22b976a8"
- integrity sha512-HHKGFlWtr/8bpJ0RmeyILHSQ+kUC0hPL/tlhcvCI5aTG1yMydvEJZ0mVe/uGKJPWKvV2sRr7X8Tmof3Yk7vTIA==
-
-"@spectrum-css/toast@^3.0.1":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/toast/-/toast-3.0.3.tgz#97c1527384707600832ecda35643ed304615250f"
- integrity sha512-CjLeaMs+cjUXojCCRtbj0YkD2BoZW16kjj2o5omkEpUTjA34IJ8xJ1a+CCtDILWekhXvN0MBN4sbumcnwcnx8w==
-
-"@spectrum-css/tooltip@^3.0.3":
- version "3.0.4"
- resolved "https://registry.yarnpkg.com/@spectrum-css/tooltip/-/tooltip-3.0.4.tgz#19daba377ab6e82de673da9a66cf6bf6d15f2bf3"
- integrity sha512-JXkR5XqB6ALgaR2Xsb265U2WRTxL7lpDhM/1zA53oxVjnnxjmOlKMEyP7ulbApdWpaPU5JUzp3rHT9UG3eQPOQ==
-
-"@spectrum-css/treeview@^3.0.2":
- version "3.0.3"
- resolved "https://registry.yarnpkg.com/@spectrum-css/treeview/-/treeview-3.0.3.tgz#aeda5175158b9f8d7529cb2b394428eb2a428046"
- integrity sha512-D5gGzZC/KtRArdx86Mesc9+99W9nTbUOeyYGqoJoAfJSOttoT6Tk5CrDvlCmAqjKf5rajemAkGri1ChqvUIwkw==
-
-"@spectrum-css/typography@^3.0.1", "@spectrum-css/typography@^3.0.2":
- version "3.0.2"
- resolved "https://registry.yarnpkg.com/@spectrum-css/typography/-/typography-3.0.2.tgz#ea3ca0a60e18064527819d48c8c4364cab4fcd38"
- integrity sha512-5ZOLmQe0edzsDMyhghUd4hBb5uxGsFrxzf+WasfcUw9klSfTsRZ09n1BsaaWbgrLjlMQ+EEHS46v5VNo0Ms2CA==
-
-"@spectrum-css/underlay@^2.0.9":
- version "2.0.12"
- resolved "https://registry.yarnpkg.com/@spectrum-css/underlay/-/underlay-2.0.12.tgz#d7735dc1de1d8b4e881e49f68b3095f2984cf7af"
- integrity sha512-eWeRQFy2MDJZFwzyMXwU8/sgpQaCLSzB3/18PIr4NcC/ixbJ+DjcCoRjKvL4sSYVDVFlQ2ssjnz1tOGn29Qm+g==
-
"@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==
-"@spectrum-css/vars@^4.0.0":
- version "4.0.1"
- resolved "https://registry.yarnpkg.com/@spectrum-css/vars/-/vars-4.0.1.tgz#ddc281316800db305856c5eeaebbed480a5ccf8d"
- integrity sha512-zEQCWk4+UlXGha0xz4iQQu0T8C2fFWAWfbXWtcHPNsb7DsUZLsJIqMpxJIbS0nQ9A832923e/jBn2l+03ikR5Q==
-
"@sveltejs/vite-plugin-svelte@^1.0.0-next.5":
version "1.0.0-next.5"
resolved "https://registry.yarnpkg.com/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-1.0.0-next.5.tgz#8cf608f7a3c33dfa5b648397aae1ba90e6a4883f"
@@ -1984,24 +1611,12 @@ anymatch@^3.0.3:
normalize-path "^3.0.0"
picomatch "^2.0.4"
-apexcharts@^3.19.2, apexcharts@^3.22.1:
- version "3.29.0"
- resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-3.29.0.tgz#1ffb940f293b21e20830ca0567bb37c29894e832"
- integrity sha512-PhI17VayidYAbLb5/g+7WOeirgFrVopzt0qGwLq8V+cd6NXx4CeHYq3S0pDZiUGO7UFQ4YIrT8+ie9/Fnler+w==
- 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"
-
arch@^2.1.2:
version "2.2.0"
resolved "https://registry.yarnpkg.com/arch/-/arch-2.2.0.tgz#1bc47818f305764f23ab3306b0bfc086c5a29d11"
integrity sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==
-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==
@@ -2031,15 +1646,6 @@ arr-union@^3.1.0:
resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4"
integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=
-array-sort@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a"
- integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==
- dependencies:
- default-compare "^1.0.0"
- get-value "^2.0.6"
- kind-of "^5.0.2"
-
array-union@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
@@ -2087,13 +1693,6 @@ atob@^2.1.2:
resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
-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-sign2@~0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
@@ -2585,13 +2184,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"
-
configent@^2.1.4:
version "2.2.0"
resolved "https://registry.yarnpkg.com/configent/-/configent-2.2.0.tgz#2de230fc43f22c47cfd99016aa6962d6f9546994"
@@ -2764,18 +2356,6 @@ date-fns@^1.27.2:
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c"
integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==
-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"
-
-dayjs@^1.10.4, dayjs@^1.10.5:
- version "1.10.7"
- resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.10.7.tgz#2cf5f91add28116748440866a0a1d26f3a6ce468"
- integrity sha512-P6twpd70BcPK34K26uJ1KT3wlhpuOAPoMwJzpsIWUxHZ7wpmbdZL/hQqBDfz7hGurYSa5PhzdhDHtt319hL3ig==
-
debug@4.3.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"
@@ -2804,13 +2384,6 @@ debug@^4.3.2:
dependencies:
ms "2.1.2"
-debug@~3.1.0:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
- integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
- 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"
@@ -2836,13 +2409,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"
-
define-properties@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
@@ -2956,11 +2522,6 @@ end-of-stream@^1.1.0:
dependencies:
once "^1.4.0"
-ent@^2.2.0:
- version "2.2.0"
- resolved "https://registry.yarnpkg.com/ent/-/ent-2.2.0.tgz#e964219325a21d05f44466a2f686ed6ce5f5dd1d"
- integrity sha1-6WQhkyWiHQX0RGai9obtbOX13R0=
-
error-ex@^1.3.1:
version "1.3.2"
resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
@@ -3286,11 +2847,6 @@ find-up@^4.0.0, find-up@^4.1.0:
locate-path "^5.0.0"
path-exists "^4.0.0"
-flatpickr@^4.5.2:
- version "4.6.9"
- resolved "https://registry.yarnpkg.com/flatpickr/-/flatpickr-4.6.9.tgz#9a13383e8a6814bda5d232eae3fcdccb97dc1499"
- integrity sha512-F0azNNi8foVWKSF+8X+ZJzz8r9sE1G4hl06RyceIaLvyltKvDl6vqk9Lm/6AUUCi5HWaIjiUbk7UpeE/fOXOpw==
-
fn-name@~3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/fn-name/-/fn-name-3.0.0.tgz#0596707f635929634d791f452309ab41558e3c5c"
@@ -3332,11 +2888,6 @@ from@~0:
resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=
-fs-exists-sync@^0.1.0:
- version "0.1.0"
- resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
- integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=
-
fs-extra@^8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
@@ -3390,14 +2941,6 @@ get-intrinsic@^1.0.2:
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-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"
@@ -3422,13 +2965,6 @@ 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=
-get-value@^3.0.0, get-value@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/get-value/-/get-value-3.0.1.tgz#5efd2a157f1d6a516d7524e124ac52d0a39ef5a8"
- integrity sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==
- dependencies:
- isobject "^3.0.1"
-
getos@^3.2.1:
version "3.2.1"
resolved "https://registry.yarnpkg.com/getos/-/getos-3.2.1.tgz#0134d1f4e00eb46144c5a9c0ac4dc087cbb27dc5"
@@ -3498,35 +3034,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.7.6, handlebars@^4.7.7:
- 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"
@@ -3585,14 +3092,6 @@ has-value@^1.0.0:
has-values "^1.0.0"
isobject "^3.0.0"
-has-value@^2.0.2:
- version "2.0.2"
- resolved "https://registry.yarnpkg.com/has-value/-/has-value-2.0.2.tgz#d0f12e8780ba8e90e66ad1a21c707fdb67c25658"
- integrity sha512-ybKOlcRsK2MqrM3Hmz/lQxXHZ6ejzSPzpNabKB45jb5qDgJvKPa3SdapTsTLwEb9WltgWpOmNax7i+DzNOk4TA==
- dependencies:
- get-value "^3.0.0"
- has-values "^2.0.1"
-
has-values@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
@@ -3606,13 +3105,6 @@ has-values@^1.0.0:
is-number "^3.0.0"
kind-of "^4.0.0"
-has-values@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/has-values/-/has-values-2.0.1.tgz#3876200ff86d8a8546a9264a952c17d5fc17579d"
- integrity sha512-+QdH3jOmq9P8GfdjFg0eJudqx1FqU62NQJ4P16rOEHeRdl7ckgwn6uqQjzYE0ZoHVV/e5E2esuJ5Gl5+HUW19w==
- dependencies:
- kind-of "^6.0.2"
-
has@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
@@ -3625,39 +3117,6 @@ hash-sum@^2.0.0:
resolved "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz#81d01bb5de8ea4a214ad5d6ead1b523460b0b45a"
integrity sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==
-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.9"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
@@ -3675,14 +3134,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-signature@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
@@ -3840,13 +3291,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"
@@ -3901,13 +3345,6 @@ is-installed-globally@^0.3.2:
global-dirs "^2.0.1"
is-path-inside "^3.0.1"
-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"
@@ -3927,13 +3364,6 @@ is-observable@^1.1.0:
dependencies:
symbol-observable "^1.1.0"
-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"
@@ -3961,13 +3391,6 @@ is-promise@^2.1.0:
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
-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"
@@ -4010,11 +3433,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"
@@ -4570,7 +3988,7 @@ jsprim@^1.2.2:
json-schema "0.2.3"
verror "1.10.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=
@@ -4584,12 +4002,12 @@ 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==
-kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
+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==
@@ -4678,11 +4096,6 @@ lodash-es@^4.17.11:
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
-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"
@@ -4693,22 +4106,7 @@ lodash.once@^4.1.1:
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.21, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0:
+lodash@4.17.21, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.7.0:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -4809,7 +4207,7 @@ methods@^1.1.2:
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
-micromatch@^3.1.4, micromatch@^3.1.5:
+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==
@@ -4890,7 +4288,7 @@ mkdirp@^0.5.4:
dependencies:
minimist "^1.2.5"
-moment@^2.18.1, moment@^2.27.0:
+moment@^2.27.0:
version "2.29.1"
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
@@ -4947,11 +4345,6 @@ ncp@^2.0.0:
resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3"
integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=
-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==
-
nice-try@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
@@ -5399,7 +4792,7 @@ read-pkg@^5.2.0:
parse-json "^5.0.0"
type-fest "^0.6.0"
-readable-stream@^2.2.2, readable-stream@~2.3.6:
+readable-stream@^2.2.2:
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==
@@ -5452,16 +4845,6 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
-regexparam@2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/regexparam/-/regexparam-2.0.0.tgz#059476767d5f5f87f735fc7922d133fd1a118c8c"
- integrity sha512-gJKwd2MVPWHAIFLsaYDZfyKzHNS4o7E/v8YmNf44vmeV2e4YfVoDToTOKTvE7ab68cRJ++kLuEXJBaEeJVt5ow==
-
-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==
-
regexpu-core@^4.7.1:
version "4.7.1"
resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.1.tgz#2dea5a9a07233298fbf0db91fa9abc4c6e0f8ad6"
@@ -5486,21 +4869,6 @@ regjsparser@^0.6.4:
dependencies:
jsesc "~0.5.0"
-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"
@@ -5736,11 +5104,6 @@ saxes@^5.0.1:
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"
- integrity sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA==
-
"semver@2 || 3 || 4 || 5", semver@^5.5.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
@@ -5814,13 +5177,6 @@ shortid@2.2.15:
dependencies:
nanoid "^2.1.0"
-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"
@@ -6112,11 +5468,6 @@ strip-indent@^3.0.0:
dependencies:
min-indent "^1.0.0"
-striptags@^3.1.1:
- version "3.2.0"
- resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.2.0.tgz#cc74a137db2de8b0b9a370006334161f7dd67052"
- integrity sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==
-
supports-color@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
@@ -6144,25 +5495,11 @@ supports-hyperlinks@^2.0.0:
has-flag "^4.0.0"
supports-color "^7.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-dnd-action@^0.9.8:
version "0.9.8"
resolved "https://registry.yarnpkg.com/svelte-dnd-action/-/svelte-dnd-action-0.9.8.tgz#d8e6813aba64148b38ac65ec5df7b153568b5cfa"
integrity sha512-EWzxSpgNRkD6t8oHWcY4hqMoDJ16nkeFTza3V5K1r8GDqCJwK32zhpNv9ETDwfQiy2V2bJJMrH7io9xdlkYadg==
-svelte-flatpickr@^3.1.0, svelte-flatpickr@^3.2.3:
- version "3.2.3"
- resolved "https://registry.yarnpkg.com/svelte-flatpickr/-/svelte-flatpickr-3.2.3.tgz#db5dd7ad832ef83262b45e09737955ad3d591fc8"
- integrity sha512-PNkqK4Napx8nTvCwkaUXdnKo8dISThaxEOK+szTUXcY6H0dQM0TSyuoMaVWY2yX7pM+PN5cpCQCcVe8YvTRFSw==
- dependencies:
- flatpickr "^4.5.2"
-
svelte-hmr@^0.13.3:
version "0.13.3"
resolved "https://registry.yarnpkg.com/svelte-hmr/-/svelte-hmr-0.13.3.tgz#fba5739b477ea44caf70e542a24a4352bee2b897"
@@ -6185,78 +5522,11 @@ svelte-portal@0.1.0:
resolved "https://registry.yarnpkg.com/svelte-portal/-/svelte-portal-0.1.0.tgz#cc2821cc84b05ed5814e0218dcdfcbebc53c1742"
integrity sha512-kef+ksXVKun224mRxat+DdO4C+cGHla+fEcZfnBAvoZocwiaceOfhf5azHYOPXSSB1igWVFTEOF3CDENPnuWxg==
-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.2.0"
- resolved "https://registry.yarnpkg.com/svelte-spa-router/-/svelte-spa-router-3.2.0.tgz#fae3311d292451236cb57131262406cf312b15ee"
- integrity sha512-igemo5Vs82TGBBw+DjWt6qKameXYzNs6aDXcTxou5XbEvOjiRcAM6MLkdVRCatn6u8r42dE99bt/br7T4qe/AQ==
- dependencies:
- regexparam "2.0.0"
-
svelte@^3.38.2:
version "3.38.2"
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.38.2.tgz#55e5c681f793ae349b5cc2fe58e5782af4275ef5"
integrity sha512-q5Dq0/QHh4BLJyEVWGe7Cej5NWs040LWjMbicBGZ+3qpFWJ1YObRmUDZKbbovddLC9WW7THTj3kYbTOFmU9fbg==
-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-observable@^1.1.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
@@ -6299,14 +5569,6 @@ throttleit@^1.0.0:
resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c"
integrity sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=
-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, through@~2.3, through@~2.3.1:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
@@ -6329,11 +5591,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-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"
@@ -6451,18 +5708,6 @@ typedarray@^0.0.6:
resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777"
integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=
-typeof-article@^0.1.1:
- version "0.1.1"
- resolved "https://registry.yarnpkg.com/typeof-article/-/typeof-article-0.1.1.tgz#9f07e733c3fbb646ffa9e61c08debacd460e06af"
- integrity sha1-nwfnM8P7tkb/qeYcCN66zUYOBq8=
- dependencies:
- kind-of "^3.1.0"
-
-uglify-js@^3.1.4:
- version "3.14.2"
- resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.2.tgz#d7dd6a46ca57214f54a2d0a43cad0f35db82ac99"
- integrity sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==
-
unicode-canonical-property-names-ecmascript@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
@@ -6696,11 +5941,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=
-
wrap-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-3.0.1.tgz#288a04d87eda5c286e060dfe8f135ce8d007f8ba"
@@ -6748,11 +5988,6 @@ xmlchars@^2.2.0:
resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
-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.1"
resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4"
@@ -6801,11 +6036,6 @@ yauzl@^2.10.0:
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=
-
yup@0.29.2:
version "0.29.2"
resolved "https://registry.yarnpkg.com/yup/-/yup-0.29.2.tgz#5302abd9024cca335b987793f8df868e410b7b67"
diff --git a/packages/cli/package.json b/packages/cli/package.json
index bdf01c50b4..f6f873edc1 100644
--- a/packages/cli/package.json
+++ b/packages/cli/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/cli",
- "version": "0.9.173-alpha.3",
+ "version": "0.9.176-alpha.3",
"description": "Budibase CLI, for developers, self hosting and migrations.",
"main": "src/index.js",
"bin": {
diff --git a/packages/client/README.md b/packages/client/README.md
index 67729ac3db..335dcbd3e6 100644
--- a/packages/client/README.md
+++ b/packages/client/README.md
@@ -19,7 +19,7 @@ The object key is the name of the component, as exported by `index.js`.
- **bindable** - whether the components provides a bindable value or not
- **settings** - array of settings displayed in the builder
-###Settings Definitions
+### Settings Definitions
The `type` field in each setting is used by the builder to know which component to use to display
the setting, so it's important that this field is correct. The valid options are:
diff --git a/packages/client/package.json b/packages/client/package.json
index 7cca15572a..dc487f6bf5 100644
--- a/packages/client/package.json
+++ b/packages/client/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/client",
- "version": "0.9.173-alpha.3",
+ "version": "0.9.176-alpha.3",
"license": "MPL-2.0",
"module": "dist/budibase-client.js",
"main": "dist/budibase-client.js",
@@ -19,9 +19,9 @@
"dev:builder": "rollup -cw"
},
"dependencies": {
- "@budibase/bbui": "^0.9.173-alpha.3",
+ "@budibase/bbui": "^0.9.176-alpha.3",
"@budibase/standard-components": "^0.9.139",
- "@budibase/string-templates": "^0.9.173-alpha.3",
+ "@budibase/string-templates": "^0.9.176-alpha.3",
"regexparam": "^1.3.0",
"shortid": "^2.2.15",
"svelte-spa-router": "^3.0.5"
diff --git a/packages/client/src/components/overlay/PeekScreenDisplay.svelte b/packages/client/src/components/overlay/PeekScreenDisplay.svelte
index 0af1ba499e..51ff4412dc 100644
--- a/packages/client/src/components/overlay/PeekScreenDisplay.svelte
+++ b/packages/client/src/components/overlay/PeekScreenDisplay.svelte
@@ -8,6 +8,12 @@
import { Modal, ModalContent, ActionButton } from "@budibase/bbui"
import { onDestroy } from "svelte"
+ const MessageTypes = {
+ NOTIFICATION: "notification",
+ CLOSE_SCREEN_MODAL: "close-screen-modal",
+ INVALIDATE_DATASOURCE: "invalidate-datasource",
+ }
+
let iframe
let listenersAttached = false
@@ -21,32 +27,33 @@
notificationStore.actions.send(message, type, icon)
}
+ function receiveMessage(message) {
+ const handlers = {
+ [MessageTypes.NOTIFICATION]: () => {
+ proxyNotification(message.data)
+ },
+ [MessageTypes.CLOSE_SCREEN_MODAL]: peekStore.actions.hidePeek,
+ [MessageTypes.INVALIDATE_DATASOURCE]: () => {
+ invalidateDataSource(message.data)
+ },
+ }
+
+ const messageHandler = handlers[message.data.type]
+ if (messageHandler) {
+ messageHandler(message)
+ } else {
+ console.warning("Unknown event type", message?.data?.type)
+ }
+ }
+
const attachListeners = () => {
// Mirror datasource invalidation to keep the parent window up to date
- iframe.contentWindow.addEventListener(
- "invalidate-datasource",
- invalidateDataSource
- )
- // Listen for a close event to close the screen peek
- iframe.contentWindow.addEventListener(
- "close-screen-modal",
- peekStore.actions.hidePeek
- )
- // Proxy notifications back to the parent window instead of iframe
- iframe.contentWindow.addEventListener("notification", proxyNotification)
+ window.addEventListener("message", receiveMessage)
}
const handleCancel = () => {
peekStore.actions.hidePeek()
- iframe.contentWindow.removeEventListener(
- "invalidate-datasource",
- invalidateDataSource
- )
- iframe.contentWindow.removeEventListener(
- "close-screen-modal",
- peekStore.actions.hidePeek
- )
- iframe.contentWindow.removeEventListener("notification", proxyNotification)
+ window.removeEventListener("message", receiveMessage)
}
const handleFullscreen = () => {
diff --git a/packages/client/src/stores/builder.js b/packages/client/src/stores/builder.js
index 2740a4551c..baea5cb831 100644
--- a/packages/client/src/stores/builder.js
+++ b/packages/client/src/stores/builder.js
@@ -4,11 +4,7 @@ import { findComponentById, findComponentPathById } from "../utils/components"
import { pingEndUser } from "../api"
const dispatchEvent = (type, data = {}) => {
- window.dispatchEvent(
- new CustomEvent("bb-event", {
- detail: { type, data },
- })
- )
+ window.parent.postMessage({ type, data })
}
const createBuilderStore = () => {
diff --git a/packages/client/src/stores/notification.js b/packages/client/src/stores/notification.js
index e3af9aacd1..97193b2092 100644
--- a/packages/client/src/stores/notification.js
+++ b/packages/client/src/stores/notification.js
@@ -26,11 +26,19 @@ const createNotificationStore = () => {
// If peeking, pass notifications back to parent window
if (get(routeStore).queryParams?.peek) {
- window.dispatchEvent(
- new CustomEvent("notification", {
- detail: { message, type, icon },
- })
- )
+ window.parent.postMessage({
+ type: "notification",
+ detail: {
+ message,
+ type,
+ icon,
+ },
+ })
+ // window.dispatchEvent(
+ // new CustomEvent("notification", {
+ // detail: { message, type, icon },
+ // })
+ // )
return
}
diff --git a/packages/server/package.json b/packages/server/package.json
index 2945578e71..cee6a2a2e8 100644
--- a/packages/server/package.json
+++ b/packages/server/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/server",
"email": "hi@budibase.com",
- "version": "0.9.173-alpha.3",
+ "version": "0.9.176-alpha.3",
"description": "Budibase Web Server",
"main": "src/index.js",
"repository": {
@@ -68,9 +68,9 @@
"author": "Budibase",
"license": "AGPL-3.0-or-later",
"dependencies": {
- "@budibase/auth": "^0.9.173-alpha.3",
- "@budibase/client": "^0.9.173-alpha.3",
- "@budibase/string-templates": "^0.9.173-alpha.3",
+ "@budibase/auth": "^0.9.176-alpha.3",
+ "@budibase/client": "^0.9.176-alpha.3",
+ "@budibase/string-templates": "^0.9.176-alpha.3",
"@elastic/elasticsearch": "7.10.0",
"@koa/router": "8.0.0",
"@sendgrid/mail": "7.1.1",
diff --git a/packages/server/src/api/controllers/datasource.js b/packages/server/src/api/controllers/datasource.js
index 2ff7c7f9b8..643e822a36 100644
--- a/packages/server/src/api/controllers/datasource.js
+++ b/packages/server/src/api/controllers/datasource.js
@@ -7,8 +7,9 @@ const {
BudibaseInternalDB,
getTableParams,
} = require("../../db/utils")
+const { BuildSchemaErrors } = require("../../constants")
const { integrations } = require("../../integrations")
-const { makeExternalQuery } = require("./row/utils")
+const { getDatasourceAndQuery } = require("./row/utils")
exports.fetch = async function (ctx) {
const database = new CouchDB(ctx.appId)
@@ -43,13 +44,17 @@ exports.buildSchemaFromDb = async function (ctx) {
const db = new CouchDB(ctx.appId)
const datasource = await db.get(ctx.params.datasourceId)
- const tables = await buildSchemaHelper(datasource)
+ const { tables, error } = await buildSchemaHelper(datasource)
datasource.entities = tables
- const response = await db.put(datasource)
- datasource._rev = response.rev
+ const dbResp = await db.put(datasource)
+ datasource._rev = dbResp.rev
- ctx.body = datasource
+ const response = { datasource }
+ if (error) {
+ response.error = error
+ }
+ ctx.body = response
}
exports.update = async function (ctx) {
@@ -71,7 +76,7 @@ exports.update = async function (ctx) {
ctx.status = 200
ctx.message = "Datasource saved successfully."
- ctx.body = datasource
+ ctx.body = { datasource }
}
exports.save = async function (ctx) {
@@ -85,13 +90,15 @@ exports.save = async function (ctx) {
...ctx.request.body.datasource,
}
+ let schemaError = null
if (fetchSchema) {
- let tables = await buildSchemaHelper(datasource)
+ const { tables, error } = await buildSchemaHelper(datasource)
+ schemaError = error
datasource.entities = tables
}
- const response = await db.put(datasource)
- datasource._rev = response.rev
+ const dbResp = await db.put(datasource)
+ datasource._rev = dbResp.rev
// Drain connection pools when configuration is changed
if (datasource.source) {
@@ -101,9 +108,11 @@ exports.save = async function (ctx) {
}
}
- ctx.status = 200
- ctx.message = "Datasource saved successfully."
- ctx.body = datasource
+ const response = { datasource }
+ if (schemaError) {
+ response.error = schemaError
+ }
+ ctx.body = response
}
exports.destroy = async function (ctx) {
@@ -129,7 +138,7 @@ exports.find = async function (ctx) {
exports.query = async function (ctx) {
const queryJson = ctx.request.body
try {
- ctx.body = await makeExternalQuery(ctx.appId, queryJson)
+ ctx.body = await getDatasourceAndQuery(ctx.appId, queryJson)
} catch (err) {
ctx.throw(400, err)
}
@@ -143,5 +152,28 @@ const buildSchemaHelper = async datasource => {
await connector.buildSchema(datasource._id, datasource.entities)
datasource.entities = connector.tables
- return connector.tables
+ // make sure they all have a display name selected
+ for (let entity of Object.values(datasource.entities)) {
+ if (entity.primaryDisplay) {
+ continue
+ }
+ const notAutoColumn = Object.values(entity.schema).find(
+ schema => !schema.autocolumn
+ )
+ if (notAutoColumn) {
+ entity.primaryDisplay = notAutoColumn.name
+ }
+ }
+
+ const errors = connector.schemaErrors
+ let error = null
+ if (errors && Object.keys(errors).length > 0) {
+ const noKeyTables = Object.entries(errors)
+ .filter(entry => entry[1] === BuildSchemaErrors.NO_KEY)
+ .map(([name]) => name)
+ error = `No primary key constraint found for the following: ${noKeyTables.join(
+ ", "
+ )}`
+ }
+ return { tables: connector.tables, error }
}
diff --git a/packages/server/src/api/controllers/query.js b/packages/server/src/api/controllers/query.js
index 89bf1a8ab0..5f9fadf99b 100644
--- a/packages/server/src/api/controllers/query.js
+++ b/packages/server/src/api/controllers/query.js
@@ -101,7 +101,9 @@ async function enrichQueryFields(fields, parameters = {}) {
enrichedQuery[key] = await enrichQueryFields(fields[key], parameters)
} else if (typeof fields[key] === "string") {
// enrich string value as normal
- enrichedQuery[key] = await processString(fields[key], parameters)
+ enrichedQuery[key] = await processString(fields[key], parameters, {
+ noHelpers: true,
+ })
} else {
enrichedQuery[key] = fields[key]
}
diff --git a/packages/server/src/api/controllers/row/ExternalRequest.ts b/packages/server/src/api/controllers/row/ExternalRequest.ts
index c58364af07..f538e01f73 100644
--- a/packages/server/src/api/controllers/row/ExternalRequest.ts
+++ b/packages/server/src/api/controllers/row/ExternalRequest.ts
@@ -36,7 +36,7 @@ interface RunConfig {
}
module External {
- const { makeExternalQuery } = require("./utils")
+ const { getDatasourceAndQuery } = require("./utils")
const {
DataSourceOperation,
FieldTypes,
@@ -46,6 +46,7 @@ module External {
const { processObjectSync } = require("@budibase/string-templates")
const { cloneDeep } = require("lodash/fp")
const CouchDB = require("../../../db")
+ const { processFormulas } = require("../../../utilities/rowProcessor/utils")
function buildFilters(
id: string | undefined,
@@ -225,7 +226,7 @@ module External {
manyRelationships: ManyRelationship[] = []
for (let [key, field] of Object.entries(table.schema)) {
// if set already, or not set just skip it
- if ((!row[key] && row[key] !== "") || newRow[key] || field.autocolumn) {
+ if (row[key] == null || newRow[key] || field.autocolumn || field.type === FieldTypes.FORMULA) {
continue
}
// if its an empty string then it means return the column to null (if possible)
@@ -361,7 +362,7 @@ module External {
relationships
)
}
- return Object.values(finalRows)
+ return processFormulas(table, Object.values(finalRows))
}
/**
@@ -428,7 +429,7 @@ module External {
const tableId = isMany ? field.through : field.tableId
const manyKey = field.throughFrom || primaryKey
const fieldName = isMany ? manyKey : field.fieldName
- const response = await makeExternalQuery(this.appId, {
+ const response = await getDatasourceAndQuery(this.appId, {
endpoint: getEndpoint(tableId, DataSourceOperation.READ),
filters: {
equal: {
@@ -479,7 +480,7 @@ module External {
: DataSourceOperation.CREATE
if (!found) {
promises.push(
- makeExternalQuery(appId, {
+ getDatasourceAndQuery(appId, {
endpoint: getEndpoint(tableId, operation),
// if we're doing many relationships then we're writing, only one response
body,
@@ -509,7 +510,7 @@ module External {
: DataSourceOperation.UPDATE
const body = isMany ? null : { [colName]: null }
promises.push(
- makeExternalQuery(this.appId, {
+ getDatasourceAndQuery(this.appId, {
endpoint: getEndpoint(tableId, op),
body,
filters,
@@ -532,16 +533,17 @@ module External {
table: Table,
includeRelations: IncludeRelationships = IncludeRelationships.INCLUDE
) {
- function extractNonLinkFieldNames(table: Table, existing: string[] = []) {
+ function extractRealFields(table: Table, existing: string[] = []) {
return Object.entries(table.schema)
.filter(
column =>
column[1].type !== FieldTypes.LINK &&
+ column[1].type !== FieldTypes.FORMULA &&
!existing.find((field: string) => field === column[0])
)
.map(column => `${table.name}.${column[0]}`)
}
- let fields = extractNonLinkFieldNames(table)
+ let fields = extractRealFields(table)
for (let field of Object.values(table.schema)) {
if (field.type !== FieldTypes.LINK || !includeRelations) {
continue
@@ -549,7 +551,7 @@ module External {
const { tableName: linkTableName } = breakExternalTableId(field.tableId)
const linkTable = this.tables[linkTableName]
if (linkTable) {
- const linkedFields = extractNonLinkFieldNames(linkTable, fields)
+ const linkedFields = extractRealFields(linkTable, fields)
fields = fields.concat(linkedFields)
}
}
@@ -609,7 +611,7 @@ module External {
},
}
// can't really use response right now
- const response = await makeExternalQuery(appId, json)
+ const response = await getDatasourceAndQuery(appId, json)
// handle many to many relationships now if we know the ID (could be auto increment)
if (
operation !== DataSourceOperation.READ &&
diff --git a/packages/server/src/api/controllers/row/utils.js b/packages/server/src/api/controllers/row/utils.js
index ca6c782713..bd2df084a3 100644
--- a/packages/server/src/api/controllers/row/utils.js
+++ b/packages/server/src/api/controllers/row/utils.js
@@ -4,8 +4,8 @@ const CouchDB = require("../../../db")
const { InternalTables } = require("../../../db/utils")
const userController = require("../user")
const { FieldTypes } = require("../../../constants")
-const { integrations } = require("../../../integrations")
const { processStringSync } = require("@budibase/string-templates")
+const { makeExternalQuery } = require("../../../integrations/base/utils")
validateJs.extend(validateJs.validators.datetime, {
parse: function (value) {
@@ -17,18 +17,11 @@ validateJs.extend(validateJs.validators.datetime, {
},
})
-exports.makeExternalQuery = async (appId, json) => {
+exports.getDatasourceAndQuery = async (appId, json) => {
const datasourceId = json.endpoint.datasourceId
const db = new CouchDB(appId)
const datasource = await db.get(datasourceId)
- const Integration = integrations[datasource.source]
- // query is the opinionated function
- if (Integration.prototype.query) {
- const integration = new Integration(datasource.config)
- return integration.query(json)
- } else {
- throw "Datasource does not support query."
- }
+ return makeExternalQuery(datasource, json)
}
exports.findRow = async (ctx, db, tableId, rowId) => {
diff --git a/packages/server/src/api/controllers/table/external.js b/packages/server/src/api/controllers/table/external.js
new file mode 100644
index 0000000000..48454fbce9
--- /dev/null
+++ b/packages/server/src/api/controllers/table/external.js
@@ -0,0 +1,276 @@
+const CouchDB = require("../../../db")
+const {
+ buildExternalTableId,
+ breakExternalTableId,
+} = require("../../../integrations/utils")
+const {
+ getTable,
+ generateForeignKey,
+ generateJunctionTableName,
+ foreignKeyStructure,
+} = require("./utils")
+const {
+ DataSourceOperation,
+ FieldTypes,
+ RelationshipTypes,
+} = require("../../../constants")
+const { makeExternalQuery } = require("../../../integrations/base/utils")
+const { cloneDeep } = require("lodash/fp")
+
+async function makeTableRequest(
+ datasource,
+ operation,
+ table,
+ tables,
+ oldTable = null
+) {
+ const json = {
+ endpoint: {
+ datasourceId: datasource._id,
+ entityId: table._id,
+ operation,
+ },
+ meta: {
+ tables,
+ },
+ table,
+ }
+ if (oldTable) {
+ json.meta.table = oldTable
+ }
+ return makeExternalQuery(datasource, json)
+}
+
+function cleanupRelationships(table, tables, oldTable = null) {
+ const tableToIterate = oldTable ? oldTable : table
+ // clean up relationships in couch table schemas
+ for (let [key, schema] of Object.entries(tableToIterate.schema)) {
+ if (
+ schema.type === FieldTypes.LINK &&
+ (!oldTable || table.schema[key] == null)
+ ) {
+ const relatedTable = Object.values(tables).find(
+ table => table._id === schema.tableId
+ )
+ const foreignKey = schema.foreignKey
+ if (!relatedTable || !foreignKey) {
+ continue
+ }
+ for (let [relatedKey, relatedSchema] of Object.entries(
+ relatedTable.schema
+ )) {
+ if (
+ relatedSchema.type === FieldTypes.LINK &&
+ relatedSchema.fieldName === foreignKey
+ ) {
+ delete relatedTable.schema[relatedKey]
+ }
+ }
+ }
+ }
+}
+
+function getDatasourceId(table) {
+ if (!table) {
+ throw "No table supplied"
+ }
+ if (table.sourceId) {
+ return table.sourceId
+ }
+ return breakExternalTableId(table._id).datasourceId
+}
+
+function otherRelationshipType(type) {
+ if (type === RelationshipTypes.MANY_TO_MANY) {
+ return RelationshipTypes.MANY_TO_MANY
+ }
+ return type === RelationshipTypes.ONE_TO_MANY
+ ? RelationshipTypes.MANY_TO_ONE
+ : RelationshipTypes.ONE_TO_MANY
+}
+
+function generateManyLinkSchema(datasource, column, table, relatedTable) {
+ const primary = table.name + table.primary[0]
+ const relatedPrimary = relatedTable.name + relatedTable.primary[0]
+ const jcTblName = generateJunctionTableName(column, table, relatedTable)
+ // first create the new table
+ const junctionTable = {
+ _id: buildExternalTableId(datasource._id, jcTblName),
+ name: jcTblName,
+ primary: [primary, relatedPrimary],
+ constrained: [primary, relatedPrimary],
+ schema: {
+ [primary]: foreignKeyStructure(primary, {
+ toTable: table.name,
+ toKey: table.primary[0],
+ }),
+ [relatedPrimary]: foreignKeyStructure(relatedPrimary, {
+ toTable: relatedTable.name,
+ toKey: relatedTable.primary[0],
+ }),
+ },
+ }
+ column.through = junctionTable._id
+ column.throughFrom = primary
+ column.throughTo = relatedPrimary
+ column.fieldName = relatedPrimary
+ return junctionTable
+}
+
+function generateLinkSchema(column, table, relatedTable, type) {
+ const isOneSide = type === RelationshipTypes.ONE_TO_MANY
+ const primary = isOneSide ? relatedTable.primary[0] : table.primary[0]
+ // generate a foreign key
+ const foreignKey = generateForeignKey(column, relatedTable)
+ column.relationshipType = type
+ column.foreignKey = isOneSide ? foreignKey : primary
+ column.fieldName = isOneSide ? primary : foreignKey
+ return foreignKey
+}
+
+function generateRelatedSchema(linkColumn, table, relatedTable, columnName) {
+ // generate column for other table
+ const relatedSchema = cloneDeep(linkColumn)
+ // swap them from the main link
+ if (linkColumn.foreignKey) {
+ relatedSchema.fieldName = linkColumn.foreignKey
+ relatedSchema.foreignKey = linkColumn.fieldName
+ }
+ // is many to many
+ else {
+ // don't need to copy through, already got it
+ relatedSchema.fieldName = linkColumn.throughFrom
+ relatedSchema.throughTo = linkColumn.throughFrom
+ relatedSchema.throughFrom = linkColumn.throughTo
+ }
+ relatedSchema.relationshipType = otherRelationshipType(
+ linkColumn.relationshipType
+ )
+ relatedSchema.tableId = relatedTable._id
+ relatedSchema.name = columnName
+ table.schema[columnName] = relatedSchema
+}
+
+function isRelationshipSetup(column) {
+ return column.foreignKey || column.through
+}
+
+exports.save = async function (ctx) {
+ const appId = ctx.appId
+ const table = ctx.request.body
+ // can't do this
+ delete table.dataImport
+ const datasourceId = getDatasourceId(ctx.request.body)
+ let tableToSave = {
+ type: "table",
+ _id: buildExternalTableId(datasourceId, table.name),
+ ...table,
+ }
+
+ let oldTable
+ if (ctx.request.body && ctx.request.body._id) {
+ oldTable = await getTable(appId, ctx.request.body._id)
+ }
+
+ const db = new CouchDB(appId)
+ const datasource = await db.get(datasourceId)
+ const oldTables = cloneDeep(datasource.entities)
+ const tables = datasource.entities
+
+ const extraTablesToUpdate = []
+
+ // check if relations need setup
+ for (let schema of Object.values(tableToSave.schema)) {
+ if (schema.type !== FieldTypes.LINK || isRelationshipSetup(schema)) {
+ continue
+ }
+ const relatedTable = Object.values(tables).find(
+ table => table._id === schema.tableId
+ )
+ const relatedColumnName = schema.fieldName
+ const relationType = schema.relationshipType
+ if (relationType === RelationshipTypes.MANY_TO_MANY) {
+ const junctionTable = generateManyLinkSchema(
+ datasource,
+ schema,
+ table,
+ relatedTable
+ )
+ if (tables[junctionTable.name]) {
+ throw "Junction table already exists, cannot create another relationship."
+ }
+ tables[junctionTable.name] = junctionTable
+ extraTablesToUpdate.push(junctionTable)
+ } else {
+ const fkTable =
+ relationType === RelationshipTypes.ONE_TO_MANY ? table : relatedTable
+ const foreignKey = generateLinkSchema(
+ schema,
+ table,
+ relatedTable,
+ relationType
+ )
+ fkTable.schema[foreignKey] = foreignKeyStructure(foreignKey)
+ if (fkTable.constrained == null) {
+ fkTable.constrained = []
+ }
+ if (fkTable.constrained.indexOf(foreignKey) === -1) {
+ fkTable.constrained.push(foreignKey)
+ }
+ // foreign key is in other table, need to save it to external
+ if (fkTable._id !== table._id) {
+ extraTablesToUpdate.push(fkTable)
+ }
+ }
+ generateRelatedSchema(schema, relatedTable, table, relatedColumnName)
+ schema.main = true
+ }
+
+ cleanupRelationships(tableToSave, tables, oldTable)
+
+ const operation = oldTable
+ ? DataSourceOperation.UPDATE_TABLE
+ : DataSourceOperation.CREATE_TABLE
+ await makeTableRequest(datasource, operation, tableToSave, tables, oldTable)
+ // update any extra tables (like foreign keys in other tables)
+ for (let extraTable of extraTablesToUpdate) {
+ const oldExtraTable = oldTables[extraTable.name]
+ let op = oldExtraTable
+ ? DataSourceOperation.UPDATE_TABLE
+ : DataSourceOperation.CREATE_TABLE
+ await makeTableRequest(datasource, op, extraTable, tables, oldExtraTable)
+ }
+
+ // make sure the constrained list, all still exist
+ if (Array.isArray(tableToSave.constrained)) {
+ tableToSave.constrained = tableToSave.constrained.filter(constraint =>
+ Object.keys(tableToSave.schema).includes(constraint)
+ )
+ }
+
+ // store it into couch now for budibase reference
+ datasource.entities[tableToSave.name] = tableToSave
+ await db.put(datasource)
+
+ return tableToSave
+}
+
+exports.destroy = async function (ctx) {
+ const appId = ctx.appId
+ const tableToDelete = await getTable(appId, ctx.params.tableId)
+ const datasourceId = getDatasourceId(tableToDelete)
+
+ const db = new CouchDB(appId)
+ const datasource = await db.get(datasourceId)
+ const tables = datasource.entities
+
+ const operation = DataSourceOperation.DELETE_TABLE
+ await makeTableRequest(datasource, operation, tableToDelete, tables)
+
+ cleanupRelationships(tableToDelete, tables)
+
+ delete datasource.entities[tableToDelete.name]
+ await db.put(datasource)
+
+ return tableToDelete
+}
diff --git a/packages/server/src/api/controllers/table/index.js b/packages/server/src/api/controllers/table/index.js
index d4356c9c8b..97b48943b8 100644
--- a/packages/server/src/api/controllers/table/index.js
+++ b/packages/server/src/api/controllers/table/index.js
@@ -1,16 +1,28 @@
const CouchDB = require("../../../db")
-const linkRows = require("../../../db/linkedRows")
+const internal = require("./internal")
+const external = require("./external")
const csvParser = require("../../../utilities/csvParser")
+const { isExternalTable } = require("../../../integrations/utils")
const {
- getRowParams,
getTableParams,
- generateTableID,
getDatasourceParams,
BudibaseInternalDB,
} = require("../../../db/utils")
-const { FieldTypes } = require("../../../constants")
-const { TableSaveFunctions, getTable } = require("./utils")
+const { getTable } = require("./utils")
+function pickApi({ tableId, table }) {
+ if (table && !tableId) {
+ tableId = table._id
+ }
+ if (table && table.type === "external") {
+ return external
+ } else if (tableId && isExternalTable(tableId)) {
+ return external
+ }
+ return internal
+}
+
+// covers both internal and external
exports.fetch = async function (ctx) {
const db = new CouchDB(ctx.appId)
@@ -50,143 +62,23 @@ exports.find = async function (ctx) {
exports.save = async function (ctx) {
const appId = ctx.appId
- const db = new CouchDB(appId)
- const { dataImport, ...rest } = ctx.request.body
- let tableToSave = {
- type: "table",
- _id: generateTableID(),
- views: {},
- ...rest,
- }
-
- // if the table obj had an _id then it will have been retrieved
- let oldTable
- if (ctx.request.body && ctx.request.body._id) {
- oldTable = await db.get(ctx.request.body._id)
- }
-
- // saving a table is a complex operation, involving many different steps, this
- // has been broken out into a utility to make it more obvious/easier to manipulate
- const tableSaveFunctions = new TableSaveFunctions({
- db,
- ctx,
- oldTable,
- dataImport,
- })
- tableToSave = await tableSaveFunctions.before(tableToSave)
-
- // make sure that types don't change of a column, have to remove
- // the column if you want to change the type
- if (oldTable && oldTable.schema) {
- for (let propKey of Object.keys(tableToSave.schema)) {
- let column = tableToSave.schema[propKey]
- let oldColumn = oldTable.schema[propKey]
- if (oldColumn && oldColumn.type === "internal") {
- oldColumn.type = "auto"
- }
- if (oldColumn && oldColumn.type !== column.type) {
- ctx.throw(400, "Cannot change the type of a column")
- }
- }
- }
-
- // Don't rename if the name is the same
- let { _rename } = tableToSave
- /* istanbul ignore next */
- if (_rename && _rename.old === _rename.updated) {
- _rename = null
- delete tableToSave._rename
- }
-
- // rename row fields when table column is renamed
- /* istanbul ignore next */
- if (_rename && tableToSave.schema[_rename.updated].type === FieldTypes.LINK) {
- ctx.throw(400, "Cannot rename a linked column.")
- }
-
- tableToSave = await tableSaveFunctions.mid(tableToSave)
-
- // update schema of non-statistics views when new columns are added
- for (let view in tableToSave.views) {
- const tableView = tableToSave.views[view]
- if (!tableView) continue
-
- if (tableView.schema.group || tableView.schema.field) continue
- tableView.schema = tableToSave.schema
- }
-
- // update linked rows
- try {
- const linkResp = await linkRows.updateLinks({
- appId,
- eventType: oldTable
- ? linkRows.EventType.TABLE_UPDATED
- : linkRows.EventType.TABLE_SAVE,
- table: tableToSave,
- oldTable: oldTable,
- })
- if (linkResp != null && linkResp._rev) {
- tableToSave._rev = linkResp._rev
- }
- } catch (err) {
- ctx.throw(400, err)
- }
-
- // don't perform any updates until relationships have been
- // checked by the updateLinks function
- const updatedRows = tableSaveFunctions.getUpdatedRows()
- if (updatedRows && updatedRows.length !== 0) {
- await db.bulkDocs(updatedRows)
- }
- const result = await db.put(tableToSave)
- tableToSave._rev = result.rev
-
- tableToSave = await tableSaveFunctions.after(tableToSave)
-
- ctx.eventEmitter &&
- ctx.eventEmitter.emitTable(`table:save`, appId, tableToSave)
-
+ const table = ctx.request.body
+ const savedTable = await pickApi({ table }).save(ctx)
ctx.status = 200
- ctx.message = `Table ${ctx.request.body.name} saved successfully.`
- ctx.body = tableToSave
+ ctx.message = `Table ${table.name} saved successfully.`
+ ctx.eventEmitter &&
+ ctx.eventEmitter.emitTable(`table:save`, appId, savedTable)
+ ctx.body = savedTable
}
exports.destroy = async function (ctx) {
const appId = ctx.appId
- const db = new CouchDB(appId)
- const tableToDelete = await db.get(ctx.params.tableId)
-
- // Delete all rows for that table
- const rows = await db.allDocs(
- getRowParams(ctx.params.tableId, null, {
- include_docs: true,
- })
- )
- await db.bulkDocs(rows.rows.map(row => ({ ...row.doc, _deleted: true })))
-
- // update linked rows
- await linkRows.updateLinks({
- appId,
- eventType: linkRows.EventType.TABLE_DELETE,
- table: tableToDelete,
- })
-
- // don't remove the table itself until very end
- await db.remove(tableToDelete)
-
- // remove table search index
- const currentIndexes = await db.getIndexes()
- const existingIndex = currentIndexes.indexes.find(
- existing => existing.name === `search:${ctx.params.tableId}`
- )
- if (existingIndex) {
- await db.deleteIndex(existingIndex)
- }
-
+ const tableId = ctx.params.tableId
+ const deletedTable = await pickApi({ tableId }).destroy(ctx)
ctx.eventEmitter &&
- ctx.eventEmitter.emitTable(`table:delete`, appId, tableToDelete)
+ ctx.eventEmitter.emitTable(`table:delete`, appId, deletedTable)
ctx.status = 200
- ctx.body = { message: `Table ${ctx.params.tableId} deleted.` }
+ ctx.body = { message: `Table ${tableId} deleted.` }
}
exports.validateCSVSchema = async function (ctx) {
diff --git a/packages/server/src/api/controllers/table/internal.js b/packages/server/src/api/controllers/table/internal.js
new file mode 100644
index 0000000000..898cd0593b
--- /dev/null
+++ b/packages/server/src/api/controllers/table/internal.js
@@ -0,0 +1,138 @@
+const CouchDB = require("../../../db")
+const linkRows = require("../../../db/linkedRows")
+const { getRowParams, generateTableID } = require("../../../db/utils")
+const { FieldTypes } = require("../../../constants")
+const { TableSaveFunctions } = require("./utils")
+
+exports.save = async function (ctx) {
+ const appId = ctx.appId
+ const db = new CouchDB(appId)
+ const { dataImport, ...rest } = ctx.request.body
+ let tableToSave = {
+ type: "table",
+ _id: generateTableID(),
+ views: {},
+ ...rest,
+ }
+
+ // if the table obj had an _id then it will have been retrieved
+ let oldTable
+ if (ctx.request.body && ctx.request.body._id) {
+ oldTable = await db.get(ctx.request.body._id)
+ }
+
+ // saving a table is a complex operation, involving many different steps, this
+ // has been broken out into a utility to make it more obvious/easier to manipulate
+ const tableSaveFunctions = new TableSaveFunctions({
+ db,
+ ctx,
+ oldTable,
+ dataImport,
+ })
+ tableToSave = await tableSaveFunctions.before(tableToSave)
+
+ // make sure that types don't change of a column, have to remove
+ // the column if you want to change the type
+ if (oldTable && oldTable.schema) {
+ for (let propKey of Object.keys(tableToSave.schema)) {
+ let column = tableToSave.schema[propKey]
+ let oldColumn = oldTable.schema[propKey]
+ if (oldColumn && oldColumn.type === "internal") {
+ oldColumn.type = "auto"
+ }
+ if (oldColumn && oldColumn.type !== column.type) {
+ ctx.throw(400, "Cannot change the type of a column")
+ }
+ }
+ }
+
+ // Don't rename if the name is the same
+ let { _rename } = tableToSave
+ /* istanbul ignore next */
+ if (_rename && _rename.old === _rename.updated) {
+ _rename = null
+ delete tableToSave._rename
+ }
+
+ // rename row fields when table column is renamed
+ /* istanbul ignore next */
+ if (_rename && tableToSave.schema[_rename.updated].type === FieldTypes.LINK) {
+ ctx.throw(400, "Cannot rename a linked column.")
+ }
+
+ tableToSave = await tableSaveFunctions.mid(tableToSave)
+
+ // update schema of non-statistics views when new columns are added
+ for (let view in tableToSave.views) {
+ const tableView = tableToSave.views[view]
+ if (!tableView) continue
+
+ if (tableView.schema.group || tableView.schema.field) continue
+ tableView.schema = tableToSave.schema
+ }
+
+ // update linked rows
+ try {
+ const linkResp = await linkRows.updateLinks({
+ appId,
+ eventType: oldTable
+ ? linkRows.EventType.TABLE_UPDATED
+ : linkRows.EventType.TABLE_SAVE,
+ table: tableToSave,
+ oldTable: oldTable,
+ })
+ if (linkResp != null && linkResp._rev) {
+ tableToSave._rev = linkResp._rev
+ }
+ } catch (err) {
+ ctx.throw(400, err)
+ }
+
+ // don't perform any updates until relationships have been
+ // checked by the updateLinks function
+ const updatedRows = tableSaveFunctions.getUpdatedRows()
+ if (updatedRows && updatedRows.length !== 0) {
+ await db.bulkDocs(updatedRows)
+ }
+ const result = await db.put(tableToSave)
+ tableToSave._rev = result.rev
+
+ tableToSave = await tableSaveFunctions.after(tableToSave)
+
+ return tableToSave
+}
+
+exports.destroy = async function (ctx) {
+ const appId = ctx.appId
+ const db = new CouchDB(appId)
+ const tableToDelete = await db.get(ctx.params.tableId)
+
+ // Delete all rows for that table
+ const rows = await db.allDocs(
+ getRowParams(ctx.params.tableId, null, {
+ include_docs: true,
+ })
+ )
+ await db.bulkDocs(rows.rows.map(row => ({ ...row.doc, _deleted: true })))
+
+ // update linked rows
+ await linkRows.updateLinks({
+ appId,
+ eventType: linkRows.EventType.TABLE_DELETE,
+ table: tableToDelete,
+ })
+
+ // don't remove the table itself until very end
+ await db.remove(tableToDelete)
+
+ // remove table search index
+ const currentIndexes = await db.getIndexes()
+ const existingIndex = currentIndexes.indexes.find(
+ existing => existing.name === `search:${ctx.params.tableId}`
+ )
+ if (existingIndex) {
+ await db.deleteIndex(existingIndex)
+ }
+
+ return tableToDelete
+}
diff --git a/packages/server/src/api/controllers/table/utils.js b/packages/server/src/api/controllers/table/utils.js
index 65c081f90e..1cca4c41d2 100644
--- a/packages/server/src/api/controllers/table/utils.js
+++ b/packages/server/src/api/controllers/table/utils.js
@@ -315,4 +315,24 @@ exports.checkForViewUpdates = async (db, table, rename, deletedColumns) => {
}
}
+exports.generateForeignKey = (column, relatedTable) => {
+ return `fk_${relatedTable.name}_${column.fieldName}`
+}
+
+exports.generateJunctionTableName = (column, table, relatedTable) => {
+ return `jt_${table.name}_${relatedTable.name}_${column.name}_${column.fieldName}`
+}
+
+exports.foreignKeyStructure = (keyName, meta = null) => {
+ const structure = {
+ type: FieldTypes.NUMBER,
+ constraints: {},
+ name: keyName,
+ }
+ if (meta) {
+ structure.meta = meta
+ }
+ return structure
+}
+
exports.TableSaveFunctions = TableSaveFunctions
diff --git a/packages/server/src/api/routes/tests/datasource.spec.js b/packages/server/src/api/routes/tests/datasource.spec.js
index b6d94f714d..04f4dd77b8 100644
--- a/packages/server/src/api/routes/tests/datasource.spec.js
+++ b/packages/server/src/api/routes/tests/datasource.spec.js
@@ -26,8 +26,8 @@ describe("/datasources", () => {
.expect('Content-Type', /json/)
.expect(200)
- expect(res.res.statusMessage).toEqual("Datasource saved successfully.")
- expect(res.body.name).toEqual("Test")
+ expect(res.body.datasource.name).toEqual("Test")
+ expect(res.body.errors).toBeUndefined()
})
})
diff --git a/packages/server/src/api/routes/tests/query.spec.js b/packages/server/src/api/routes/tests/query.spec.js
index 8dc153f28e..6b9be7447f 100644
--- a/packages/server/src/api/routes/tests/query.spec.js
+++ b/packages/server/src/api/routes/tests/query.spec.js
@@ -1,7 +1,6 @@
// mock out postgres for this
jest.mock("pg")
-const { findLastKey } = require("lodash/fp")
const setup = require("./utilities")
const { checkBuilderEndpoint } = require("./utilities/TestFunctions")
const { basicQuery, basicDatasource } = setup.structures
diff --git a/packages/server/src/constants/index.js b/packages/server/src/constants/index.js
index 8c194e109c..80c62cd02e 100644
--- a/packages/server/src/constants/index.js
+++ b/packages/server/src/constants/index.js
@@ -62,6 +62,9 @@ exports.DataSourceOperation = {
READ: "READ",
UPDATE: "UPDATE",
DELETE: "DELETE",
+ CREATE_TABLE: "CREATE_TABLE",
+ UPDATE_TABLE: "UPDATE_TABLE",
+ DELETE_TABLE: "DELETE_TABLE",
}
exports.SortDirection = {
@@ -152,5 +155,9 @@ exports.MetadataTypes = {
AUTOMATION_TEST_HISTORY: "automationTestHistory",
}
+exports.BuildSchemaErrors = {
+ NO_KEY: "no_key",
+}
+
// pass through the list from the auth/core lib
exports.ObjectStoreBuckets = ObjectStoreBuckets
diff --git a/packages/server/src/definitions/common.ts b/packages/server/src/definitions/common.ts
index f439fc0d28..c085773fa7 100644
--- a/packages/server/src/definitions/common.ts
+++ b/packages/server/src/definitions/common.ts
@@ -17,6 +17,11 @@ export interface FieldSchema {
autocolumn?: boolean
throughFrom?: string
throughTo?: string
+ main?: boolean
+ meta?: {
+ toTable: string
+ toKey: string
+ }
constraints?: {
type?: string
email?: boolean
@@ -36,11 +41,12 @@ export interface TableSchema {
export interface Table extends Base {
type?: string
views?: {}
- name?: string
+ name: string
primary?: string[]
schema: TableSchema
primaryDisplay?: string
sourceId?: string
+ constrained?: string[]
}
export interface Row extends Base {
diff --git a/packages/server/src/definitions/datasource.ts b/packages/server/src/definitions/datasource.ts
index c4b248fa17..a82e50b140 100644
--- a/packages/server/src/definitions/datasource.ts
+++ b/packages/server/src/definitions/datasource.ts
@@ -5,6 +5,9 @@ export enum Operation {
READ = "READ",
UPDATE = "UPDATE",
DELETE = "DELETE",
+ CREATE_TABLE = "CREATE_TABLE",
+ UPDATE_TABLE = "UPDATE_TABLE",
+ DELETE_TABLE = "DELETE_TABLE",
}
export enum SortDirection {
@@ -142,8 +145,10 @@ export interface QueryJson {
sort?: SortJson
paginate?: PaginationJson
body?: object
+ table?: Table
meta?: {
table?: Table
+ tables?: Record
}
extra?: {
idFilter?: SearchFilters
diff --git a/packages/server/src/integrations/base/datasourcePlus.ts b/packages/server/src/integrations/base/datasourcePlus.ts
new file mode 100644
index 0000000000..371671afc0
--- /dev/null
+++ b/packages/server/src/integrations/base/datasourcePlus.ts
@@ -0,0 +1,8 @@
+import { Table } from "../../definitions/common"
+
+export interface DatasourcePlus {
+ tables: Record
+ schemaErrors: Record
+
+ buildSchema(datasourceId: string, entities: Record): any
+}
diff --git a/packages/server/src/integrations/base/sql.ts b/packages/server/src/integrations/base/sql.ts
index 316e20e352..738b44afcc 100644
--- a/packages/server/src/integrations/base/sql.ts
+++ b/packages/server/src/integrations/base/sql.ts
@@ -1,19 +1,24 @@
import { Knex, knex } from "knex"
-const BASE_LIMIT = 5000
import {
- QueryJson,
- SearchFilters,
- QueryOptions,
- SortDirection,
Operation,
+ QueryJson,
+ QueryOptions,
RelationshipsJson,
+ SearchFilters,
+ SortDirection,
} from "../../definitions/datasource"
import { isIsoDateString } from "../utils"
+import SqlTableQueryBuilder from "./sqlTable"
+
+const BASE_LIMIT = 5000
type KnexQuery = Knex.QueryBuilder | Knex
function parseBody(body: any) {
for (let [key, value] of Object.entries(body)) {
+ if (Array.isArray(value)) {
+ body[key] = JSON.stringify(value)
+ }
if (typeof value !== "string") {
continue
}
@@ -243,23 +248,14 @@ function buildDelete(
}
}
-class SqlQueryBuilder {
- private readonly sqlClient: string
+class SqlQueryBuilder extends SqlTableQueryBuilder {
private readonly limit: number
// pass through client to get flavour of SQL
constructor(client: string, limit: number = BASE_LIMIT) {
- this.sqlClient = client
+ super(client)
this.limit = limit
}
- /**
- * @param json the input JSON structure from which an SQL query will be built.
- * @return {string} the operation that was found in the JSON.
- */
- _operation(json: QueryJson): Operation {
- return json.endpoint.operation
- }
-
/**
* @param json The JSON query DSL which is to be converted to SQL.
* @param opts extra options which are to be passed into the query builder, e.g. disableReturning
@@ -267,7 +263,8 @@ class SqlQueryBuilder {
* @return {{ sql: string, bindings: object }} the query ready to be passed to the driver.
*/
_query(json: QueryJson, opts: QueryOptions = {}) {
- const client = knex({ client: this.sqlClient })
+ const sqlClient = this.getSqlClient()
+ const client = knex({ client: sqlClient })
let query
switch (this._operation(json)) {
case Operation.CREATE:
@@ -282,6 +279,8 @@ class SqlQueryBuilder {
case Operation.DELETE:
query = buildDelete(client, json, opts)
break
+ case Operation.CREATE_TABLE: case Operation.UPDATE_TABLE: case Operation.DELETE_TABLE:
+ return this._tableQuery(json)
default:
throw `Operation type is not supported by SQL query builder`
}
diff --git a/packages/server/src/integrations/base/sqlTable.ts b/packages/server/src/integrations/base/sqlTable.ts
new file mode 100644
index 0000000000..e5249dfe7c
--- /dev/null
+++ b/packages/server/src/integrations/base/sqlTable.ts
@@ -0,0 +1,167 @@
+import { Knex, knex } from "knex"
+import { Table } from "../../definitions/common"
+import { Operation, QueryJson } from "../../definitions/datasource"
+import { breakExternalTableId } from "../utils"
+import SchemaBuilder = Knex.SchemaBuilder
+import CreateTableBuilder = Knex.CreateTableBuilder
+const { FieldTypes, RelationshipTypes } = require("../../constants")
+
+function generateSchema(schema: CreateTableBuilder, table: Table, tables: Record, oldTable: null | Table = null) {
+ let primaryKey = table && table.primary ? table.primary[0] : null
+ const columns = Object.values(table.schema)
+ // all columns in a junction table will be meta
+ let metaCols = columns.filter(col => col.meta)
+ let isJunction = metaCols.length === columns.length
+ // can't change primary once its set for now
+ if (primaryKey && !oldTable && !isJunction) {
+ schema.increments(primaryKey).primary()
+ } else if (!oldTable && isJunction) {
+ schema.primary(metaCols.map(col => col.name))
+ }
+
+
+ // check if any columns need added
+ const foreignKeys = Object.values(table.schema).map(col => col.foreignKey)
+ for (let [key, column] of Object.entries(table.schema)) {
+ // skip things that are already correct
+ const oldColumn = oldTable ? oldTable.schema[key] : null
+ if ((oldColumn && oldColumn.type === column.type) || (primaryKey === key && !isJunction)) {
+ continue
+ }
+ switch (column.type) {
+ case FieldTypes.STRING: case FieldTypes.OPTIONS: case FieldTypes.LONGFORM:
+ schema.string(key)
+ break
+ case FieldTypes.NUMBER:
+ // if meta is specified then this is a junction table entry
+ if (column.meta && column.meta.toKey && column.meta.toTable) {
+ const { toKey, toTable } = column.meta
+ schema.integer(key).unsigned()
+ schema.foreign(key).references(`${toTable}.${toKey}`)
+ } else if (foreignKeys.indexOf(key) === -1) {
+ schema.float(key)
+ }
+ break
+ case FieldTypes.BOOLEAN:
+ schema.boolean(key)
+ break
+ case FieldTypes.DATETIME:
+ schema.datetime(key)
+ break
+ case FieldTypes.ARRAY:
+ schema.json(key)
+ break
+ case FieldTypes.LINK:
+ // this side of the relationship doesn't need any SQL work
+ if (
+ column.relationshipType !== RelationshipTypes.MANY_TO_ONE &&
+ column.relationshipType !== RelationshipTypes.MANY_TO_MANY
+ ) {
+ if (!column.foreignKey || !column.tableId) {
+ throw "Invalid relationship schema"
+ }
+ const { tableName } = breakExternalTableId(column.tableId)
+ // @ts-ignore
+ const relatedTable = tables[tableName]
+ if (!relatedTable) {
+ throw "Referenced table doesn't exist"
+ }
+ schema.integer(column.foreignKey).unsigned()
+ schema.foreign(column.foreignKey).references(`${tableName}.${relatedTable.primary[0]}`)
+ }
+ break
+ }
+ }
+
+ // need to check if any columns have been deleted
+ if (oldTable) {
+ const deletedColumns = Object.entries(oldTable.schema)
+ .filter(([key, schema]) => schema.type !== FieldTypes.LINK && table.schema[key] == null)
+ .map(([key]) => key)
+ deletedColumns.forEach(key => {
+ if (oldTable.constrained && oldTable.constrained.indexOf(key) !== -1) {
+ schema.dropForeign(key)
+ }
+ schema.dropColumn(key)
+ })
+ }
+
+ return schema
+}
+
+function buildCreateTable(
+ knex: Knex,
+ table: Table,
+ tables: Record,
+): SchemaBuilder {
+ return knex.schema.createTable(table.name, schema => {
+ generateSchema(schema, table, tables)
+ })
+}
+
+function buildUpdateTable(
+ knex: Knex,
+ table: Table,
+ tables: Record,
+ oldTable: Table,
+): SchemaBuilder {
+ return knex.schema.alterTable(table.name, schema => {
+ generateSchema(schema, table, tables, oldTable)
+ })
+}
+
+function buildDeleteTable(
+ knex: Knex,
+ table: Table,
+): SchemaBuilder {
+ return knex.schema.dropTable(table.name)
+}
+
+class SqlTableQueryBuilder {
+ private readonly sqlClient: string
+
+ // pass through client to get flavour of SQL
+ constructor(client: string) {
+ this.sqlClient = client
+ }
+
+ getSqlClient(): string {
+ return this.sqlClient
+ }
+
+ /**
+ * @param json the input JSON structure from which an SQL query will be built.
+ * @return {string} the operation that was found in the JSON.
+ */
+ _operation(json: QueryJson): Operation {
+ return json.endpoint.operation
+ }
+
+ _tableQuery(json: QueryJson): any {
+ const client = knex({ client: this.sqlClient })
+ let query
+ if (!json.table || !json.meta || !json.meta.tables) {
+ throw "Cannot execute without table being specified"
+ }
+ switch (this._operation(json)) {
+ case Operation.CREATE_TABLE:
+ query = buildCreateTable(client, json.table, json.meta.tables)
+ break
+ case Operation.UPDATE_TABLE:
+ if (!json.meta || !json.meta.table) {
+ throw "Must specify old table for update"
+ }
+ query = buildUpdateTable(client, json.table, json.meta.tables, json.meta.table)
+ break
+ case Operation.DELETE_TABLE:
+ query = buildDeleteTable(client, json.table)
+ break
+ default:
+ throw "Table operation is of unknown type"
+ }
+ return query.toSQL()
+ }
+}
+
+export default SqlTableQueryBuilder
+module.exports = SqlTableQueryBuilder
\ No newline at end of file
diff --git a/packages/server/src/integrations/base/utils.ts b/packages/server/src/integrations/base/utils.ts
new file mode 100644
index 0000000000..5757232bc7
--- /dev/null
+++ b/packages/server/src/integrations/base/utils.ts
@@ -0,0 +1,19 @@
+import { QueryJson } from "../../definitions/datasource"
+import { Datasource } from "../../definitions/common"
+
+module DatasourceUtils {
+ const { integrations } = require("../index")
+
+ export async function makeExternalQuery(datasource: Datasource, json: QueryJson) {
+ const Integration = integrations[datasource.source]
+ // query is the opinionated function
+ if (Integration.prototype.query) {
+ const integration = new Integration(datasource.config)
+ return integration.query(json)
+ } else {
+ throw "Datasource does not support query."
+ }
+ }
+
+ module.exports.makeExternalQuery = makeExternalQuery
+}
diff --git a/packages/server/src/integrations/mysql.ts b/packages/server/src/integrations/mysql.ts
index 45c0bb6454..30cbd836b5 100644
--- a/packages/server/src/integrations/mysql.ts
+++ b/packages/server/src/integrations/mysql.ts
@@ -8,6 +8,7 @@ import {
} from "../definitions/datasource"
import { Table, TableSchema } from "../definitions/common"
import { getSqlQuery } from "./utils"
+import { DatasourcePlus } from "./base/datasourcePlus"
module MySQLModule {
const mysql = require("mysql2")
@@ -15,7 +16,7 @@ module MySQLModule {
const {
buildExternalTableId,
convertType,
- copyExistingPropsOver,
+ finaliseExternalTables,
} = require("./utils")
const { FieldTypes } = require("../constants")
@@ -131,9 +132,11 @@ module MySQLModule {
})
}
- class MySQLIntegration extends Sql {
+ class MySQLIntegration extends Sql implements DatasourcePlus {
private config: MySQLConfig
private readonly client: any
+ public tables: Record = {}
+ public schemaErrors: Record = {}
constructor(config: MySQLConfig) {
super("mysql")
@@ -185,10 +188,6 @@ module MySQLModule {
constraints,
}
}
- // for now just default to first column
- if (primaryKeys.length === 0) {
- primaryKeys.push(descResp[0].Field)
- }
if (!tables[tableName]) {
tables[tableName] = {
_id: buildExternalTableId(datasourceId, tableName),
@@ -197,12 +196,12 @@ module MySQLModule {
schema,
}
}
-
- copyExistingPropsOver(tableName, tables, entities)
}
this.client.end()
- this.tables = tables
+ const final = finaliseExternalTables(tables, entities)
+ this.tables = final.tables
+ this.schemaErrors = final.errors
}
async create(query: SqlQuery | string) {
@@ -263,6 +262,13 @@ module MySQLModule {
const operation = this._operation(json)
this.client.connect()
const input = this._query(json, { disableReturning: true })
+ if (Array.isArray(input)) {
+ const responses = []
+ for (let query of input) {
+ responses.push(await internalQuery(this.client, query, false))
+ }
+ return responses
+ }
let row
// need to manage returning, a feature mySQL can't do
if (operation === operation.DELETE) {
diff --git a/packages/server/src/integrations/postgres.ts b/packages/server/src/integrations/postgres.ts
index 237ffc4c69..76539424e6 100644
--- a/packages/server/src/integrations/postgres.ts
+++ b/packages/server/src/integrations/postgres.ts
@@ -7,6 +7,7 @@ import {
} from "../definitions/datasource"
import { Table } from "../definitions/common"
import { getSqlQuery } from "./utils"
+import { DatasourcePlus } from "./base/datasourcePlus"
module PostgresModule {
const { Pool } = require("pg")
@@ -15,7 +16,7 @@ module PostgresModule {
const {
buildExternalTableId,
convertType,
- copyExistingPropsOver,
+ finaliseExternalTables,
} = require("./utils")
const { escapeDangerousCharacters } = require("../utilities")
@@ -138,10 +139,12 @@ module PostgresModule {
}
}
- class PostgresIntegration extends Sql {
+ class PostgresIntegration extends Sql implements DatasourcePlus {
static pool: any
private readonly client: any
private readonly config: PostgresConfig
+ public tables: Record = {}
+ public schemaErrors: Record = {}
COLUMNS_SQL!: string
@@ -223,7 +226,7 @@ module PostgresModule {
if (!tables[tableName] || !tables[tableName].schema) {
tables[tableName] = {
_id: buildExternalTableId(datasourceId, tableName),
- primary: tableKeys[tableName] || ["id"],
+ primary: tableKeys[tableName] || [],
name: tableName,
schema: {},
}
@@ -248,10 +251,9 @@ module PostgresModule {
}
}
- for (let tableName of Object.keys(tables)) {
- copyExistingPropsOver(tableName, tables, entities)
- }
- this.tables = tables
+ const final = finaliseExternalTables(tables, entities)
+ this.tables = final.tables
+ this.schemaErrors = final.errors
}
async create(query: SqlQuery | string) {
@@ -277,8 +279,16 @@ module PostgresModule {
async query(json: QueryJson) {
const operation = this._operation(json).toLowerCase()
const input = this._query(json)
- const response = await internalQuery(this.client, input)
- return response.rows.length ? response.rows : [{ [operation]: true }]
+ if (Array.isArray(input)) {
+ const responses = []
+ for (let query of input) {
+ responses.push(await internalQuery(this.client, query))
+ }
+ return responses
+ } else {
+ const response = await internalQuery(this.client, input)
+ return response.rows.length ? response.rows : [{ [operation]: true }]
+ }
}
}
diff --git a/packages/server/src/integrations/utils.ts b/packages/server/src/integrations/utils.ts
index 07e4e950f8..f91d25423c 100644
--- a/packages/server/src/integrations/utils.ts
+++ b/packages/server/src/integrations/utils.ts
@@ -1,8 +1,8 @@
import { SqlQuery } from "../definitions/datasource"
-import { Datasource } from "../definitions/common"
+import { Datasource, Table } from "../definitions/common"
import { SourceNames } from "../definitions/datasource"
const { DocumentTypes, SEPARATOR } = require("../db/utils")
-const { FieldTypes } = require("../constants")
+const { FieldTypes, BuildSchemaErrors } = require("../constants")
const DOUBLE_SEPARATOR = `${SEPARATOR}${SEPARATOR}`
const ROW_ID_REGEX = /^\[.*]$/g
@@ -102,14 +102,14 @@ export function isIsoDateString(str: string) {
}
// add the existing relationships from the entities if they exist, to prevent them from being overridden
-export function copyExistingPropsOver(
+function copyExistingPropsOver(
tableName: string,
- tables: { [key: string]: any },
+ table: Table,
entities: { [key: string]: any }
) {
if (entities && entities[tableName]) {
if (entities[tableName].primaryDisplay) {
- tables[tableName].primaryDisplay = entities[tableName].primaryDisplay
+ table.primaryDisplay = entities[tableName].primaryDisplay
}
const existingTableSchema = entities[tableName].schema
for (let key in existingTableSchema) {
@@ -117,8 +117,27 @@ export function copyExistingPropsOver(
continue
}
if (existingTableSchema[key].type === "link") {
- tables[tableName].schema[key] = existingTableSchema[key]
+ table.schema[key] = existingTableSchema[key]
}
}
}
+ return table
+}
+
+export function finaliseExternalTables(
+ tables: { [key: string]: any },
+ entities: { [key: string]: any }
+) {
+ const finalTables: { [key: string]: any } = {}
+ const errors: { [key: string]: string } = {}
+ for (let [name, table] of Object.entries(tables)) {
+ // make sure every table has a key
+ if (table.primary == null || table.primary.length === 0) {
+ errors[name] = BuildSchemaErrors.NO_KEY
+ continue
+ }
+ // make sure all previous props have been added back
+ finalTables[name] = copyExistingPropsOver(name, table, entities)
+ }
+ return { tables: finalTables, errors }
}
diff --git a/packages/server/src/tests/utilities/TestConfiguration.js b/packages/server/src/tests/utilities/TestConfiguration.js
index dfdc770389..8f3583443c 100644
--- a/packages/server/src/tests/utilities/TestConfiguration.js
+++ b/packages/server/src/tests/utilities/TestConfiguration.js
@@ -311,7 +311,8 @@ class TestConfiguration {
async createDatasource(config = null) {
config = config || basicDatasource()
- this.datasource = await this._req(config, null, controllers.datasource.save)
+ const response = await this._req(config, null, controllers.datasource.save)
+ this.datasource = response.datasource
return this.datasource
}
diff --git a/packages/server/yarn.lock b/packages/server/yarn.lock
index 4d5fc64903..aa95579d95 100644
--- a/packages/server/yarn.lock
+++ b/packages/server/yarn.lock
@@ -943,6 +943,29 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
+"@budibase/auth@^0.9.169-alpha.1":
+ version "0.9.169"
+ resolved "https://registry.yarnpkg.com/@budibase/auth/-/auth-0.9.169.tgz#fd2a8fc271782ba857259ace15118a4d53b3d161"
+ integrity sha512-Q087k/54Nzx6Oeg5uL7YD/9BB+qkBWIv7h4ct+cNQJFNK/aKKN8JLQft+z3mBN5omHTkdJYFmbgXWFxtX+rR3Q==
+ dependencies:
+ "@techpass/passport-openidconnect" "^0.3.0"
+ aws-sdk "^2.901.0"
+ bcryptjs "^2.4.3"
+ cls-hooked "^4.2.2"
+ ioredis "^4.27.1"
+ jsonwebtoken "^8.5.1"
+ koa-passport "^4.1.4"
+ lodash "^4.17.21"
+ node-fetch "^2.6.1"
+ passport-google-auth "^1.0.2"
+ passport-google-oauth "^2.0.0"
+ passport-jwt "^4.0.0"
+ passport-local "^1.0.0"
+ sanitize-s3-objectkey "^0.0.1"
+ tar-fs "^2.1.1"
+ uuid "^8.3.2"
+ zlib "^1.0.5"
+
"@budibase/bbui@^0.9.139":
version "0.9.139"
resolved "https://registry.yarnpkg.com/@budibase/bbui/-/bbui-0.9.139.tgz#e6cfc90e8f6c2aa3526fc6a7bef251bccdaf51bb"
@@ -992,6 +1015,94 @@
svelte-flatpickr "^3.1.0"
svelte-portal "^1.0.0"
+"@budibase/bbui@^0.9.169":
+ version "0.9.169"
+ resolved "https://registry.yarnpkg.com/@budibase/bbui/-/bbui-0.9.169.tgz#e8dac59b9792a7edf03c4301a9069760e2ebd2f4"
+ integrity sha512-2hks6GEjcXbDUzC37WgJvgloiqTP5ZS7IuRjlHU9kStDr6dAnXuy8pO6JNJmKrTXt+rgtwhHHrVWzzcmNLIYxA==
+ dependencies:
+ "@adobe/spectrum-css-workflow-icons" "^1.2.1"
+ "@spectrum-css/actionbutton" "^1.0.1"
+ "@spectrum-css/actiongroup" "^1.0.1"
+ "@spectrum-css/avatar" "^3.0.2"
+ "@spectrum-css/button" "^3.0.1"
+ "@spectrum-css/buttongroup" "^3.0.2"
+ "@spectrum-css/checkbox" "^3.0.2"
+ "@spectrum-css/dialog" "^3.0.1"
+ "@spectrum-css/divider" "^1.0.3"
+ "@spectrum-css/dropzone" "^3.0.2"
+ "@spectrum-css/fieldgroup" "^3.0.2"
+ "@spectrum-css/fieldlabel" "^3.0.1"
+ "@spectrum-css/icon" "^3.0.1"
+ "@spectrum-css/illustratedmessage" "^3.0.2"
+ "@spectrum-css/inputgroup" "^3.0.2"
+ "@spectrum-css/label" "^2.0.10"
+ "@spectrum-css/link" "^3.1.1"
+ "@spectrum-css/menu" "^3.0.1"
+ "@spectrum-css/modal" "^3.0.1"
+ "@spectrum-css/pagination" "^3.0.3"
+ "@spectrum-css/picker" "^1.0.1"
+ "@spectrum-css/popover" "^3.0.1"
+ "@spectrum-css/progressbar" "^1.0.2"
+ "@spectrum-css/progresscircle" "^1.0.2"
+ "@spectrum-css/radio" "^3.0.2"
+ "@spectrum-css/search" "^3.0.2"
+ "@spectrum-css/sidenav" "^3.0.2"
+ "@spectrum-css/statuslight" "^3.0.2"
+ "@spectrum-css/stepper" "^3.0.3"
+ "@spectrum-css/switch" "^1.0.2"
+ "@spectrum-css/table" "^3.0.1"
+ "@spectrum-css/tabs" "^3.0.1"
+ "@spectrum-css/tags" "^3.0.2"
+ "@spectrum-css/textfield" "^3.0.1"
+ "@spectrum-css/toast" "^3.0.1"
+ "@spectrum-css/tooltip" "^3.0.3"
+ "@spectrum-css/treeview" "^3.0.2"
+ "@spectrum-css/typography" "^3.0.1"
+ "@spectrum-css/underlay" "^2.0.9"
+ "@spectrum-css/vars" "^3.0.1"
+ dayjs "^1.10.4"
+ svelte-flatpickr "^3.2.3"
+ svelte-portal "^1.0.0"
+
+"@budibase/client@^0.9.169-alpha.1":
+ version "0.9.169"
+ resolved "https://registry.yarnpkg.com/@budibase/client/-/client-0.9.169.tgz#bec370b8f069b42f62483b281d6b9e2c7c8625f3"
+ integrity sha512-/bDnwv2iRysZrcrBQJEKzuxdwkwoJ2FalmQFhsfj+V/MWBN/wpQSDbJZQwf/YcI5bQk8f7xIn95O+DMH/m5izg==
+ dependencies:
+ "@budibase/bbui" "^0.9.169"
+ "@budibase/standard-components" "^0.9.139"
+ "@budibase/string-templates" "^0.9.169"
+ regexparam "^1.3.0"
+ shortid "^2.2.15"
+ svelte-spa-router "^3.0.5"
+
+"@budibase/handlebars-helpers@^0.11.7":
+ version "0.11.7"
+ resolved "https://registry.yarnpkg.com/@budibase/handlebars-helpers/-/handlebars-helpers-0.11.7.tgz#8e5f9843d7dd10503e9f608555a96ccf4d836c46"
+ integrity sha512-PvGHAv22cWSFExs1kc0WglwsmCEUEOqWvSp6JCFZwtc3qAAr5yMfLK8WGVQ63ALvyzWZiyxF+yrlzeeaohCMJw==
+ dependencies:
+ array-sort "^1.0.0"
+ define-property "^2.0.2"
+ extend-shallow "^3.0.2"
+ for-in "^1.0.2"
+ get-object "^0.2.0"
+ get-value "^3.0.1"
+ handlebars "^4.7.7"
+ handlebars-utils "^1.0.6"
+ has-value "^2.0.2"
+ 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.1"
+ kind-of "^6.0.3"
+ micromatch "^3.1.5"
+ relative "^3.0.2"
+ striptags "^3.1.1"
+ to-gfm-code-block "^0.1.1"
+ year "^0.2.1"
+
"@budibase/standard-components@^0.9.139":
version "0.9.139"
resolved "https://registry.yarnpkg.com/@budibase/standard-components/-/standard-components-0.9.139.tgz#cf8e2b759ae863e469e50272b3ca87f2827e66e3"
@@ -1010,6 +1121,17 @@
svelte-apexcharts "^1.0.2"
svelte-flatpickr "^3.1.0"
+"@budibase/string-templates@^0.9.169", "@budibase/string-templates@^0.9.169-alpha.1":
+ version "0.9.169"
+ resolved "https://registry.yarnpkg.com/@budibase/string-templates/-/string-templates-0.9.169.tgz#3c0be97718f39a92ff6b2dbb8b470aaa7851005e"
+ integrity sha512-JUyg6XuUgFqnfdDSCAplo4cTtrqdSZ9NPrU3iGudZEQjO/Wk5sezWPznl3Yw/kFHKmPLjFHIveEa2+lODEAxIA==
+ dependencies:
+ "@budibase/handlebars-helpers" "^0.11.7"
+ dayjs "^1.10.4"
+ handlebars "^4.7.6"
+ 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"
@@ -2012,6 +2134,17 @@
dependencies:
defer-to-connect "^1.0.1"
+"@techpass/passport-openidconnect@^0.3.0":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@techpass/passport-openidconnect/-/passport-openidconnect-0.3.2.tgz#f8fd5d97256286665dbf26dac92431f977ab1e63"
+ integrity sha512-fnCtEiexXSHA029B//hJcCJlLJrT3lhpNCyA0rnz58Qttz0BLGCVv6yMT8HmOnGThH6vcDOVwdgKM3kbCQtEhw==
+ dependencies:
+ base64url "^3.0.1"
+ oauth "^0.9.15"
+ passport-strategy "^1.0.0"
+ request "^2.88.0"
+ webfinger "^0.4.2"
+
"@tootallnate/once@1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
@@ -2658,7 +2791,7 @@ arg@^4.1.0:
resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
-argparse@^1.0.7:
+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==
@@ -2705,6 +2838,15 @@ array-flatten@1.1.1:
resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+array-sort@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/array-sort/-/array-sort-1.0.0.tgz#e4c05356453f56f53512a7d1d6123f2c54c0a88a"
+ integrity sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==
+ dependencies:
+ default-compare "^1.0.0"
+ get-value "^2.0.6"
+ kind-of "^5.0.2"
+
array-union@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
@@ -2747,6 +2889,13 @@ astral-regex@^1.0.0:
resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9"
integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==
+async-hook-jl@^1.7.6:
+ version "1.7.6"
+ resolved "https://registry.yarnpkg.com/async-hook-jl/-/async-hook-jl-1.7.6.tgz#4fd25c2f864dbaf279c610d73bf97b1b28595e68"
+ integrity sha512-gFaHkFfSxTjvoxDMYqDuGHlcRyUuamF8s+ZTtJdDzqjws4mCt7v0vuV79/E2Wr2/riMQgtG4/yUtXWs1gZ7JMg==
+ dependencies:
+ stack-chain "^1.3.7"
+
async-limiter@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
@@ -2764,6 +2913,13 @@ async@^2.6.3:
dependencies:
lodash "^4.17.14"
+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"
@@ -2779,6 +2935,13 @@ 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.981.0"
resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.981.0.tgz#b2e6205db23d755e1c8fcbd0618e8309e69d3767"
@@ -2794,6 +2957,21 @@ aws-sdk@^2.767.0:
uuid "3.3.2"
xml2js "0.4.19"
+aws-sdk@^2.901.0:
+ version "2.1010.0"
+ resolved "https://registry.yarnpkg.com/aws-sdk/-/aws-sdk-2.1010.0.tgz#a0ff308149e2e358522b991f3b21d2f06c856f0c"
+ integrity sha512-ZiFMY0wJfgBSybAPKl4hEYi4zjs6c6A+kPmifF36C1bFja83Q4iNRUr2P13R41wJn/fdxMyWDgmx6r/5NNLUqg==
+ dependencies:
+ buffer "4.9.2"
+ events "1.1.1"
+ ieee754 "1.1.13"
+ jmespath "0.15.0"
+ querystring "0.2.0"
+ sax "1.2.1"
+ url "0.10.3"
+ 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"
@@ -2968,6 +3146,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, base64url@^3.0.1:
+ version "3.0.1"
+ 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"
@@ -2988,7 +3171,7 @@ bcrypt-pbkdf@^1.0.0:
dependencies:
tweetnacl "^0.14.3"
-bcryptjs@2.4.3:
+bcryptjs@2.4.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=
@@ -3028,6 +3211,15 @@ bl@^3.0.0:
dependencies:
readable-stream "^3.0.1"
+bl@^4.0.3:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a"
+ integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==
+ dependencies:
+ buffer "^5.5.0"
+ inherits "^2.0.4"
+ readable-stream "^3.4.0"
+
bluebird@^3.5.1:
version "3.7.2"
resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
@@ -3397,6 +3589,11 @@ chokidar@^3.2.2:
optionalDependencies:
fsevents "~2.3.2"
+chownr@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
+ integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
+
ci-info@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46"
@@ -3469,6 +3666,15 @@ clone-response@1.0.2, clone-response@^1.0.2:
dependencies:
mimic-response "^1.0.0"
+cls-hooked@^4.2.2:
+ version "4.2.2"
+ resolved "https://registry.yarnpkg.com/cls-hooked/-/cls-hooked-4.2.2.tgz#ad2e9a4092680cdaffeb2d3551da0e225eae1908"
+ integrity sha512-J4Xj5f5wq/4jAvcdgoGsL3G103BtWpZrMo8NEinRltN+xpTZdI+M38pyQqhuFU/P792xkMFvnKSf+Lm81U1bxw==
+ dependencies:
+ async-hook-jl "^1.7.6"
+ emitter-listener "^1.0.1"
+ semver "^5.4.1"
+
cluster-key-slot@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d"
@@ -3590,6 +3796,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"
@@ -3806,6 +4019,13 @@ 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"
@@ -3949,6 +4169,13 @@ 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"
@@ -4193,6 +4420,13 @@ electron-to-chromium@^1.3.811:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.827.tgz#c725e8db8c5be18b472a919e5f57904512df0fc1"
integrity sha512-ye+4uQOY/jbjRutMcE/EmOcNwUeo1qo9aKL2tPyb09cU3lmxNeyDF4RWiemmkknW+p29h7dyDqy02higTxc9/A==
+emitter-listener@^1.0.1:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/emitter-listener/-/emitter-listener-1.1.2.tgz#56b140e8f6992375b3d7cb2cab1cc7432d9632e8"
+ integrity sha512-Bt1sBAGFHY9DKY+4/2cV6izcKJUf5T7/gkdmkxzX/qv9CcGH8xSwVRW5mtX03SWJtRTWSOpzCuWN9rBFYZepZQ==
+ dependencies:
+ shimmer "^1.2.0"
+
emittery@^0.8.1:
version "0.8.1"
resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.8.1.tgz#bb23cc86d03b30aa75a7f734819dee2e1ba70860"
@@ -4223,7 +4457,7 @@ encoding-down@^6.3.0:
level-codec "^9.0.0"
level-errors "^2.0.0"
-end-of-stream@^1.0.0, end-of-stream@^1.1.0:
+end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==
@@ -4237,6 +4471,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"
@@ -5057,6 +5296,11 @@ fs-constants@^1.0.0:
resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad"
integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==
+fs-exists-sync@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add"
+ integrity sha1-mC1ok6+RjnLQjeyehnP/K1qNat0=
+
fs-extra@8.1.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0"
@@ -5120,6 +5364,14 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, 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-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"
@@ -5167,6 +5419,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=
+get-value@^3.0.0, get-value@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/get-value/-/get-value-3.0.1.tgz#5efd2a157f1d6a516d7524e124ac52d0a39ef5a8"
+ integrity sha512-mKZj9JLQrwMBtj5wxi6MH8Z5eSKaERpAwjg43dPtlGI1ZVEgH/qC7T8/6R2OBSUA+zzHBZgICsVJaEIV2tKTDA==
+ dependencies:
+ isobject "^3.0.1"
+
getopts@2.2.5:
version "2.2.5"
resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.5.tgz#67a0fe471cacb9c687d817cab6450b96dde8313b"
@@ -5256,6 +5515,32 @@ globby@^11.0.3:
merge2 "^1.3.0"
slash "^3.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"
+
got@^8.3.1:
version "8.3.2"
resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937"
@@ -5301,6 +5586,45 @@ graceful-fs@^4.1.10, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
+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"
+
+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.7.6, handlebars@^4.7.7:
+ 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"
@@ -5371,6 +5695,14 @@ has-value@^1.0.0:
has-values "^1.0.0"
isobject "^3.0.0"
+has-value@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/has-value/-/has-value-2.0.2.tgz#d0f12e8780ba8e90e66ad1a21c707fdb67c25658"
+ integrity sha512-ybKOlcRsK2MqrM3Hmz/lQxXHZ6ejzSPzpNabKB45jb5qDgJvKPa3SdapTsTLwEb9WltgWpOmNax7i+DzNOk4TA==
+ dependencies:
+ get-value "^3.0.0"
+ has-values "^2.0.1"
+
has-values@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771"
@@ -5384,6 +5716,13 @@ has-values@^1.0.0:
is-number "^3.0.0"
kind-of "^4.0.0"
+has-values@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/has-values/-/has-values-2.0.1.tgz#3876200ff86d8a8546a9264a952c17d5fc17579d"
+ integrity sha512-+QdH3jOmq9P8GfdjFg0eJudqx1FqU62NQJ4P16rOEHeRdl7ckgwn6uqQjzYE0ZoHVV/e5E2esuJ5Gl5+HUW19w==
+ dependencies:
+ kind-of "^6.0.2"
+
has-yarn@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77"
@@ -5396,6 +5735,39 @@ 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.9"
resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
@@ -5425,6 +5797,14 @@ 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.5.0"
resolved "https://registry.yarnpkg.com/http-assert/-/http-assert-1.5.0.tgz#c389ccd87ac16ed2dfa6246fd73b926aa00e6b8f"
@@ -5715,6 +6095,23 @@ ioredis@^4.27.0:
redis-parser "^3.0.0"
standard-as-callback "^2.1.0"
+ioredis@^4.27.1:
+ version "4.28.0"
+ resolved "https://registry.yarnpkg.com/ioredis/-/ioredis-4.28.0.tgz#5a2be3f37ff2075e2332f280eaeb02ab4d9ff0d3"
+ integrity sha512-I+zkeeWp3XFgPT2CtJKxvaF5FjGBGt4yGYljRjQecdQKteThuAsKqffeF1lgHVlYnuNeozRbPOCDNZ7tDWPeig==
+ dependencies:
+ cluster-key-slot "^1.1.0"
+ debug "^4.3.1"
+ denque "^1.1.0"
+ lodash.defaults "^4.2.0"
+ lodash.flatten "^4.4.0"
+ lodash.isarguments "^3.1.0"
+ p-map "^2.1.0"
+ redis-commands "1.7.0"
+ redis-errors "^1.2.0"
+ redis-parser "^3.0.0"
+ standard-as-callback "^2.1.0"
+
ip-regex@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
@@ -5846,6 +6243,13 @@ is-docker@^2.0.0:
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"
+ 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"
@@ -5935,6 +6339,13 @@ is-number-object@^1.0.4:
dependencies:
has-tostringtag "^1.0.0"
+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"
@@ -5957,6 +6368,13 @@ is-object@^1.0.1:
resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf"
integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==
+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"
@@ -5997,6 +6415,13 @@ 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"
@@ -6072,6 +6497,11 @@ 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"
@@ -7072,6 +7502,22 @@ jsonschema@1.4.0:
resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2"
integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw==
+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"
@@ -7111,7 +7557,7 @@ jwa@^1.4.1:
ecdsa-sig-formatter "1.0.11"
safe-buffer "^5.0.1"
-jws@3.x.x:
+jws@3.x.x, 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==
@@ -7138,7 +7584,7 @@ keyv@^3.0.0:
dependencies:
json-buffer "3.0.0"
-kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0:
+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=
@@ -7152,12 +7598,12 @@ kind-of@^4.0.0:
dependencies:
is-buffer "^1.1.5"
-kind-of@^5.0.0:
+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:
+kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3:
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==
@@ -7236,6 +7682,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"
@@ -7517,6 +7970,11 @@ 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"
@@ -7532,16 +7990,46 @@ lodash.flatten@^4.4.0:
resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=
+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.isarguments@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a"
integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=
+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.isequal@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
+lodash.isinteger@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
+ 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.keys@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205"
@@ -7552,11 +8040,21 @@ lodash.merge@^4.6.2:
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
+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.omit@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.omit/-/lodash.omit-4.5.0.tgz#6eb19ae5a1ee1dd9df0b969e66ce0b7fa30b5e60"
integrity sha1-brGa5aHuHdnfC5aeZs4Lf6MLXmA=
+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.pick@^4.0.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
@@ -7567,6 +8065,21 @@ 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"
@@ -7577,7 +8090,7 @@ lodash.xor@^4.5.0:
resolved "https://registry.yarnpkg.com/lodash.xor/-/lodash.xor-4.5.0.tgz#4d48ed7e98095b0632582ba714d3ff8ae8fb1db6"
integrity sha1-TUjtfpgJWwYyWCunFNP/iuj7HbY=
-lodash@4.17.21, lodash@4.x, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.7.0:
+lodash@4.17.21, lodash@4.x, lodash@^4.14.0, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.3, lodash@^4.7.0:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -7752,7 +8265,7 @@ methods@^1.0.1, methods@^1.1.1, methods@^1.1.2, methods@~1.1.2:
resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
-micromatch@^3.1.10, micromatch@^3.1.4:
+micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.5:
version "3.1.10"
resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23"
integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==
@@ -7841,6 +8354,11 @@ mixin-deep@^1.2.0:
for-in "^1.0.2"
is-extendable "^1.0.1"
+mkdirp-classic@^0.5.2:
+ version "0.5.3"
+ resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
+ integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
+
mkdirp@^0.5.0, mkdirp@^0.5.1:
version "0.5.5"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
@@ -7860,7 +8378,7 @@ moment-timezone@^0.5.31:
dependencies:
moment ">= 2.9.0"
-"moment@>= 2.9.0":
+"moment@>= 2.9.0", 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==
@@ -7965,6 +8483,11 @@ nan@^2.12.1:
resolved "https://registry.yarnpkg.com/nan/-/nan-2.15.0.tgz#3f34a473ff18e15c1b5626b62903b5ad6e665fee"
integrity sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==
+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"
@@ -8012,6 +8535,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==
+
nice-try@^1.0.4:
version "1.0.5"
resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
@@ -8032,6 +8560,11 @@ node-fetch@^2.6.0, node-fetch@^2.6.1:
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052"
integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==
+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"
@@ -8143,6 +8676,11 @@ oauth-sign@~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, oauth@^0.9.15:
+ 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"
@@ -8440,6 +8978,84 @@ pascalcase@^0.1.1:
resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14"
integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=
+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.2.0"
+ resolved "https://registry.yarnpkg.com/passport-oauth1/-/passport-oauth1-1.2.0.tgz#5229d431781bf5b265bec86ce9a9cce58a756cf9"
+ integrity sha512-Sv2YWodC6jN12M/OXwmR4BIXeeIHjjbwYTQw4kS6tHK4zYzSEpxBgSJJnknBjICA5cj0ju3FSnG1XmHgIhYnLg==
+ dependencies:
+ oauth "0.9.x"
+ passport-strategy "1.x.x"
+ utils-merge "1.x.x"
+
+passport-oauth2@1.x.x:
+ version "1.6.1"
+ resolved "https://registry.yarnpkg.com/passport-oauth2/-/passport-oauth2-1.6.1.tgz#c5aee8f849ce8bd436c7f81d904a3cd1666f181b"
+ integrity sha512-ZbV43Hq9d/SBSYQ22GOiglFsjsD1YY/qdiptA+8ej+9C1dL1TVB+mBE5kDH/D4AJo50+2i8f4bx0vg4/yDDZCQ==
+ 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"
+
path-exists@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
@@ -8494,6 +9110,11 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+pause@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/pause/-/pause-0.0.1.tgz#1d408b3fdb76923b9543d96fb4c9dfd535d9cb5d"
+ integrity sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=
+
pend@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
@@ -9206,7 +9827,7 @@ readable-stream@1.1.14, readable-stream@^1.0.27-1:
isarray "0.0.1"
string_decoder "~0.10.x"
-"readable-stream@2 || 3", readable-stream@^3.0.0, readable-stream@^3.0.1, readable-stream@^3.4.0, readable-stream@^3.6.0:
+"readable-stream@2 || 3", readable-stream@^3.0.0, readable-stream@^3.0.1, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.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==
@@ -9340,6 +9961,16 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
+regexparam@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/regexparam/-/regexparam-2.0.0.tgz#059476767d5f5f87f735fc7922d133fd1a118c8c"
+ integrity sha512-gJKwd2MVPWHAIFLsaYDZfyKzHNS4o7E/v8YmNf44vmeV2e4YfVoDToTOKTvE7ab68cRJ++kLuEXJBaEeJVt5ow==
+
+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"
@@ -9383,6 +10014,21 @@ regjsparser@^0.6.4:
dependencies:
jsesc "~0.5.0"
+relative@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/relative/-/relative-3.0.2.tgz#0dcd8ec54a5d35a3c15e104503d65375b5a5367f"
+ integrity sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8=
+ dependencies:
+ isobject "^2.0.0"
+
+remarkable@^1.6.2, remarkable@^1.7.1:
+ version "1.7.4"
+ resolved "https://registry.yarnpkg.com/remarkable/-/remarkable-1.7.4.tgz#19073cb960398c87a7d6546eaa5e50d2022fcd00"
+ integrity sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==
+ dependencies:
+ argparse "^1.0.10"
+ autolinker "~0.28.0"
+
remove-trailing-separator@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef"
@@ -9419,7 +10065,7 @@ request-promise-native@^1.0.5:
stealthy-require "^1.1.1"
tough-cookie "^2.3.3"
-request@^2.87.0:
+request@^2.72.0, request@^2.74.0, request@^2.87.0, request@^2.88.0:
version "2.88.2"
resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
@@ -9611,6 +10257,11 @@ sane@^4.0.3:
minimist "^1.1.1"
walker "~1.0.5"
+sanitize-s3-objectkey@^0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/sanitize-s3-objectkey/-/sanitize-s3-objectkey-0.0.1.tgz#efa9887cd45275b40234fb4bb12fc5754fe64e7e"
+ integrity sha512-ZTk7aqLxy4sD40GWcYWoLfbe05XLmkKvh6vGKe13ADlei24xlezcvjgKy1qRArlaIbIMYaqK7PCalvZtulZlaQ==
+
saslprep@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/saslprep/-/saslprep-1.0.3.tgz#4c02f946b56cf54297e347ba1093e7acac4cf226"
@@ -9623,7 +10274,7 @@ sax@1.2.1:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a"
integrity sha1-e45lYZCyKOgaZq6nSEgNgozS03o=
-sax@>=0.6.0, sax@^1.2.4:
+sax@>=0.1.1, sax@>=0.6.0, sax@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
@@ -9647,6 +10298,11 @@ 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-diff@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-3.1.1.tgz#05f77ce59f325e00e2706afd67bb506ddb1ca32b"
@@ -9654,7 +10310,7 @@ semver-diff@^3.1.1:
dependencies:
semver "^6.3.0"
-"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.5.0, semver@^5.6.0, semver@^5.7.1:
+"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.4.1, 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==
@@ -9785,6 +10441,18 @@ shell-path@^2.1.0:
dependencies:
shell-env "^0.3.0"
+shimmer@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337"
+ integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==
+
+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"
+
side-channel@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
@@ -10029,6 +10697,11 @@ sshpk@^1.7.0:
safer-buffer "^2.0.2"
tweetnacl "~0.14.0"
+stack-chain@^1.3.7:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/stack-chain/-/stack-chain-1.3.7.tgz#d192c9ff4ea6a22c94c4dd459171e3f00cea1285"
+ integrity sha1-0ZLJ/06moiyUxN1FkXHj8AzqEoU=
+
stack-utils@^1.0.1:
version "1.0.5"
resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b"
@@ -10071,6 +10744,11 @@ stealthy-require@^1.1.1:
resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b"
integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
+step@0.0.x:
+ version "0.0.6"
+ resolved "https://registry.yarnpkg.com/step/-/step-0.0.6.tgz#143e7849a5d7d3f4a088fe29af94915216eeede2"
+ integrity sha1-FD54SaXX0/SgiP4pr5SRUhbu7eI=
+
strict-uri-encode@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713"
@@ -10084,6 +10762,11 @@ string-length@^4.0.1:
char-regex "^1.0.2"
strip-ansi "^6.0.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-width@^3.0.0, string-width@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961"
@@ -10209,6 +10892,11 @@ strip-outer@^1.0.0:
dependencies:
escape-string-regexp "^1.0.2"
+striptags@^3.1.1:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/striptags/-/striptags-3.2.0.tgz#cc74a137db2de8b0b9a370006334161f7dd67052"
+ integrity sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==
+
sublevel-pouchdb@7.2.2:
version "7.2.2"
resolved "https://registry.yarnpkg.com/sublevel-pouchdb/-/sublevel-pouchdb-7.2.2.tgz#49e46cd37883bf7ff5006d7c5b9bcc7bcc1f422f"
@@ -10293,11 +10981,25 @@ svelte-flatpickr@^3.1.0:
dependencies:
flatpickr "^4.5.2"
+svelte-flatpickr@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/svelte-flatpickr/-/svelte-flatpickr-3.2.3.tgz#db5dd7ad832ef83262b45e09737955ad3d591fc8"
+ integrity sha512-PNkqK4Napx8nTvCwkaUXdnKo8dISThaxEOK+szTUXcY6H0dQM0TSyuoMaVWY2yX7pM+PN5cpCQCcVe8YvTRFSw==
+ 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.2.0"
+ resolved "https://registry.yarnpkg.com/svelte-spa-router/-/svelte-spa-router-3.2.0.tgz#fae3311d292451236cb57131262406cf312b15ee"
+ integrity sha512-igemo5Vs82TGBBw+DjWt6qKameXYzNs6aDXcTxou5XbEvOjiRcAM6MLkdVRCatn6u8r42dE99bt/br7T4qe/AQ==
+ dependencies:
+ regexparam "2.0.0"
+
svelte@^3.38.2:
version "3.42.4"
resolved "https://registry.yarnpkg.com/svelte/-/svelte-3.42.4.tgz#838ed98fa7b26fc5fffe4df0d7ba345f1c54cf4f"
@@ -10373,6 +11075,16 @@ table@^5.2.3:
slice-ansi "^2.1.0"
string-width "^3.0.0"
+tar-fs@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
+ integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==
+ dependencies:
+ chownr "^1.1.1"
+ mkdirp-classic "^0.5.2"
+ pump "^3.0.0"
+ tar-stream "^2.1.4"
+
tar-stream@^1.5.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555"
@@ -10386,6 +11098,17 @@ tar-stream@^1.5.2:
to-buffer "^1.1.1"
xtend "^4.0.0"
+tar-stream@^2.1.4:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287"
+ integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==
+ dependencies:
+ bl "^4.0.3"
+ end-of-stream "^1.4.1"
+ fs-constants "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^3.1.1"
+
tarn@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/tarn/-/tarn-1.1.5.tgz#7be88622e951738b9fa3fb77477309242cdddc2d"
@@ -10557,6 +11280,11 @@ 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"
@@ -10768,11 +11496,28 @@ 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"
+
typescript@^4.3.5:
version "4.3.5"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.3.5.tgz#4d1c37cc16e893973c45a06886b7113234f119f4"
integrity sha512-DqQgihaQ9cUrskJo9kIyW/+g0Vxsk8cDtZ52a3NGh0YNTfpUSArXSohyUGnvbPazEPLu398C0UxmKSOrPumUzA==
+uglify-js@^3.1.4:
+ version "3.14.2"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.2.tgz#d7dd6a46ca57214f54a2d0a43cad0f35db82ac99"
+ integrity sha512-rtPMlmcO4agTUfz10CbgJ1k6UAoXM2gWb3GoMPPZB/+/Ackf8lNWk11K4rYi2D0apgoFRLtQOZhb+/iGNJq26A==
+
+uid2@0.0.x:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.4.tgz#033f3b1d5d32505f5ce5f888b9f3b667123c0a44"
+ integrity sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==
+
unbox-primitive@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
@@ -10964,7 +11709,7 @@ util.promisify@^1.0.0, util.promisify@^1.0.1:
has-symbols "^1.0.1"
object.getownpropertydescriptors "^2.1.1"
-utils-merge@1.0.1:
+utils-merge@1.0.1, 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=
@@ -11036,9 +11781,9 @@ verror@1.10.0:
extsprintf "^1.2.0"
vm2@^3.9.3:
- version "3.9.3"
- resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.3.tgz#29917f6cc081cc43a3f580c26c5b553fd3c91f40"
- integrity sha512-smLS+18RjXYMl9joyJxMNI9l4w7biW8ilSDaVRvFBDwOH8P0BK1ognFQTpg0wyQ6wIKLTblHJvROW692L/E53Q==
+ version "3.9.4"
+ resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.4.tgz#2e118290fefe7bd8ea09ebe2f5faf53730dbddaa"
+ integrity sha512-sOdharrJ7KEePIpHekiWaY1DwgueuiBeX/ZBJUPgETsVlJsXuEx0K0/naATq2haFvJrvZnRiORQRubR0b7Ye6g==
vuvuzela@1.0.3:
version "1.0.3"
@@ -11066,6 +11811,14 @@ walker@^1.0.7, walker@~1.0.5:
dependencies:
makeerror "1.0.x"
+webfinger@^0.4.2:
+ version "0.4.2"
+ resolved "https://registry.yarnpkg.com/webfinger/-/webfinger-0.4.2.tgz#3477a6d97799461896039fcffc650b73468ee76d"
+ integrity sha1-NHem2XeZRhiWA5/P/GULc0aO520=
+ dependencies:
+ step "0.0.x"
+ xml2js "0.1.x"
+
webidl-conversions@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad"
@@ -11162,6 +11915,11 @@ 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=
+
wrap-ansi@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
@@ -11260,6 +12018,13 @@ xml-parse-from-string@^1.0.0:
resolved "https://registry.yarnpkg.com/xml-parse-from-string/-/xml-parse-from-string-1.0.1.tgz#a9029e929d3dbcded169f3c6e28238d95a5d5a28"
integrity sha1-qQKekp09vN7RafPG4oI42VpdWig=
+xml2js@0.1.x:
+ version "0.1.14"
+ resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.1.14.tgz#5274e67f5a64c5f92974cd85139e0332adc6b90c"
+ integrity sha1-UnTmf1pkxfkpdM2FE54DMq3GuQw=
+ dependencies:
+ sax ">=0.1.1"
+
xml2js@0.4.19:
version "0.4.19"
resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.4.19.tgz#686c20f213209e94abf0d1bcf1efaa291c7827a7"
@@ -11398,6 +12163,11 @@ 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"
@@ -11408,7 +12178,7 @@ yn@3.1.1:
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
-zlib@1.0.5:
+zlib@1.0.5, zlib@^1.0.5:
version "1.0.5"
resolved "https://registry.yarnpkg.com/zlib/-/zlib-1.0.5.tgz#6e7c972fc371c645a6afb03ab14769def114fcc0"
integrity sha1-bnyXL8NxxkWmr7A6sUdp3vEU/MA=
diff --git a/packages/string-templates/package.json b/packages/string-templates/package.json
index a3b90b5951..3a7268920f 100644
--- a/packages/string-templates/package.json
+++ b/packages/string-templates/package.json
@@ -1,6 +1,6 @@
{
"name": "@budibase/string-templates",
- "version": "0.9.173-alpha.3",
+ "version": "0.9.176-alpha.3",
"description": "Handlebars wrapper for Budibase templating.",
"main": "src/index.cjs",
"module": "dist/bundle.mjs",
diff --git a/packages/string-templates/src/helpers/index.js b/packages/string-templates/src/helpers/index.js
index 201ecb83da..b43fef44dc 100644
--- a/packages/string-templates/src/helpers/index.js
+++ b/packages/string-templates/src/helpers/index.js
@@ -31,7 +31,7 @@ const HELPERS = [
}
// null/undefined values produce bad results
if (value == null || typeof value !== "string") {
- return value || ""
+ return value == null ? "" : value
}
if (value && value.string) {
value = value.string
diff --git a/packages/string-templates/src/index.js b/packages/string-templates/src/index.js
index 590469fd5d..2523b763ba 100644
--- a/packages/string-templates/src/index.js
+++ b/packages/string-templates/src/index.js
@@ -6,6 +6,7 @@ const manifest = require("../manifest.json")
const hbsInstance = handlebars.create()
registerAll(hbsInstance)
+const hbsInstanceNoHelpers = handlebars.create()
/**
* utility function to check if the object is valid
@@ -24,17 +25,30 @@ function testObject(object) {
* @param {object|array} object The input structure which is to be recursed, it is important to note that
* if the structure contains any cycles then this will fail.
* @param {object} context The context that handlebars should fill data from.
+ * @param {object} opts optional - specify some options for processing.
* @returns {Promise} The structure input, as fully updated as possible.
*/
-module.exports.processObject = async (object, context) => {
+module.exports.processObject = async (
+ object,
+ context,
+ opts = { noHelpers: false }
+) => {
testObject(object)
for (let key of Object.keys(object || {})) {
if (object[key] != null) {
let val = object[key]
if (typeof val === "string") {
- object[key] = await module.exports.processString(object[key], context)
+ object[key] = await module.exports.processString(
+ object[key],
+ context,
+ opts
+ )
} else if (typeof val === "object") {
- object[key] = await module.exports.processObject(object[key], context)
+ object[key] = await module.exports.processObject(
+ object[key],
+ context,
+ opts
+ )
}
}
}
@@ -46,11 +60,16 @@ module.exports.processObject = async (object, context) => {
* then nothing will occur.
* @param {string} string The template string which is the filled from the context object.
* @param {object} context An object of information which will be used to enrich the string.
+ * @param {object} opts optional - specify some options for processing.
* @returns {Promise} The enriched string, all templates should have been replaced if they can be.
*/
-module.exports.processString = async (string, context) => {
+module.exports.processString = async (
+ string,
+ context,
+ opts = { noHelpers: false }
+) => {
// TODO: carry out any async calls before carrying out async call
- return module.exports.processStringSync(string, context)
+ return module.exports.processStringSync(string, context, opts)
}
/**
@@ -59,16 +78,21 @@ module.exports.processString = async (string, context) => {
* @param {object|array} object The input structure which is to be recursed, it is important to note that
* if the structure contains any cycles then this will fail.
* @param {object} context The context that handlebars should fill data from.
+ * @param {object} opts optional - specify some options for processing.
* @returns {object|array} The structure input, as fully updated as possible.
*/
-module.exports.processObjectSync = (object, context) => {
+module.exports.processObjectSync = (
+ object,
+ context,
+ opts = { noHelpers: false }
+) => {
testObject(object)
for (let key of Object.keys(object || {})) {
let val = object[key]
if (typeof val === "string") {
- object[key] = module.exports.processStringSync(object[key], context)
+ object[key] = module.exports.processStringSync(object[key], context, opts)
} else if (typeof val === "object") {
- object[key] = module.exports.processObjectSync(object[key], context)
+ object[key] = module.exports.processObjectSync(object[key], context, opts)
}
}
return object
@@ -79,9 +103,14 @@ module.exports.processObjectSync = (object, context) => {
* then nothing will occur. This is a pure sync call and therefore does not have the full functionality of the async call.
* @param {string} string The template string which is the filled from the context object.
* @param {object} context An object of information which will be used to enrich the string.
+ * @param {object} opts optional - specify some options for processing.
* @returns {string} The enriched string, all templates should have been replaced if they can be.
*/
-module.exports.processStringSync = (string, context) => {
+module.exports.processStringSync = (
+ string,
+ context,
+ opts = { noHelpers: false }
+) => {
if (!exports.isValid(string)) {
return string
}
@@ -91,9 +120,13 @@ module.exports.processStringSync = (string, context) => {
throw "Cannot process non-string types."
}
try {
- string = processors.preprocess(string)
+ const noHelpers = opts && opts.noHelpers
+ // finalising adds a helper, can't do this with no helpers
+ const shouldFinalise = !noHelpers
+ string = processors.preprocess(string, shouldFinalise)
// this does not throw an error when template can't be fulfilled, have to try correct beforehand
- const template = hbsInstance.compile(string, {
+ const instance = noHelpers ? hbsInstanceNoHelpers : hbsInstance
+ const template = instance.compile(string, {
strict: false,
})
return processors.postprocess(
@@ -119,9 +152,10 @@ module.exports.makePropSafe = property => {
/**
* Checks whether or not a template string contains totally valid syntax (simply tries running it)
* @param string The string to test for valid syntax - this may contain no templates and will be considered valid.
+ * @param opts optional - specify some options for processing.
* @returns {boolean} Whether or not the input string is valid.
*/
-module.exports.isValid = string => {
+module.exports.isValid = (string, opts = { noHelpers: false }) => {
const validCases = [
"string",
"number",
@@ -135,7 +169,8 @@ module.exports.isValid = string => {
// don't really need a real context to check if its valid
const context = {}
try {
- hbsInstance.compile(processors.preprocess(string, false))(context)
+ const instance = opts && opts.noHelpers ? hbsInstanceNoHelpers : hbsInstance
+ instance.compile(processors.preprocess(string, false))(context)
return true
} catch (err) {
const msg = err && err.message ? err.message : err
diff --git a/packages/string-templates/test/basic.spec.js b/packages/string-templates/test/basic.spec.js
index 2e63ce8a5f..b437e386fc 100644
--- a/packages/string-templates/test/basic.spec.js
+++ b/packages/string-templates/test/basic.spec.js
@@ -125,6 +125,18 @@ describe("check the utility functions", () => {
})
})
+describe("check falsy values", () => {
+ it("should get a zero out when context contains it", async () => {
+ const output = await processString("{{ number }}", { number: 0 })
+ expect(output).toEqual("0")
+ })
+
+ it("should get false out when context contains it", async () => {
+ const output = await processString("{{ bool }}", { bool: false })
+ expect(output).toEqual("false")
+ })
+})
+
describe("check manifest", () => {
it("should be able to retrieve the manifest", () => {
const manifest = getManifest()
diff --git a/packages/string-templates/test/helpers.spec.js b/packages/string-templates/test/helpers.spec.js
index b380fd9315..2cf9310638 100644
--- a/packages/string-templates/test/helpers.spec.js
+++ b/packages/string-templates/test/helpers.spec.js
@@ -11,6 +11,15 @@ describe("test the custom helpers we have applied", () => {
})
})
+describe("test that it can run without helpers", () => {
+ it("should be able to run without helpers", async () => {
+ const output = await processString("{{ avg 1 1 1 }}", {}, { noHelpers: true })
+ const valid = await processString("{{ avg 1 1 1 }}", {})
+ expect(valid).toBe("1")
+ expect(output).toBe("Invalid Binding")
+ })
+})
+
describe("test the math helpers", () => {
it("should be able to produce an absolute", async () => {
const output = await processString("{{abs a}}", {
@@ -267,6 +276,7 @@ describe("test the comparison helpers", () => {
)
expect(output).toBe("Success")
}
+
it("should allow use of the lt helper", async () => {
await compare("lt", 10, 15)
})
diff --git a/packages/worker/package.json b/packages/worker/package.json
index cf489d2d98..8d1c7141b4 100644
--- a/packages/worker/package.json
+++ b/packages/worker/package.json
@@ -1,7 +1,7 @@
{
"name": "@budibase/worker",
"email": "hi@budibase.com",
- "version": "0.9.173-alpha.3",
+ "version": "0.9.176-alpha.3",
"description": "Budibase background service",
"main": "src/index.js",
"repository": {
@@ -29,8 +29,8 @@
"author": "Budibase",
"license": "AGPL-3.0-or-later",
"dependencies": {
- "@budibase/auth": "^0.9.173-alpha.3",
- "@budibase/string-templates": "^0.9.173-alpha.3",
+ "@budibase/auth": "^0.9.176-alpha.3",
+ "@budibase/string-templates": "^0.9.176-alpha.3",
"@koa/router": "^8.0.0",
"@sentry/node": "^6.0.0",
"@techpass/passport-openidconnect": "^0.3.0",