backend-core typescript building successfully

This commit is contained in:
Rory Powell 2022-04-28 22:39:21 +01:00
parent 01551fa009
commit cfa75a8af3
10 changed files with 234 additions and 127 deletions

View File

@ -3,9 +3,11 @@
"version": "1.0.126-alpha.0", "version": "1.0.126-alpha.0",
"description": "Budibase backend core libraries used in server and worker", "description": "Budibase backend core libraries used in server and worker",
"main": "src/index.js", "main": "src/index.js",
"types": "dist/src/index.d.ts",
"author": "Budibase", "author": "Budibase",
"license": "GPL-3.0", "license": "GPL-3.0",
"scripts": { "scripts": {
"build": "rimraf dist/ && tsc -p tsconfig.build.json",
"test": "jest", "test": "jest",
"test:watch": "jest --watchAll" "test:watch": "jest --watchAll"
}, },
@ -39,6 +41,10 @@
] ]
}, },
"devDependencies": { "devDependencies": {
"@types/jest": "^27.4.1",
"@types/node": "^15.12.4",
"@types/node-fetch": "^2.6.1",
"typescript": "^4.5.5",
"ioredis-mock": "^5.5.5", "ioredis-mock": "^5.5.5",
"jest": "^26.6.3", "jest": "^26.6.3",
"pouchdb-adapter-memory": "^7.2.2", "pouchdb-adapter-memory": "^7.2.2",

View File

@ -1,12 +1,16 @@
const { dangerousGetDB, closeDB } = require(".") import { dangerousGetDB, closeDB } from "."
class Replication { class Replication {
source: any
target: any
replication: any
/** /**
* *
* @param {String} source - the DB you want to replicate or rollback to * @param {String} source - the DB you want to replicate or rollback to
* @param {String} target - the DB you want to replicate to, or rollback from * @param {String} target - the DB you want to replicate to, or rollback from
*/ */
constructor({ source, target }) { constructor({ source, target }: any) {
this.source = dangerousGetDB(source) this.source = dangerousGetDB(source)
this.target = dangerousGetDB(target) this.target = dangerousGetDB(target)
} }
@ -15,17 +19,17 @@ class Replication {
return Promise.all([closeDB(this.source), closeDB(this.target)]) return Promise.all([closeDB(this.source), closeDB(this.target)])
} }
promisify(operation, opts = {}) { promisify(operation: any, opts = {}) {
return new Promise(resolve => { return new Promise(resolve => {
operation(this.target, opts) operation(this.target, opts)
.on("denied", function (err) { .on("denied", function (err: any) {
// a document failed to replicate (e.g. due to permissions) // a document failed to replicate (e.g. due to permissions)
throw new Error(`Denied: Document failed to replicate ${err}`) throw new Error(`Denied: Document failed to replicate ${err}`)
}) })
.on("complete", function (info) { .on("complete", function (info: any) {
return resolve(info) return resolve(info)
}) })
.on("error", function (err) { .on("error", function (err: any) {
throw new Error(`Replication Error: ${err}`) throw new Error(`Replication Error: ${err}`)
}) })
}) })
@ -64,4 +68,4 @@ class Replication {
} }
} }
module.exports = Replication export default Replication

View File

@ -1,47 +1,26 @@
const { newid } = require("../hashing") import { newid } from "../hashing"
const Replication = require("./Replication") import { DEFAULT_TENANT_ID, Configs } from "../constants"
const { DEFAULT_TENANT_ID, Configs } = require("../constants") import * as env from "../environment"
const env = require("../environment") import { SEPARATOR, DocumentTypes } from "./constants"
const { import { getTenantId, getGlobalDBName } from "../tenancy"
StaticDatabases, import fetch from "node-fetch"
SEPARATOR, import { doWithDB, allDbs } from "./index"
DocumentTypes, import { getCouchUrl } from "./pouch"
APP_PREFIX, import { getAppMetadata } from "../cache/appMetadata"
APP_DEV, import { checkSlashesInUrl } from "../helpers"
} = require("./constants") import { isDevApp, isDevAppID } from "./conversions"
const { getTenantId, getGlobalDBName } = require("../tenancy")
const fetch = require("node-fetch")
const { doWithDB, allDbs } = require("./index")
const { getCouchUrl } = require("./pouch")
const { getAppMetadata } = require("../cache/appMetadata")
const { checkSlashesInUrl } = require("../helpers")
const {
isDevApp,
isProdAppID,
isDevAppID,
getDevelopmentAppID,
getProdAppID,
} = require("./conversions")
const UNICODE_MAX = "\ufff0" const UNICODE_MAX = "\ufff0"
exports.ViewNames = { export const ViewNames = {
USER_BY_EMAIL: "by_email", USER_BY_EMAIL: "by_email",
BY_API_KEY: "by_api_key", BY_API_KEY: "by_api_key",
USER_BY_BUILDERS: "by_builders", USER_BY_BUILDERS: "by_builders",
} }
exports.StaticDatabases = StaticDatabases export * from "./constants"
export * from "./conversions"
exports.DocumentTypes = DocumentTypes export { default as Replication } from "./Replication"
exports.APP_PREFIX = APP_PREFIX
exports.APP_DEV = exports.APP_DEV_PREFIX = APP_DEV
exports.SEPARATOR = SEPARATOR
exports.isDevApp = isDevApp
exports.isProdAppID = isProdAppID
exports.isDevAppID = isDevAppID
exports.getDevelopmentAppID = getDevelopmentAppID
exports.getProdAppID = getProdAppID
/** /**
* If creating DB allDocs/query params with only a single top level ID this can be used, this * If creating DB allDocs/query params with only a single top level ID this can be used, this
@ -55,7 +34,11 @@ exports.getProdAppID = getProdAppID
* @param {object} otherProps Add any other properties onto the request, e.g. include_docs. * @param {object} otherProps Add any other properties onto the request, e.g. include_docs.
* @returns {object} Parameters which can then be used with an allDocs request. * @returns {object} Parameters which can then be used with an allDocs request.
*/ */
function getDocParams(docType, docId = null, otherProps = {}) { export function getDocParams(
docType: any,
docId: any = null,
otherProps: any = {}
) {
if (docId == null) { if (docId == null) {
docId = "" docId = ""
} }
@ -65,20 +48,19 @@ function getDocParams(docType, docId = null, otherProps = {}) {
endkey: `${docType}${SEPARATOR}${docId}${UNICODE_MAX}`, endkey: `${docType}${SEPARATOR}${docId}${UNICODE_MAX}`,
} }
} }
exports.getDocParams = getDocParams
/** /**
* Generates a new workspace ID. * Generates a new workspace ID.
* @returns {string} The new workspace ID which the workspace doc can be stored under. * @returns {string} The new workspace ID which the workspace doc can be stored under.
*/ */
exports.generateWorkspaceID = () => { export function generateWorkspaceID() {
return `${DocumentTypes.WORKSPACE}${SEPARATOR}${newid()}` return `${DocumentTypes.WORKSPACE}${SEPARATOR}${newid()}`
} }
/** /**
* Gets parameters for retrieving workspaces. * Gets parameters for retrieving workspaces.
*/ */
exports.getWorkspaceParams = (id = "", otherProps = {}) => { export function getWorkspaceParams(id = "", otherProps = {}) {
return { return {
...otherProps, ...otherProps,
startkey: `${DocumentTypes.WORKSPACE}${SEPARATOR}${id}`, startkey: `${DocumentTypes.WORKSPACE}${SEPARATOR}${id}`,
@ -90,14 +72,14 @@ exports.getWorkspaceParams = (id = "", otherProps = {}) => {
* Generates a new global user ID. * Generates a new global user ID.
* @returns {string} The new user ID which the user doc can be stored under. * @returns {string} The new user ID which the user doc can be stored under.
*/ */
exports.generateGlobalUserID = id => { export function generateGlobalUserID(id: any) {
return `${DocumentTypes.USER}${SEPARATOR}${id || newid()}` return `${DocumentTypes.USER}${SEPARATOR}${id || newid()}`
} }
/** /**
* Gets parameters for retrieving users. * Gets parameters for retrieving users.
*/ */
exports.getGlobalUserParams = (globalId, otherProps = {}) => { export function getGlobalUserParams(globalId: any, otherProps = {}) {
if (!globalId) { if (!globalId) {
globalId = "" globalId = ""
} }
@ -112,14 +94,18 @@ exports.getGlobalUserParams = (globalId, otherProps = {}) => {
* Generates a template ID. * Generates a template ID.
* @param ownerId The owner/user of the template, this could be global or a workspace level. * @param ownerId The owner/user of the template, this could be global or a workspace level.
*/ */
exports.generateTemplateID = ownerId => { export function generateTemplateID(ownerId: any) {
return `${DocumentTypes.TEMPLATE}${SEPARATOR}${ownerId}${SEPARATOR}${newid()}` return `${DocumentTypes.TEMPLATE}${SEPARATOR}${ownerId}${SEPARATOR}${newid()}`
} }
/** /**
* Gets parameters for retrieving templates. Owner ID must be specified, either global or a workspace level. * Gets parameters for retrieving templates. Owner ID must be specified, either global or a workspace level.
*/ */
exports.getTemplateParams = (ownerId, templateId, otherProps = {}) => { export function getTemplateParams(
ownerId: any,
templateId: any,
otherProps = {}
) {
if (!templateId) { if (!templateId) {
templateId = "" templateId = ""
} }
@ -140,18 +126,18 @@ exports.getTemplateParams = (ownerId, templateId, otherProps = {}) => {
* Generates a new role ID. * Generates a new role ID.
* @returns {string} The new role ID which the role doc can be stored under. * @returns {string} The new role ID which the role doc can be stored under.
*/ */
exports.generateRoleID = id => { export function generateRoleID(id: any) {
return `${DocumentTypes.ROLE}${SEPARATOR}${id || newid()}` return `${DocumentTypes.ROLE}${SEPARATOR}${id || newid()}`
} }
/** /**
* Gets parameters for retrieving a role, this is a utility function for the getDocParams function. * Gets parameters for retrieving a role, this is a utility function for the getDocParams function.
*/ */
exports.getRoleParams = (roleId = null, otherProps = {}) => { export function getRoleParams(roleId = null, otherProps = {}) {
return getDocParams(DocumentTypes.ROLE, roleId, otherProps) return getDocParams(DocumentTypes.ROLE, roleId, otherProps)
} }
exports.getStartEndKeyURL = (base, baseKey, tenantId = null) => { export function getStartEndKeyURL(base: any, baseKey: any, tenantId = null) {
const tenancy = tenantId ? `${SEPARATOR}${tenantId}` : "" const tenancy = tenantId ? `${SEPARATOR}${tenantId}` : ""
return `${base}?startkey="${baseKey}${tenancy}"&endkey="${baseKey}${tenancy}${UNICODE_MAX}"` return `${base}?startkey="${baseKey}${tenancy}"&endkey="${baseKey}${tenancy}${UNICODE_MAX}"`
} }
@ -162,14 +148,14 @@ exports.getStartEndKeyURL = (base, baseKey, tenantId = null) => {
* opts.efficient can be provided to make sure this call is always quick in a multi-tenant environment, * opts.efficient can be provided to make sure this call is always quick in a multi-tenant environment,
* but it may not be 100% accurate in full efficiency mode (some tenantless apps may be missed). * but it may not be 100% accurate in full efficiency mode (some tenantless apps may be missed).
*/ */
exports.getAllDbs = async (opts = { efficient: false }) => { export async function getAllDbs(opts = { efficient: false }) {
const efficient = opts && opts.efficient const efficient = opts && opts.efficient
// specifically for testing we use the pouch package for this // specifically for testing we use the pouch package for this
if (env.isTest()) { if (env.isTest()) {
return allDbs() return allDbs()
} }
let dbs = [] let dbs: any = []
async function addDbs(url) { async function addDbs(url: any) {
const response = await fetch(checkSlashesInUrl(encodeURI(url))) const response = await fetch(checkSlashesInUrl(encodeURI(url)))
if (response.status === 200) { if (response.status === 200) {
let json = await response.json() let json = await response.json()
@ -189,13 +175,9 @@ exports.getAllDbs = async (opts = { efficient: false }) => {
await addDbs(couchUrl) await addDbs(couchUrl)
} else { } else {
// get prod apps // get prod apps
await addDbs( await addDbs(getStartEndKeyURL(couchUrl, DocumentTypes.APP, tenantId))
exports.getStartEndKeyURL(couchUrl, DocumentTypes.APP, tenantId)
)
// get dev apps // get dev apps
await addDbs( await addDbs(getStartEndKeyURL(couchUrl, DocumentTypes.APP_DEV, tenantId))
exports.getStartEndKeyURL(couchUrl, DocumentTypes.APP_DEV, tenantId)
)
// add global db name // add global db name
dbs.push(getGlobalDBName(tenantId)) dbs.push(getGlobalDBName(tenantId))
} }
@ -208,13 +190,13 @@ exports.getAllDbs = async (opts = { efficient: false }) => {
* *
* @return {Promise<object[]>} returns the app information document stored in each app database. * @return {Promise<object[]>} returns the app information document stored in each app database.
*/ */
exports.getAllApps = async ({ dev, all, idsOnly, efficient } = {}) => { export async function getAllApps({ dev, all, idsOnly, efficient }: any = {}) {
let tenantId = getTenantId() let tenantId = getTenantId()
if (!env.MULTI_TENANCY && !tenantId) { if (!env.MULTI_TENANCY && !tenantId) {
tenantId = DEFAULT_TENANT_ID tenantId = DEFAULT_TENANT_ID
} }
let dbs = await exports.getAllDbs({ efficient }) let dbs = await getAllDbs({ efficient })
const appDbNames = dbs.filter(dbName => { const appDbNames = dbs.filter((dbName: any) => {
const split = dbName.split(SEPARATOR) const split = dbName.split(SEPARATOR)
// it is an app, check the tenantId // it is an app, check the tenantId
if (split[0] === DocumentTypes.APP) { if (split[0] === DocumentTypes.APP) {
@ -234,7 +216,7 @@ exports.getAllApps = async ({ dev, all, idsOnly, efficient } = {}) => {
if (idsOnly) { if (idsOnly) {
return appDbNames return appDbNames
} }
const appPromises = appDbNames.map(app => const appPromises = appDbNames.map((app: any) =>
// skip setup otherwise databases could be re-created // skip setup otherwise databases could be re-created
getAppMetadata(app) getAppMetadata(app)
) )
@ -243,17 +225,19 @@ exports.getAllApps = async ({ dev, all, idsOnly, efficient } = {}) => {
} else { } else {
const response = await Promise.allSettled(appPromises) const response = await Promise.allSettled(appPromises)
const apps = response const apps = response
.filter(result => result.status === "fulfilled" && result.value != null) .filter(
.map(({ value }) => value) (result: any) => result.status === "fulfilled" && result.value != null
)
.map(({ value }: any) => value)
if (!all) { if (!all) {
return apps.filter(app => { return apps.filter((app: any) => {
if (dev) { if (dev) {
return isDevApp(app) return isDevApp(app)
} }
return !isDevApp(app) return !isDevApp(app)
}) })
} else { } else {
return apps.map(app => ({ return apps.map((app: any) => ({
...app, ...app,
status: isDevApp(app) ? "development" : "published", status: isDevApp(app) ? "development" : "published",
})) }))
@ -264,26 +248,26 @@ exports.getAllApps = async ({ dev, all, idsOnly, efficient } = {}) => {
/** /**
* Utility function for getAllApps but filters to production apps only. * Utility function for getAllApps but filters to production apps only.
*/ */
exports.getProdAppIDs = async () => { export async function getProdAppIDs() {
return (await exports.getAllApps({ idsOnly: true })).filter( return (await getAllApps({ idsOnly: true })).filter(
id => !exports.isDevAppID(id) (id: any) => !isDevAppID(id)
) )
} }
/** /**
* Utility function for the inverse of above. * Utility function for the inverse of above.
*/ */
exports.getDevAppIDs = async () => { export async function getDevAppIDs() {
return (await exports.getAllApps({ idsOnly: true })).filter(id => return (await getAllApps({ idsOnly: true })).filter((id: any) =>
exports.isDevAppID(id) isDevAppID(id)
) )
} }
exports.dbExists = async dbName => { export async function dbExists(dbName: any) {
let exists = false let exists = false
return doWithDB( return doWithDB(
dbName, dbName,
async db => { async (db: any) => {
try { try {
// check if database exists // check if database exists
const info = await db.info() const info = await db.info()
@ -303,7 +287,7 @@ exports.dbExists = async dbName => {
* Generates a new configuration ID. * Generates a new configuration ID.
* @returns {string} The new configuration ID which the config doc can be stored under. * @returns {string} The new configuration ID which the config doc can be stored under.
*/ */
const generateConfigID = ({ type, workspace, user }) => { export const generateConfigID = ({ type, workspace, user }: any) => {
const scope = [type, workspace, user].filter(Boolean).join(SEPARATOR) const scope = [type, workspace, user].filter(Boolean).join(SEPARATOR)
return `${DocumentTypes.CONFIG}${SEPARATOR}${scope}` return `${DocumentTypes.CONFIG}${SEPARATOR}${scope}`
@ -312,7 +296,10 @@ const generateConfigID = ({ type, workspace, user }) => {
/** /**
* Gets parameters for retrieving configurations. * Gets parameters for retrieving configurations.
*/ */
const getConfigParams = ({ type, workspace, user }, otherProps = {}) => { export const getConfigParams = (
{ type, workspace, user }: any,
otherProps = {}
) => {
const scope = [type, workspace, user].filter(Boolean).join(SEPARATOR) const scope = [type, workspace, user].filter(Boolean).join(SEPARATOR)
return { return {
@ -326,7 +313,7 @@ const getConfigParams = ({ type, workspace, user }, otherProps = {}) => {
* Generates a new dev info document ID - this is scoped to a user. * Generates a new dev info document ID - this is scoped to a user.
* @returns {string} The new dev info ID which info for dev (like api key) can be stored under. * @returns {string} The new dev info ID which info for dev (like api key) can be stored under.
*/ */
const generateDevInfoID = userId => { export const generateDevInfoID = (userId: any) => {
return `${DocumentTypes.DEV_INFO}${SEPARATOR}${userId}` return `${DocumentTypes.DEV_INFO}${SEPARATOR}${userId}`
} }
@ -336,7 +323,10 @@ const generateDevInfoID = userId => {
* @param {Object} scopes - the type, workspace and userID scopes of the configuration. * @param {Object} scopes - the type, workspace and userID scopes of the configuration.
* @returns The most granular configuration document based on the scope. * @returns The most granular configuration document based on the scope.
*/ */
const getScopedFullConfig = async function (db, { type, user, workspace }) { export const getScopedFullConfig = async function (
db: any,
{ type, user, workspace }: any
) {
const response = await db.allDocs( const response = await db.allDocs(
getConfigParams( getConfigParams(
{ type, user, workspace }, { type, user, workspace },
@ -346,7 +336,7 @@ const getScopedFullConfig = async function (db, { type, user, workspace }) {
) )
) )
function determineScore(row) { function determineScore(row: any) {
const config = row.doc const config = row.doc
// Config is specific to a user and a workspace // Config is specific to a user and a workspace
@ -367,7 +357,7 @@ const getScopedFullConfig = async function (db, { type, user, workspace }) {
// Find the config with the most granular scope based on context // Find the config with the most granular scope based on context
let scopedConfig = response.rows.sort( let scopedConfig = response.rows.sort(
(a, b) => determineScore(a) - determineScore(b) (a: any, b: any) => determineScore(a) - determineScore(b)
)[0] )[0]
// custom logic for settings doc // custom logic for settings doc
@ -391,7 +381,7 @@ const getScopedFullConfig = async function (db, { type, user, workspace }) {
return scopedConfig && scopedConfig.doc return scopedConfig && scopedConfig.doc
} }
const getPlatformUrl = async settings => { export const getPlatformUrl = async (settings?: any) => {
let platformUrl = env.PLATFORM_URL || "http://localhost:10000" let platformUrl = env.PLATFORM_URL || "http://localhost:10000"
if (!env.SELF_HOSTED && env.MULTI_TENANCY) { if (!env.SELF_HOSTED && env.MULTI_TENANCY) {
@ -410,15 +400,7 @@ const getPlatformUrl = async settings => {
return platformUrl return platformUrl
} }
async function getScopedConfig(db, params) { export async function getScopedConfig(db: any, params: any) {
const configDoc = await getScopedFullConfig(db, params) const configDoc = await getScopedFullConfig(db, params)
return configDoc && configDoc.config ? configDoc.config : configDoc return configDoc && configDoc.config ? configDoc.config : configDoc
} }
exports.Replication = Replication
exports.getScopedConfig = getScopedConfig
exports.generateConfigID = generateConfigID
exports.getConfigParams = getConfigParams
exports.getScopedFullConfig = getScopedFullConfig
exports.generateDevInfoID = generateDevInfoID
exports.getPlatformUrl = getPlatformUrl

View File

@ -1,16 +1,16 @@
const sanitize = require("sanitize-s3-objectkey") import sanitize from "sanitize-s3-objectkey"
const AWS = require("aws-sdk") import AWS from "aws-sdk"
const stream = require("stream") import stream from "stream"
const fetch = require("node-fetch") import fetch from "node-fetch"
const tar = require("tar-fs") import tar from "tar-fs"
const zlib = require("zlib") import zlib from "zlib"
const { promisify } = require("util") import { promisify } from "util"
const { join } = require("path") import { join } from "path"
const fs = require("fs") import fs from "fs"
const env = require("../environment") import env from "../environment"
const { budibaseTempDir, ObjectStoreBuckets } = require("./utils") import { budibaseTempDir, ObjectStoreBuckets } from "./utils"
const { v4 } = require("uuid") import { v4 } from "uuid"
const { APP_PREFIX, APP_DEV_PREFIX } = require("../db/utils") import { APP_PREFIX, APP_DEV_PREFIX } from "../db/utils"
const streamPipeline = promisify(stream.pipeline) const streamPipeline = promisify(stream.pipeline)
// use this as a temporary store of buckets that are being created // use this as a temporary store of buckets that are being created

View File

@ -0,0 +1,10 @@
{
// Used for building with tsc
"extends": "./tsconfig.json",
"exclude": [
"node_modules",
"**/*.json",
"**/*.spec.js",
"**/*.spec.ts"
]
}

View File

@ -0,0 +1,35 @@
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"lib": ["es2020"],
// Tells TypeScript to read JS files, as
// normally they are ignored as source files
"allowJs": true,
// Generate d.ts files
"declaration": true,
// go to js file when using IDE functions like
// "Go to Definition" in VSCode
"declarationMap": true,
"sourceMap": true,
// Types should go into this directory.
// Removing this would place the .d.ts files
// next to the .js files
"outDir": "dist",
"strict": true,
"noImplicitAny": true,
"esModuleInterop": true,
"resolveJsonModule": true,
"incremental": true,
"types": [ "node", "jest"],
},
"include": [
"**/*.js",
"**/*.ts",
],
"exclude": [
"node_modules",
"**/*.spec.js",
// "**/*.spec.ts" // don't exclude spec.ts files for editor support
]
}

View File

@ -586,11 +586,32 @@
dependencies: dependencies:
"@types/istanbul-lib-report" "*" "@types/istanbul-lib-report" "*"
"@types/jest@^27.4.1":
version "27.4.1"
resolved "https://registry.yarnpkg.com/@types/jest/-/jest-27.4.1.tgz#185cbe2926eaaf9662d340cc02e548ce9e11ab6d"
integrity sha512-23iPJADSmicDVrWk+HT58LMJtzLAnB2AgIzplQuq/bSrGaxCrlvRFjGbXmamnnk/mAmCdLStiGqggu28ocUyiw==
dependencies:
jest-matcher-utils "^27.0.0"
pretty-format "^27.0.0"
"@types/node-fetch@^2.6.1":
version "2.6.1"
resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.1.tgz#8f127c50481db65886800ef496f20bbf15518975"
integrity sha512-oMqjURCaxoSIsHSr1E47QHzbmzNR5rK8McHuNb11BOM9cHcIK3Avy0s/b2JlXHoQGTYS3NsvWzV1M0iK7l0wbA==
dependencies:
"@types/node" "*"
form-data "^3.0.0"
"@types/node@*": "@types/node@*":
version "16.11.7" version "16.11.7"
resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.7.tgz#36820945061326978c42a01e56b61cd223dfdc42" resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.7.tgz#36820945061326978c42a01e56b61cd223dfdc42"
integrity sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw== integrity sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw==
"@types/node@^15.12.4":
version "15.14.9"
resolved "https://registry.yarnpkg.com/@types/node/-/node-15.14.9.tgz#bc43c990c3c9be7281868bbc7b8fdd6e2b57adfa"
integrity sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==
"@types/normalize-package-data@^2.4.0": "@types/normalize-package-data@^2.4.0":
version "2.4.1" version "2.4.1"
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
@ -732,6 +753,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0:
dependencies: dependencies:
color-convert "^2.0.1" color-convert "^2.0.1"
ansi-styles@^5.0.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-5.2.0.tgz#07449690ad45777d1924ac2abb2fc8895dba836b"
integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==
anymatch@^2.0.0: anymatch@^2.0.0:
version "2.0.0" version "2.0.0"
resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb"
@ -1494,6 +1520,11 @@ diff-sequences@^26.6.2:
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-26.6.2.tgz#48ba99157de1923412eed41db6b6d4aa9ca7c0b1"
integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q== integrity sha512-Mv/TDa3nZ9sbc5soK+OoA74BsS3mL37yixCvUAQkiuA4Wz6YtwP/K47n2rv2ovzHZvoiQeA5FTQOschKkEwB0Q==
diff-sequences@^27.5.1:
version "27.5.1"
resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327"
integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==
domexception@^2.0.1: domexception@^2.0.1:
version "2.0.1" version "2.0.1"
resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304" resolved "https://registry.yarnpkg.com/domexception/-/domexception-2.0.1.tgz#fb44aefba793e1574b0af6aed2801d057529f304"
@ -2555,6 +2586,16 @@ jest-diff@^26.6.2:
jest-get-type "^26.3.0" jest-get-type "^26.3.0"
pretty-format "^26.6.2" pretty-format "^26.6.2"
jest-diff@^27.5.1:
version "27.5.1"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def"
integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==
dependencies:
chalk "^4.0.0"
diff-sequences "^27.5.1"
jest-get-type "^27.5.1"
pretty-format "^27.5.1"
jest-docblock@^26.0.0: jest-docblock@^26.0.0:
version "26.0.0" version "26.0.0"
resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-26.0.0.tgz#3e2fa20899fc928cb13bd0ff68bd3711a36889b5"
@ -2603,6 +2644,11 @@ jest-get-type@^26.3.0:
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-26.3.0.tgz#e97dc3c3f53c2b406ca7afaed4493b1d099199e0"
integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig== integrity sha512-TpfaviN1R2pQWkIihlfEanwOXK0zcxrKEE4MlU6Tn7keoXdN6/3gK/xl0yEh8DOunn5pOVGKf8hB4R9gVh04ig==
jest-get-type@^27.5.1:
version "27.5.1"
resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1"
integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==
jest-haste-map@^26.6.2: jest-haste-map@^26.6.2:
version "26.6.2" version "26.6.2"
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-26.6.2.tgz#dd7e60fe7dc0e9f911a23d79c5ff7fb5c2cafeaa"
@ -2666,6 +2712,16 @@ jest-matcher-utils@^26.6.2:
jest-get-type "^26.3.0" jest-get-type "^26.3.0"
pretty-format "^26.6.2" pretty-format "^26.6.2"
jest-matcher-utils@^27.0.0:
version "27.5.1"
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab"
integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==
dependencies:
chalk "^4.0.0"
jest-diff "^27.5.1"
jest-get-type "^27.5.1"
pretty-format "^27.5.1"
jest-message-util@^26.6.2: jest-message-util@^26.6.2:
version "26.6.2" version "26.6.2"
resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-26.6.2.tgz#58173744ad6fc0506b5d21150b9be56ef001ca07"
@ -4104,6 +4160,15 @@ pretty-format@^26.6.2:
ansi-styles "^4.0.0" ansi-styles "^4.0.0"
react-is "^17.0.1" react-is "^17.0.1"
pretty-format@^27.0.0, pretty-format@^27.5.1:
version "27.5.1"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e"
integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==
dependencies:
ansi-regex "^5.0.1"
ansi-styles "^5.0.0"
react-is "^17.0.1"
private@^0.1.6, private@~0.1.5: private@^0.1.6, private@~0.1.5:
version "0.1.8" version "0.1.8"
resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff"
@ -5041,6 +5106,11 @@ typedarray-to-buffer@^3.1.5:
dependencies: dependencies:
is-typedarray "^1.0.0" is-typedarray "^1.0.0"
typescript@^4.5.5:
version "4.6.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9"
integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==
uid2@0.0.x: uid2@0.0.x:
version "0.0.4" version "0.0.4"
resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.4.tgz#033f3b1d5d32505f5ce5f888b9f3b667123c0a44" resolved "https://registry.yarnpkg.com/uid2/-/uid2-0.0.4.tgz#033f3b1d5d32505f5ce5f888b9f3b667123c0a44"

View File

@ -1,4 +1,4 @@
declare module "@budibase/backend-core" // declare module "@budibase/backend-core"
declare module "@budibase/backend-core/tenancy" declare module "@budibase/backend-core/tenancy"
declare module "@budibase/backend-core/db" declare module "@budibase/backend-core/db"
declare module "@budibase/backend-core/context" declare module "@budibase/backend-core/context"

View File

@ -1014,10 +1014,10 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
"@budibase/backend-core@1.0.124-alpha.0": "@budibase/backend-core@1.0.126-alpha.0":
version "1.0.124-alpha.0" version "1.0.126-alpha.0"
resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-1.0.124-alpha.0.tgz#33a9408206088da49154710910dafc8088d864d2" resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-1.0.126-alpha.0.tgz#1e0968c685420592e1a7b3c12362075bd96fba57"
integrity sha512-0ZUkDeqaoXS9qyK91SjwokYEA1wUPhi48nFE0+UwBloF8i7zVDFp2kOX7VNUrUer4gLuND9BoihEdpqsdQDvAg== integrity sha512-35X/+B2IPvl6WZR0ztl6u6yz049TwEZrs4+BSp/euqRCzntVKuhfsN4dR+dDV/WGvOywrcARPCl28ubE7dLI8g==
dependencies: dependencies:
"@techpass/passport-openidconnect" "^0.3.0" "@techpass/passport-openidconnect" "^0.3.0"
aws-sdk "^2.901.0" aws-sdk "^2.901.0"
@ -1091,12 +1091,12 @@
svelte-flatpickr "^3.2.3" svelte-flatpickr "^3.2.3"
svelte-portal "^1.0.0" svelte-portal "^1.0.0"
"@budibase/pro@1.0.124-alpha.0": "@budibase/pro@1.0.126-alpha.0":
version "1.0.124-alpha.0" version "1.0.126-alpha.0"
resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-1.0.124-alpha.0.tgz#6287a51fa7c19754e44374c209c4aa3480fc3ac9" resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-1.0.126-alpha.0.tgz#b9b0d73ecbb5e878efafef3289409448a4884f19"
integrity sha512-EgMuh+XSd/9tb3Ej9EZa4Y8hgiS6fHG+tuUwUcTuP6zvHbTijQGPb9075yImUbSc10bS3o41AP2qa2/ZdZKV2w== integrity sha512-+2aSs0LicKyWu+3A+b7eZXNhaPEkVrGUVtqUmfyLiqhnYM6ICVCBQJOxYQX08fpXq++icUfHoye4Me03aKSnKw==
dependencies: dependencies:
"@budibase/backend-core" "1.0.124-alpha.0" "@budibase/backend-core" "1.0.126-alpha.0"
node-fetch "^2.6.1" node-fetch "^2.6.1"
"@budibase/standard-components@^0.9.139": "@budibase/standard-components@^0.9.139":

View File

@ -293,10 +293,10 @@
resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39"
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
"@budibase/backend-core@1.0.124-alpha.0": "@budibase/backend-core@1.0.126-alpha.0":
version "1.0.124-alpha.0" version "1.0.126-alpha.0"
resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-1.0.124-alpha.0.tgz#33a9408206088da49154710910dafc8088d864d2" resolved "https://registry.yarnpkg.com/@budibase/backend-core/-/backend-core-1.0.126-alpha.0.tgz#1e0968c685420592e1a7b3c12362075bd96fba57"
integrity sha512-0ZUkDeqaoXS9qyK91SjwokYEA1wUPhi48nFE0+UwBloF8i7zVDFp2kOX7VNUrUer4gLuND9BoihEdpqsdQDvAg== integrity sha512-35X/+B2IPvl6WZR0ztl6u6yz049TwEZrs4+BSp/euqRCzntVKuhfsN4dR+dDV/WGvOywrcARPCl28ubE7dLI8g==
dependencies: dependencies:
"@techpass/passport-openidconnect" "^0.3.0" "@techpass/passport-openidconnect" "^0.3.0"
aws-sdk "^2.901.0" aws-sdk "^2.901.0"
@ -321,12 +321,12 @@
uuid "^8.3.2" uuid "^8.3.2"
zlib "^1.0.5" zlib "^1.0.5"
"@budibase/pro@1.0.124-alpha.0": "@budibase/pro@1.0.126-alpha.0":
version "1.0.124-alpha.0" version "1.0.126-alpha.0"
resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-1.0.124-alpha.0.tgz#6287a51fa7c19754e44374c209c4aa3480fc3ac9" resolved "https://registry.yarnpkg.com/@budibase/pro/-/pro-1.0.126-alpha.0.tgz#b9b0d73ecbb5e878efafef3289409448a4884f19"
integrity sha512-EgMuh+XSd/9tb3Ej9EZa4Y8hgiS6fHG+tuUwUcTuP6zvHbTijQGPb9075yImUbSc10bS3o41AP2qa2/ZdZKV2w== integrity sha512-+2aSs0LicKyWu+3A+b7eZXNhaPEkVrGUVtqUmfyLiqhnYM6ICVCBQJOxYQX08fpXq++icUfHoye4Me03aKSnKw==
dependencies: dependencies:
"@budibase/backend-core" "1.0.124-alpha.0" "@budibase/backend-core" "1.0.126-alpha.0"
node-fetch "^2.6.1" node-fetch "^2.6.1"
"@cspotcode/source-map-consumer@0.8.0": "@cspotcode/source-map-consumer@0.8.0":