1
0
Fork 0
mirror of synced 2024-06-18 18:35:37 +12:00

further tidy up and removal

This commit is contained in:
Martin McKeaveney 2020-05-07 13:52:24 +01:00
parent 16ec3719ea
commit 87ad6647df
73 changed files with 386 additions and 1082 deletions

Binary file not shown.

12
packages/server/.eslintrc Normal file
View file

@ -0,0 +1,12 @@
{
"globals": {
"emit": true,
"key": true
},
"env": {
"node": true
},
"extends": ["eslint:recommended"],
"rules": {
}
}

Binary file not shown.

View file

@ -1 +0,0 @@
require("../../cli/src/cli")()

View file

@ -2,15 +2,16 @@
"name": "@budibase/server",
"version": "0.0.32",
"description": "Budibase Web Server",
"main": "index.js",
"main": "src/index.js",
"scripts": {
"test": "jest apps && jest builder",
"test": "jest",
"test:integration": "jest neo --runInBand",
"test:watch": "jest -w",
"initialise": "node ../cli/bin/budi init ./myapps -b local -q",
"budi": "node ../cli/bin/budi",
"dev:builder": "nodemon index",
"electron": "electron electron.js"
"dev:builder": "nodemon src/index",
"electron": "electron src/electron.js",
"lint": "eslint --fix src/"
},
"keywords": [
"budibase"
@ -46,6 +47,7 @@
"@jest/test-sequencer": "^24.8.0",
"electron": "^8.2.5",
"electron-builder": "^22.6.0",
"eslint": "^6.8.0",
"jest": "^24.8.0",
"nodemon": "^2.0.2",
"server-destroy": "^1.0.1",

View file

@ -54,7 +54,7 @@ exports.destroy = async function(ctx) {
budibaseApp.instances = budibaseApp.instances.filter(
instance => instance !== ctx.params.instanceId
)
const updatedApp = await clientDb.put(budibaseApp)
await clientDb.put(budibaseApp)
ctx.body = {
message: `Instance Database ${ctx.params.instanceId} successfully destroyed.`,

View file

@ -1,5 +1,5 @@
const supertest = require("supertest");
const app = require("../../../../app");
const app = require("../../../app");
const { createInstanceDatabase, createModel } = require("./couchTestUtils");

View file

@ -6,7 +6,6 @@ const path = require("path")
const BUDIBASE_DIR = path.join(os.homedir(), ".budibase")
const COUCH_DB_URL = process.env.COUCH_DB_URL || `leveldb://${BUDIBASE_DIR}/`
const DATABASE_TYPE = process.env.DATABASE_TYPE || "couch"
const Pouch = PouchDB.defaults({
prefix: COUCH_DB_URL,

View file

@ -2,10 +2,12 @@ const { app, BrowserWindow } = require('electron');
require("dotenv").config()
const DEV_URL = "http://localhost:4001";
function createWindow() {
app.server = require("./app")();
let win = new BrowserWindow({ width: 1920, height: 1080 });
win.loadURL('http://localhost:4001');
win.loadURL(DEV_URL);
}
app.whenReady().then(createWindow)

View file

@ -0,0 +1,7 @@
const { resolve } = require("path")
const { cwd } = require("process")
const appPackageFolder = (config, appname) =>
resolve(cwd(), config.latestPackagesFolder, appname)
module.exports.appPackageFolder = appPackageFolder

View file

@ -1,17 +0,0 @@
const app = require("./testApp")()
const authenticateMaster = require("./authenticate")
const createNewApp = require("./createNewApp")
const multipleInstances = require("./multipleInstances")
const serveui = require("./serveui")
beforeAll(async () => await app.start())
afterAll(async () => await app.destroy())
describe("authenticateMaster", () =>
authenticateMaster(app, "_master", "masterOwner"))
describe("createNewApp", () => createNewApp(app))
describe("authenticateTestApp", () =>
authenticateMaster(app, "testApp", "testAppUser1"))
describe("multipleInstances", () => multipleInstances(app))
describe("serveUi", () => serveui(app))

View file

@ -1,187 +0,0 @@
const statusCodes = require("../utilities/statusCodes")
const { readFile } = require("fs-extra")
const { timeout } = require("./helpers")
module.exports = (app, appName, userName) => {
const credentials = app.credentials[userName]
it("should return unauthorized if username is incorrect", async () => {
await app
.post(`/${appName}/api/authenticate`, {
username: "unknownuser",
password: credentials.password,
})
.expect(statusCodes.UNAUTHORIZED)
})
it("should return unauthorized if password is incorrect", async () => {
await app
.post(`/${appName}/api/authenticate`, {
username: credentials.username,
password: "incorrect_password",
})
.expect(statusCodes.UNAUTHORIZED)
})
it("should not get cookie when unauthorized", async () => {
const response = await app.post(`/${appName}/api/authenticate`, {
username: credentials.username,
password: "incorrect_password",
})
expect(response.header["set-cookie"]).toBeUndefined()
})
it("should return ok correct username and password supplied", async () => {
const response = await app
.post(`/${appName}/api/authenticate`, {
username: credentials.username,
password: credentials.password,
})
.expect(statusCodes.OK)
credentials.cookie = response.header["set-cookie"]
})
const testUserName = appName + "_test_user"
let testPassword = "test_user_password"
it("should be able to create new user with authenticated cookie", async () => {
await app
.post(`/${appName}/api/createUser`, {
user: {
name: testUserName,
accessLevels: ["owner"],
enabled: true,
},
password: testPassword,
})
.set("cookie", credentials.cookie)
.expect(statusCodes.OK)
})
let newUserCookie
it("should be able to authenticate with new user", async () => {
const responseNewUser = await app
.post(`/${appName}/api/authenticate`, {
username: testUserName,
password: testPassword,
})
.expect(statusCodes.OK)
newUserCookie = responseNewUser.header["set-cookie"]
expect(newUserCookie).toBeDefined()
expect(newUserCookie).not.toEqual(credentials.cookie)
app
.get("/_master/api/users/")
.set("cookie", newUserCookie)
.expect(statusCodes.OK)
})
it("should not be able to perform requests when user is disabled", async () => {
//HERE
await app
.post(`/${appName}/api/disableUser`, {
username: testUserName,
})
.set("cookie", credentials.cookie)
.expect(statusCodes.OK)
await app
.get(`/${appName}/api/users`)
.set("cookie", newUserCookie)
.expect(statusCodes.UNAUTHORIZED)
await app
.post(`/${appName}/api/authenticate`, {
username: testUserName,
password: testPassword,
})
.expect(statusCodes.UNAUTHORIZED)
})
it("should not be able to re-authenticate when user is disabled", async () => {
await app
.post(`/${appName}/api/authenticate`, {
username: testUserName,
password: testPassword,
})
.expect(statusCodes.UNAUTHORIZED)
})
it("should be able with re-authenticate when user is enabled again", async () => {
await app
.post(`/${appName}/api/enableUser`, {
username: testUserName,
})
.set("cookie", credentials.cookie)
.expect(statusCodes.OK)
await app
.post(`/${appName}/api/authenticate`, {
username: testUserName,
password: testPassword,
})
.expect(statusCodes.OK)
})
let testUserTempCode
it("should be able to reset password with temporary access", async () => {
await app
.post(`/${appName}/api/createTemporaryAccess`, {
username: testUserName,
})
.expect(statusCodes.OK)
testPassword = "test_user_new_password"
// the behaviour that creates the below file is async,
/// to this timeout is giving it a change to work its magic
await timeout(10)
const testUserTempCode = await readFile(
`./tests/.data/tempaccess${testUserName}`,
"utf8"
)
await app
.post(`/${appName}/api/setPasswordFromTemporaryCode`, {
username: testUserName,
tempCode: testUserTempCode,
newPassword: testPassword,
})
.expect(statusCodes.OK)
await app
.post(`/${appName}/api/authenticate`, {
username: testUserName,
password: testPassword,
})
.expect(statusCodes.OK)
})
it("should not be able to set password with used temp code", async () => {
await app
.post(`/${appName}/api/setPasswordFromTemporaryCode`, {
username: testUserName,
tempCode: testUserTempCode,
newPassword: "whatever",
})
.expect(statusCodes.OK)
await app
.post(`/${appName}/api/authenticate`, {
username: testUserName,
password: "whatever",
})
.expect(statusCodes.UNAUTHORIZED)
await app
.post(`/${appName}/api/authenticate`, {
username: testUserName,
password: testPassword,
})
.expect(statusCodes.OK)
})
}

View file

@ -1,246 +0,0 @@
const testAppDef = require("../appPackages/testApp/appDefinition.json")
const testAccessLevels = require("../appPackages/testApp/access_levels.json")
const mainPage = require("../appPackages/testApp/pages/main/page.json")
const unauthenticatedPage = require("../appPackages/testApp/pages/unauthenticated/page.json")
const testComponents = require("../appPackages/testApp/customComponents/components.json")
const testMoreComponents = require("../appPackages/testApp/moreCustomComponents/components.json")
const statusCodes = require("../utilities/statusCodes")
const screen1 = require("../appPackages/testApp/pages/main/screens/screen1.json")
const screen2 = require("../appPackages/testApp/pages/main/screens/screen2.json")
const { readJSON, pathExists, unlink, readFile } = require("fs-extra")
const { getHashedCssPaths } = require("../utilities/builder/convertCssToFiles")
const listScreens = require("../utilities/builder/listScreens")
const { getApisWithFullAccess } = require("../utilities/budibaseApi")
const app = require("./testApp")()
testComponents.textbox.name = `./customComponents/textbox`
testMoreComponents.textbox.name = `./moreCustomComponents/textbox`
let _master
const getmaster = async () => {
if (!_master)
_master = await getApisWithFullAccess({}, app.masterAppPackage)
return _master
}
beforeAll(async () => {
const testScreen = "./appPackages/testApp/pages/main/screens/newscreen.json"
const testScreenAfterMove =
"./appPackages/testApp/pages/main/screens/anotherscreen.json"
if (await pathExists(testScreen)) await unlink(testScreen)
if (await pathExists(testScreenAfterMove)) await unlink(testScreenAfterMove)
await app.start()
const response = await app
.post(`/_master/api/authenticate`, {
username: app.credentials.masterOwner.username,
password: app.credentials.masterOwner.password,
})
.expect(statusCodes.OK)
app.credentials.masterOwner.cookie = response.header["set-cookie"]
const master = await getmaster()
const newApp = master.recordApi.getNew("/applications", "application")
newApp.name = "testApp"
await app
.post(`/_master/api/record/${newApp.key}`, newApp)
.set("cookie", app.credentials.masterOwner.cookie)
.expect(statusCodes.OK)
})
afterAll(async () => await app.destroy())
it("/apppackage should get appDefinition", async () => {
const { body } = await app
.get("/_builder/api/testApp/appPackage")
.expect(statusCodes.OK)
expect(body.appDefinition).toEqual(testAppDef)
})
it("/apppackage should get access levels", async () => {
const { body } = await app
.get("/_builder/api/testApp/appPackage")
.expect(statusCodes.OK)
expect(body.accessLevels).toEqual(testAccessLevels)
})
it("/apppackage should get pages", async () => {
const { body } = await app
.get("/_builder/api/testApp/appPackage")
.expect(statusCodes.OK)
expect(body.pages).toEqual({
main: { ...mainPage, name: "main" },
unauthenticated: { ...unauthenticatedPage, name: "unauthenticated" },
})
})
it("/apppackage should get components", async () => {
const { body } = await app
.get("/_builder/api/testApp/appPackage")
.expect(statusCodes.OK)
expect(body.components.components["./customComponents/textbox"]).toBeDefined()
expect(
body.components.components["./moreCustomComponents/textbox"]
).toBeDefined()
expect(body.components.components["./customComponents/textbox"]).toEqual(
testComponents.textbox
)
expect(body.components.components["./moreCustomComponents/textbox"]).toEqual(
testMoreComponents.textbox
)
})
it("/pages/:pageName/screens should get screens", async () => {
const { body } = await app
.get("/_builder/api/testApp/pages/main/screens")
.expect(statusCodes.OK)
const expectedComponents = {
screen1: { ...screen1, name: "screen1" },
screen2: { ...screen2, name: "screen2" },
}
expect(body).toEqual(expectedComponents)
})
it("should be able to create new screen", async () => {
const newscreen = {
name: "newscreen",
props: {
_component: "@budibase/standard-component/div",
className: "something",
},
}
await app
.post("/_builder/api/testApp/pages/main/screen", newscreen)
.expect(statusCodes.OK)
const screenFile = "./appPackages/testApp/pages/main/screens/newscreen.json"
expect(await pathExists(screenFile)).toBe(true)
expect(await readJSON(screenFile)).toEqual(newscreen)
})
it("should be able to update screen", async () => {
const updatedscreen = {
name: "newscreen",
props: {
_component: "@budibase/standard-component/div",
className: "something else",
},
}
await app
.post("/_builder/api/testApp/pages/main/screen", updatedscreen)
.expect(statusCodes.OK)
const screenFile = "./appPackages/testApp/pages/main/screens/newscreen.json"
expect(await readJSON(screenFile)).toEqual(updatedscreen)
})
it("should be able to rename screen", async () => {
await app
.patch("/_builder/api/testApp/pages/main/screen", {
oldname: "newscreen",
newname: "anotherscreen",
})
.expect(statusCodes.OK)
const oldcomponentFile =
"./appPackages/testApp/pages/main/screens/newscreen.json"
const newcomponentFile =
"./appPackages/testApp/pages/main/screens/anotherscreen.json"
expect(await pathExists(oldcomponentFile)).toBe(false)
expect(await pathExists(newcomponentFile)).toBe(true)
})
it("should be able to delete screen", async () => {
await app
.delete("/_builder/api/testApp/pages/main/screen/anotherscreen")
.expect(statusCodes.OK)
const componentFile =
"./appPackages/testApp/pages/main/screens/anotherscreen.json"
expect(await pathExists(componentFile)).toBe(false)
})
it("/savePage should prepare all necessary client files", async () => {
const mainCss = "/*main page css*/"
mainPage._css = mainCss
const screen1Css = "/*screen1 css*/"
screen1._css = screen1Css
const screen2Css = "/*screen2 css*/"
screen2._css = screen2Css
await app
.post("/_builder/api/testApp/pages/main", {
appDefinition: testAppDef,
accessLevels: testAccessLevels,
page: mainPage,
uiFunctions: "{'1234':() => 'test return'}",
screens: [screen1, screen2],
})
.expect(statusCodes.OK)
const publicFolderMain = relative =>
"./appPackages/testApp/public/main" + relative
const cssDir = publicFolderMain("/css")
expect(await pathExists(publicFolderMain("/index.html"))).toBe(true)
expect(
await pathExists(publicFolderMain("/lib/customComponents/index.js"))
).toBe(true)
expect(
await pathExists(publicFolderMain("/lib/moreCustomComponents/index.js"))
).toBe(true)
expect(
await pathExists(
publicFolderMain(
"/lib/node_modules/@budibase/standard-components/dist/index.js"
)
)
).toBe(true)
const indexHtmlMain = await readFile(publicFolderMain("/index.html"), "utf8")
const pageCssPaths = getHashedCssPaths(cssDir, mainCss)
const screen1CssPaths = getHashedCssPaths(cssDir, screen1Css)
const screen2CssPaths = getHashedCssPaths(cssDir, screen2Css)
expect(await pathExists(publicFolderMain(pageCssPaths.url))).toBe(true)
const savedPageCss = await readFile(
publicFolderMain(pageCssPaths.url),
"utf8"
)
expect(savedPageCss).toEqual(mainCss)
expect(indexHtmlMain.includes(pageCssPaths.url)).toBe(true)
expect(await pathExists(publicFolderMain(screen1CssPaths.url))).toBe(true)
const savedScreen1Css = await readFile(
publicFolderMain(screen1CssPaths.url),
"utf8"
)
expect(savedScreen1Css).toEqual(screen1Css)
expect(indexHtmlMain.includes(screen1CssPaths.url)).toBe(true)
expect(await pathExists(publicFolderMain(screen2CssPaths.url))).toBe(true)
const savedScreen2Css = await readFile(
publicFolderMain(screen2CssPaths.url),
"utf8"
)
expect(savedScreen2Css).toEqual(screen2Css)
expect(indexHtmlMain.includes(screen2CssPaths.url)).toBe(true)
})

View file

@ -1,143 +0,0 @@
const statusCodes = require("../utilities/statusCodes")
const constructHierarchy = require("../utilities/constructHierarchy")
const { readFile } = require("fs-extra")
constructHierarchy(require("../appPackages/_master/appDefinition.json"))
const { createTarGzPackage } = require("../utilities/targzAppPackage")
module.exports = app => {
let _master
const getmaster = async () => {
if (!_master)
_master = await getApisWithFullAccess({}, app.masterAppPackage)
return _master
}
let newAppKey = ""
it("create new application should be successful for owner", async () => {
const master = await getmaster()
const newApp = master.recordApi.getNew("/applications", "application")
newApp.name = app.testAppInfo.name
newAppKey = newApp.key
app.apps.testApp1.key = newAppKey
await app
.post(`/_master/api/record/${newApp.key}`, newApp)
.set("cookie", app.credentials.masterOwner.cookie)
.expect(statusCodes.OK)
const response = await app
.get(`/_master/api/record/${newApp.key}`)
.set("cookie", app.credentials.masterOwner.cookie)
.expect(statusCodes.OK)
expect(response.body.name).toBe(newApp.name)
})
let version1Key = ""
it("should be able to upload new version including package files", async () => {
jest.setTimeout(30000)
const master = await getmaster()
const version1 = master.recordApi.getNew(`${newAppKey}/versions`, "version")
version1.name = "v1"
version1.defaultAccessLevel = "owner"
version1Key = version1.key
const { path, size } = await createTarGzPackage(app.config, "testApp")
version1.package = { relativePath: "package.tar.gz", size }
await app
.post(`/_master/api/record/${version1.key}`, version1)
.set("cookie", app.credentials.masterOwner.cookie)
.expect(statusCodes.OK)
await app
.post(`/_master/api/files/${version1.key}`)
.attach("file", path, "package.tar.gz")
.set("cookie", app.credentials.masterOwner.cookie)
.expect(statusCodes.OK)
const savedAppResponse = await app
.get(`/_master/api/record/${newAppKey}`)
.set("cookie", app.credentials.masterOwner.cookie)
const savedApp = savedAppResponse.body
savedApp.defaultVersion = version1
await app
.post(`/_master/api/record/${newAppKey}`, savedApp)
.set("cookie", app.credentials.masterOwner.cookie)
.expect(statusCodes.OK)
app.apps.testApp1.version1 = version1
})
let instance1
it("should be able to create new instance of app", async () => {
const master = await getmaster()
instance1 = master.recordApi.getNew(`${newAppKey}/instances`, "instance")
instance1.name = "instance 1"
instance1.active = true
instance1.version = {
key: version1Key,
name: "v1",
defaultAccessLevel: "owner",
}
await app
.post(`/_master/api/record/${instance1.key}`, instance1)
.set("cookie", app.credentials.masterOwner.cookie)
.expect(statusCodes.OK)
const loadInstanceResponse = await app
.get(`/_master/api/record/${instance1.key}`)
.set("cookie", app.credentials.masterOwner.cookie)
.expect(statusCodes.OK)
instance1 = loadInstanceResponse.body
app.apps.testApp1.instance1 = instance1
})
let user1_instance1
it("should be able to create new user on instance, via master", async () => {
const master = await getmaster()
user1_instance1 = master.recordApi.getNew(`${newAppKey}/users`, "user")
user1_instance1.name = app.credentials.testAppUser1.username
user1_instance1.createdByMaster = true
master.recordApi.setCustomId(user1_instance1, user1_instance1.name)
/*const lookupResponse = await app.get(`/_master/api/lookup_field/${user1_instance1.key}?fields=instance`)
.set("cookie", app.credentials.masterOwner.cookie)
.expect(statusCodes.OK);
*/
user1_instance1.instance = instance1
user1_instance1.active = true
//await timeout(100);
await app
.post(`/_master/api/record/${user1_instance1.key}`, user1_instance1)
.set("cookie", app.credentials.masterOwner.cookie)
.expect(statusCodes.OK)
})
it("should be able to set password for new user using temporary code", async () => {
const testUserTempCode = await readFile(
`./tests/.data/tempaccess${user1_instance1.name}`,
"utf8"
)
user1_instance1.password = app.credentials.testAppUser1.password
await app
.post("/testApp/api/setPasswordFromTemporaryCode", {
username: app.credentials.testAppUser1.username,
tempCode: testUserTempCode,
newPassword: app.credentials.testAppUser1.password,
})
.expect(statusCodes.OK)
const response = await app
.post("/testApp/api/authenticate", {
username: app.credentials.testAppUser1.username,
password: app.credentials.testAppUser1.password,
})
.expect(statusCodes.OK)
app.credentials.testAppUser1.cookie = response.header["set-cookie"]
})
}

View file

@ -1,8 +0,0 @@
const timeout = ms => new Promise(resolve => setTimeout(resolve, ms))
exports.timeout = timeout
module.exports.sleep = async (ms, fn, ...args) => {
await timeout(ms)
return await fn(...args)
}

View file

@ -1,135 +0,0 @@
const statusCodes = require("../utilities/statusCodes")
const { readFile, writeFile, remove } = require("fs-extra")
module.exports = app => {
it("should serve unauthenticated index.html as default", async () => {
const response = await app.get("/testApp").expect(statusCodes.OK)
const expectedIndexHtml = await readFile(
"appPackages/testApp/public/unauthenticated/index.html",
"utf8"
)
expect(response.text).toBe(expectedIndexHtml)
})
it("should serve specified files when unauthenticated", async () => {
const response = await app.get("/testApp/app.js").expect(statusCodes.OK)
const expectedFile = await readFile(
"appPackages/testApp/public/unauthenticated/app.js",
"utf8"
)
expect(response.text).toBe(expectedFile)
})
it("should serve main index.html as default when authenticated", async () => {
const response = await app
.get("/testApp")
.set("cookie", app.credentials.testAppUser1.cookie)
.expect(statusCodes.OK)
const expectedIndexHtml = await readFile(
"appPackages/testApp/public/main/index.html",
"utf8"
)
expect(response.text).toBe(expectedIndexHtml)
})
it("should serve specified files when authenticated", async () => {
const response = await app
.get("/testApp/budibase-client.js")
.set("cookie", app.credentials.testAppUser1.cookie)
.expect(statusCodes.OK)
const expectedFile = await readFile(
"appPackages/testApp/public/main/budibase-client.js",
"utf8"
)
expect(response.text).toBe(expectedFile)
})
it("should serve file from shared when authenticated", async () => {
const response = await app
.get("/testApp/_shared/shared_file.txt")
.set("cookie", app.credentials.testAppUser1.cookie)
.expect(statusCodes.OK)
const expectedFile = await readFile(
"appPackages/testApp/public/_shared/shared_file.txt",
"utf8"
)
expect(response.text).toBe(expectedFile)
})
it("should serve file from shared when not authenticated", async () => {
const response = await app
.get("/testApp/_shared/shared_file.txt")
.expect(statusCodes.OK)
const expectedFile = await readFile(
"appPackages/testApp/public/_shared/shared_file.txt",
"utf8"
)
expect(response.text).toBe(expectedFile)
})
it("should serve file from latest when instance is versionless", async () => {
try {
await writeFile(
"appPackages/testApp/public/_shared/new_file_for_versionless_test.txt",
"thats right",
{ encoding: "utf8" }
)
} catch (err) {
// empty
}
try {
await app
.get("/testApp/_shared/new_file_for_versionless_test.txt")
.set("cookie", app.credentials.user1_versionlessInstance.cookie)
.expect(statusCodes.OK)
} finally {
try {
await remove(
"appPackages/testApp/public/_shared/new_file_for_versionless_test.txt"
)
} catch (err) {
// empty
}
}
})
it("should not serve file from latest when instance has version", async () => {
try {
await writeFile(
"appPackages/testApp/public/_shared/new_file_for_versionless_test.txt",
"thats right",
{ encoding: "utf8" }
)
} catch (err) {
// empty
}
try {
await app
.get("/testApp/_shared/new_file_for_versionless_test.txt")
.set("cookie", app.credentials.testAppUser1.cookie)
.expect(statusCodes.NOT_FOUND)
} finally {
try {
await remove(
"appPackages/testApp/public/_shared/new_file_for_versionless_test.txt"
)
} catch (err) {
// empty
}
}
})
}

View file

@ -1,69 +0,0 @@
const { resolve, join } = require("path")
const { getRuntimePackageDirectory } = require("../utilities/runtimePackages")
const injectPlugins = require("./injectedPlugins")
const { cwd } = require("process")
const appDefinitionPath = appPath => join(appPath, "appDefinition.json")
const pluginsPath = appPath => join(appPath, "plugins.js")
const accessLevelsPath = appPath => join(appPath, "access_levels.json")
const createAppPackage = (context, appPath) => {
const appDefModule = require(appDefinitionPath(appPath))
const pluginsModule = require(pluginsPath(appPath))
const accessLevels = require(accessLevelsPath(appPath))
return {
appDefinition: appDefModule,
behaviourSources: pluginsModule(context),
appPath,
accessLevels,
...publicPaths(appPath),
}
}
const appPackageFolder = (config, appname) =>
resolve(cwd(), config.latestPackagesFolder, appname)
module.exports.appPackageFolder = appPackageFolder
module.exports.appsFolder = config => appPackageFolder(config, "")
const applictionVersionPath = (context, appname, versionId) =>
join(cwd(), getRuntimePackageDirectory(context, appname, versionId))
const publicPaths = appPath => ({
mainUiPath: resolve(join(appPath, "public", "main")),
unauthenticatedUiPath: resolve(join(appPath, "public", "unauthenticated")),
sharedPath: resolve(join(appPath, "public", "_shared")),
})
module.exports.applictionVersionPublicPaths = (context, appname, versionId) => {
const appPath = applictionVersionPath(context, appname, versionId)
return publicPaths(appPath)
}
module.exports.applictionVersionPackage = async (
context,
appname,
versionId,
instanceKey
) => {
const pkg = createAppPackage(
context,
applictionVersionPath(context, appname, versionId)
)
pkg.appDefinition = constructHierarchy(pkg.appDefinition)
await injectPlugins(pkg, context.master, appname, instanceKey)
return pkg
}
module.exports.deleteCachedPackage = (context, appname, versionId) => {
const appPath = applictionVersionPath(context, appname, versionId)
delete require.cache[resolve(appDefinitionPath(appPath))]
delete require.cache[resolve(pluginsPath(appPath))]
delete require.cache[resolve(accessLevelsPath(appPath))]
}

View file

@ -1,19 +0,0 @@
module.exports = ({ masterAppInternal, instanceKey, app }) => async ({
user,
}) => {
const { bbMaster } = masterAppInternal
const existingUser = await masterAppInternal.getUser(app.id, user.name)
if (existingUser) return
const masterUser = bbMaster.recordApi.getNew(`${app.key}/users`, "user")
masterUser.name = user.name
bbMaster.recordApi.setCustomId(masterUser, masterUser.name)
masterUser.createdByMaster = false
masterUser.instance = await bbMaster.recordApi.load(instanceKey)
masterUser.active = user.enabled
await bbMaster.recordApi.save(masterUser)
}
exports.timeout = ms => new Promise(resolve => setTimeout(resolve, ms))

View file

@ -1,3 +0,0 @@
module.exports = ({ masterAppInternal, app }) => async ({ username }) => {
await masterAppInternal.disableUser(app, username)
}

View file

@ -1,3 +0,0 @@
module.exports = ({ masterAppInternal, app }) => async ({ username }) => {
await masterAppInternal.enableUser(app, username)
}

View file

@ -1,76 +0,0 @@
const createUser = require("./createUser")
const enableUser = require("./enableUser")
const disableUser = require("./disableUser")
module.exports = async (
appPackage,
masterAppInternal,
appName,
instanceKey
) => {
const plugin = await constructPlugin(masterAppInternal, appName, instanceKey)
appPackage.behaviourSources._injected = plugin
createActions(appPackage)
createTriggers(appPackage)
}
const createTriggers = appPackage => {
const appDef = appPackage.appDefinition
appDef.triggers.push({
actionName: "createUser",
eventName: "authApi:createUser:onComplete",
optionsCreator: "return {user:context.result};",
condition: "",
})
appDef.triggers.push({
actionName: "enableUser",
eventName: "authApi:enableUser:onComplete",
optionsCreator: "return {username:context.username};",
condition: "",
})
appDef.triggers.push({
actionName: "disableUser",
eventName: "authApi:disableUser:onComplete",
optionsCreator: "return {username:context.username};",
condition: "",
})
}
const createActions = appPackage => {
const appDef = appPackage.appDefinition
appDef.actions.push({
name: "createUser",
behaviourSource: "_injected",
behaviourName: "createUser",
initialOptions: {},
})
appDef.actions.push({
name: "enableUser",
behaviourSource: "_injected",
behaviourName: "enableUser",
initialOptions: {},
})
appDef.actions.push({
name: "disableUser",
behaviourSource: "_injected",
behaviourName: "disableUser",
initialOptions: {},
})
}
const constructPlugin = async (masterAppInternal, appName, instanceKey) => {
const app = await masterAppInternal.getApplication(appName)
const initialiseObj = {
masterAppInternal,
app,
instanceKey,
}
return {
createUser: createUser(initialiseObj),
enableUser: enableUser(initialiseObj),
disableUser: disableUser(initialiseObj),
}
}

View file

@ -1,34 +0,0 @@
const { join } = require("path")
const { isString, last } = require("lodash/fp")
const { common } = require("@budibase/core")
const runtimePackagesDirectory = "./runtime_apps"
const LATEST_VERSIONID = "##LATEST##"
const { $, splitKey } = common
const getRuntimeAppsDirectory = appName =>
join(runtimePackagesDirectory, appName)
const getLatestDirectory = (appContext, appname) =>
join(appContext.config.latestPackagesFolder, appname)
module.exports.LATEST_VERSIONID = LATEST_VERSIONID
module.exports.runtimePackagesDirectory = runtimePackagesDirectory
module.exports.getRuntimePackageDirectory = (appId, versionId) =>
versionId === LATEST_VERSIONID
? getLatestDirectory(appId)
: join(getRuntimeAppsDirectory(appName), versionId)
module.exports.getRuntimeAppsDirectory = getRuntimeAppsDirectory
// the point of this in mainly to support running in dev
// i.e. if no "versions" are in use, then it will route
// to the latest package
module.exports.determineVersionId = version => {
let versionKey = isString(version) ? version : null
if (!versionKey && version && version.key) versionKey = version.key
return versionKey ? $(versionKey, [splitKey, last]) : LATEST_VERSIONID
}

View file

@ -1,119 +0,0 @@
// Based on https://github.com/lafin/node-targz
// MIT license
const fs = require("fs")
const tar = require("tar-fs")
const zlib = require("zlib")
const { join, dirname, sep } = require("path")
const { exists, mkdir, unlink, remove, stat } = require("fs-extra")
const {
getRuntimePackageDirectory,
getRuntimeAppsDirectory,
} = require("./runtimePackages")
module.exports.createTarGzPackage = async (config, appName) => {
const appPath = join(config.latestPackagesFolder, appName)
const distPath = join(appPath, "dist")
if (!(await exists(distPath))) {
await mkdir(distPath)
}
const packagePath = `${distPath}/package.tar.gz`
if (await exists(`${packagePath}`)) {
await unlink(packagePath)
}
try {
await compress(appPath, packagePath)
} catch (e) {
console.log(e)
}
const size = (await stat(packagePath)).size
return { size, path: packagePath }
}
module.exports.unzipTarGzPackageToRuntime = async (
context,
src,
appName,
versionId
) => {
const versionDir = getRuntimePackageDirectory(context, appName, versionId)
const appDir = getRuntimeAppsDirectory(appName)
if (await exists(appDir)) {
if (await exists(versionDir)) {
await remove(versionDir)
}
} else {
await mkdir(appDir)
}
await mkdir(versionDir)
await decompress(src, versionDir)
}
const compress = (src, dest) =>
new Promise((resolve, reject) => {
// ensure opts
let opts = { src, dest }
opts.tar = {
ignore: name =>
dirname(name)
.split(sep)
.pop() === "dist" ||
dirname(name)
.split(sep)
.pop() === "node_modules",
}
opts.gz = opts.gz || {}
// default gzip config
opts.gz.level = opts.gz.level || 6
opts.gz.memLevel = opts.gz.memLevel || 6
// ensure src and dest
if (!opts.src) return reject("No source for compress!")
if (!opts.dest) return reject("No destination for compress!")
// go
process.nextTick(function() {
tar
.pack(opts.src, opts.tar)
.on("error", reject)
.pipe(zlib.createGzip(opts.gz).on("error", reject))
.pipe(
fs
.createWriteStream(opts.dest)
.on("error", reject)
.on("finish", resolve)
)
})
})
const decompress = (src, dest) =>
new Promise((resolve, reject) => {
// ensure opts
let opts = { src, dest }
opts.tar = opts.tar || {}
opts.gz = opts.gz || {}
// ensure src and dest
if (!opts.src) return reject("No source for decompress!")
if (!opts.dest) return reject("No destination for decompress!")
// go
process.nextTick(function() {
fs.createReadStream(opts.src)
.on("error", reject)
.pipe(zlib.createGunzip(opts.gz).on("error", reject))
.pipe(
tar
.extract(opts.dest, opts.tar)
.on("error", reject)
.on("finish", resolve)
)
})
})

View file

@ -610,6 +610,11 @@ acorn-globals@^4.1.0:
acorn "^6.0.1"
acorn-walk "^6.0.1"
acorn-jsx@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
acorn-walk@^6.0.1:
version "6.2.0"
resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.2.0.tgz#123cb8f3b84c2171f1f7fb252615b1c78a6b1a8c"
@ -630,12 +635,17 @@ acorn@^6.0.1:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz#531e58ba3f51b9dacb9a6646ca4debf5b14ca474"
integrity sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==
acorn@^7.1.1:
version "7.1.1"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf"
integrity sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==
ajv-keywords@^3.4.1:
version "3.4.1"
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz#ef916e271c64ac12171fd8384eaae6b2345854da"
integrity sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==
ajv@^6.12.0, ajv@^6.12.2:
ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.12.2:
version "6.12.2"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz#c629c5eced17baf314437918d2da88c99d5958cd"
integrity sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==
@ -672,6 +682,13 @@ ansi-escapes@^3.0.0:
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b"
integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
ansi-escapes@^4.2.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz#a5c47cc43181f1f38ffd7076837700d395522a61"
integrity sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==
dependencies:
type-fest "^0.11.0"
ansi-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
@ -1181,7 +1198,7 @@ caseless@~0.12.0:
resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2:
chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
@ -1206,6 +1223,11 @@ chalk@^4.0.0:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
chardet@^0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==
chokidar@^3.2.2:
version "3.3.1"
resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.1.tgz#c84e5b3d18d9a4d77558fef466b1bf16bbeb3450"
@ -1251,6 +1273,18 @@ cli-boxes@^2.2.0:
resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.0.tgz#538ecae8f9c6ca508e3c3c95b453fe93cb4c168d"
integrity sha512-gpaBrMAizVEANOpfZp/EEUixTXDyGt7DFzdK5hU+UbWt/J0lB0w20ncZj59Z9a93xHb9u12zF5BS6i9RKbtg4w==
cli-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
dependencies:
restore-cursor "^3.1.0"
cli-width@^2.0.0:
version "2.2.1"
resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48"
integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
cliui@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
@ -1456,7 +1490,7 @@ crc@^3.4.4:
dependencies:
buffer "^5.1.0"
cross-spawn@^6.0.0:
cross-spawn@^6.0.0, cross-spawn@^6.0.5:
version "6.0.5"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4"
integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==
@ -1519,7 +1553,7 @@ debug@^3.1.0, debug@^3.2.6:
dependencies:
ms "^2.1.1"
debug@^4.1.0, debug@^4.1.1:
debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
@ -1700,6 +1734,13 @@ dmg-builder@22.6.0:
js-yaml "^3.13.1"
sanitize-filename "^1.6.3"
doctrine@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz#addebead72a6574db783639dc87a121773973961"
integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==
dependencies:
esutils "^2.0.2"
domexception@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90"
@ -1966,11 +2007,83 @@ escodegen@^1.9.1:
optionalDependencies:
source-map "~0.6.1"
eslint-scope@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.0.0.tgz#e87c8887c73e8d1ec84f1ca591645c358bfc8fb9"
integrity sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==
dependencies:
esrecurse "^4.1.0"
estraverse "^4.1.1"
eslint-utils@^1.4.3:
version "1.4.3"
resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f"
integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==
dependencies:
eslint-visitor-keys "^1.1.0"
eslint-visitor-keys@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz#e2a82cea84ff246ad6fb57f9bde5b46621459ec2"
integrity sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==
eslint@^6.8.0:
version "6.8.0"
resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb"
integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==
dependencies:
"@babel/code-frame" "^7.0.0"
ajv "^6.10.0"
chalk "^2.1.0"
cross-spawn "^6.0.5"
debug "^4.0.1"
doctrine "^3.0.0"
eslint-scope "^5.0.0"
eslint-utils "^1.4.3"
eslint-visitor-keys "^1.1.0"
espree "^6.1.2"
esquery "^1.0.1"
esutils "^2.0.2"
file-entry-cache "^5.0.1"
functional-red-black-tree "^1.0.1"
glob-parent "^5.0.0"
globals "^12.1.0"
ignore "^4.0.6"
import-fresh "^3.0.0"
imurmurhash "^0.1.4"
inquirer "^7.0.0"
is-glob "^4.0.0"
js-yaml "^3.13.1"
json-stable-stringify-without-jsonify "^1.0.1"
levn "^0.3.0"
lodash "^4.17.14"
minimatch "^3.0.4"
mkdirp "^0.5.1"
natural-compare "^1.4.0"
optionator "^0.8.3"
progress "^2.0.0"
regexpp "^2.0.1"
semver "^6.1.2"
strip-ansi "^5.2.0"
strip-json-comments "^3.0.1"
table "^5.2.3"
text-table "^0.2.0"
v8-compile-cache "^2.0.3"
esmangle-evaluator@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/esmangle-evaluator/-/esmangle-evaluator-1.0.1.tgz#620d866ef4861b3311f75766d52a8572bb3c6336"
integrity sha1-Yg2GbvSGGzMR91dm1SqFcrs8YzY=
espree@^6.1.2:
version "6.2.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a"
integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==
dependencies:
acorn "^7.1.1"
acorn-jsx "^5.2.0"
eslint-visitor-keys "^1.1.0"
esprima-fb@^15001.1.0-dev-harmony-fb:
version "15001.1.0-dev-harmony-fb"
resolved "https://registry.yarnpkg.com/esprima-fb/-/esprima-fb-15001.1.0-dev-harmony-fb.tgz#30a947303c6b8d5e955bee2b99b1d233206a6901"
@ -2001,11 +2114,30 @@ esprima@~3.1.0:
resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
integrity sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=
estraverse@^4.2.0:
esquery@^1.0.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57"
integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==
dependencies:
estraverse "^5.1.0"
esrecurse@^4.1.0:
version "4.2.1"
resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf"
integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==
dependencies:
estraverse "^4.1.0"
estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d"
integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
estraverse@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642"
integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==
esutils@^2.0.2:
version "2.0.3"
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
@ -2084,6 +2216,15 @@ extend@^3.0.0, extend@~3.0.2:
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
external-editor@^3.0.3:
version "3.1.0"
resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495"
integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==
dependencies:
chardet "^0.7.0"
iconv-lite "^0.4.24"
tmp "^0.0.33"
extglob@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543"
@ -2165,6 +2306,20 @@ fetch-cookie@0.7.3:
es6-denodeify "^0.1.1"
tough-cookie "^2.3.3"
figures@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==
dependencies:
escape-string-regexp "^1.0.5"
file-entry-cache@^5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c"
integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==
dependencies:
flat-cache "^2.0.1"
file-uri-to-path@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
@ -2209,6 +2364,20 @@ find-up@^4.1.0:
locate-path "^5.0.0"
path-exists "^4.0.0"
flat-cache@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0"
integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==
dependencies:
flatted "^2.0.0"
rimraf "2.6.3"
write "1.0.3"
flatted@^2.0.0:
version "2.0.2"
resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138"
integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==
for-in@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
@ -2306,6 +2475,11 @@ function-bind@^1.1.1:
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
functional-red-black-tree@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=
gensync@^1.0.0-beta.1:
version "1.0.0-beta.1"
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz#58f4361ff987e5ff6e1e7a210827aa371eaac269"
@ -2342,7 +2516,7 @@ getpass@^0.1.1:
dependencies:
assert-plus "^1.0.0"
glob-parent@~5.1.0:
glob-parent@^5.0.0, glob-parent@~5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229"
integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==
@ -2407,6 +2581,13 @@ globals@^11.1.0:
resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
globals@^12.1.0:
version "12.4.0"
resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8"
integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==
dependencies:
type-fest "^0.8.1"
globalthis@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.1.tgz#40116f5d9c071f9e8fb0037654df1ab3a83b7ef9"
@ -2584,7 +2765,7 @@ humanize-number@0.0.2:
resolved "https://registry.yarnpkg.com/humanize-number/-/humanize-number-0.0.2.tgz#11c0af6a471643633588588048f1799541489c18"
integrity sha1-EcCvakcWQ2M1iFiASPF5lUFInBg=
iconv-lite@0.4.24, iconv-lite@^0.4.5:
iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.5:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@ -2608,6 +2789,11 @@ ignore-by-default@^1.0.1:
resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk=
ignore@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
immediate@3.0.6, immediate@~3.0.5:
version "3.0.6"
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b"
@ -2618,6 +2804,14 @@ immediate@^3.2.3:
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.2.3.tgz#d140fa8f614659bd6541233097ddaac25cdd991c"
integrity sha1-0UD6j2FGWb1lQSMwl92qwlzdmRw=
import-fresh@^3.0.0:
version "3.2.1"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz#633ff618506e793af5ac91bf48b72677e15cbe66"
integrity sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==
dependencies:
parent-module "^1.0.0"
resolve-from "^4.0.0"
import-lazy@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43"
@ -2672,6 +2866,25 @@ inline-process-browser@^1.0.0:
falafel "^1.0.1"
through2 "^0.6.5"
inquirer@^7.0.0:
version "7.1.0"
resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz#1298a01859883e17c7264b82870ae1034f92dd29"
integrity sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==
dependencies:
ansi-escapes "^4.2.1"
chalk "^3.0.0"
cli-cursor "^3.1.0"
cli-width "^2.0.0"
external-editor "^3.0.3"
figures "^3.0.0"
lodash "^4.17.15"
mute-stream "0.0.8"
run-async "^2.4.0"
rxjs "^6.5.3"
string-width "^4.1.0"
strip-ansi "^6.0.0"
through "^2.3.6"
invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
@ -2816,7 +3029,7 @@ is-generator-function@^1.0.7:
resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.7.tgz#d2132e529bb0000a7f80794d4bdf5cd5e5813522"
integrity sha512-YZc5EwyO4f2kWCax7oegfuSr9mFz1ZvieNYBEjmukLxgXfBUbxAWGVF7GZf0zidYtoBl3WvC07YK0wT76a+Rtw==
is-glob@^4.0.1, is-glob@~4.0.1:
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc"
integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==
@ -3479,6 +3692,11 @@ json-schema@0.2.3:
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13"
integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=
json-stable-stringify-without-jsonify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=
json-stringify-safe@^5.0.1, json-stringify-safe@~5.0.1:
version "5.0.1"
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
@ -3855,7 +4073,7 @@ leven@^3.1.0:
resolved "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz#77891de834064cccba82ae7842bb6b14a13ed7f2"
integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==
levn@~0.3.0:
levn@^0.3.0, levn@~0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=
@ -3938,7 +4156,7 @@ lodash.sortby@^4.7.0:
resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438"
integrity sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=
lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.15:
lodash@^4.17.10, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15:
version "4.17.15"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@ -4079,6 +4297,11 @@ mime@^2.4.4:
resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.5.tgz#d8de2ecb92982dedbb6541c9b6841d7f218ea009"
integrity sha512-3hQhEUF027BuxZjQA3s7rIv/7VCQPa27hN9u9g87sEkWaKwQPuXOkVKtOeiyUrnWqTDiOs8Ed2rwg733mB0R5w==
mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
mimic-response@^1.0.0, mimic-response@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
@ -4126,6 +4349,11 @@ ms@^2.1.1:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
mute-stream@0.0.8:
version "0.0.8"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
mz@^2.7.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
@ -4371,6 +4599,13 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0:
dependencies:
wrappy "1"
onetime@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz#fff0f3c91617fe62bb50189636e99ac8a6df7be5"
integrity sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==
dependencies:
mimic-fn "^2.1.0"
only@~0.0.2:
version "0.0.2"
resolved "https://registry.yarnpkg.com/only/-/only-0.0.2.tgz#2afde84d03e50b9a8edc444e30610a70295edfb4"
@ -4381,7 +4616,7 @@ opencollective-postinstall@^2.0.0:
resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz#5657f1bede69b6e33a45939b061eb53d3c6c3a89"
integrity sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==
optionator@^0.8.1:
optionator@^0.8.1, optionator@^0.8.3:
version "0.8.3"
resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495"
integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
@ -4393,6 +4628,11 @@ optionator@^0.8.1:
type-check "~0.3.2"
word-wrap "~1.2.3"
os-tmpdir@~1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=
p-cancelable@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc"
@ -4451,6 +4691,13 @@ package-json@^6.3.0:
registry-url "^5.0.0"
semver "^6.2.0"
parent-module@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2"
integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==
dependencies:
callsites "^3.0.0"
parse-json@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0"
@ -4641,7 +4888,7 @@ process-nextick-args@~2.0.0:
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
progress@^2.0.3:
progress@^2.0.0, progress@^2.0.3:
version "2.0.3"
resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
@ -4864,6 +5111,11 @@ regexparam@^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"
integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==
registry-auth-token@^4.0.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.1.1.tgz#40a33be1e82539460f94328b0f7f0f84c16d9479"
@ -4957,6 +5209,11 @@ resolve-from@^3.0.0:
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748"
integrity sha1-six699nWiBvItuZTM17rywoYh0g=
resolve-from@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6"
integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==
resolve-path@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/resolve-path/-/resolve-path-1.4.0.tgz#c4bda9f5efb2fce65247873ab36bb4d834fe16f7"
@ -4989,11 +5246,26 @@ responselike@^1.0.2:
dependencies:
lowercase-keys "^1.0.0"
restore-cursor@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
dependencies:
onetime "^5.1.0"
signal-exit "^3.0.2"
ret@~0.1.10:
version "0.1.15"
resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc"
integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==
rimraf@2.6.3:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
dependencies:
glob "^7.1.3"
rimraf@^2.5.4, rimraf@^2.6.3:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
@ -5018,6 +5290,18 @@ rsvp@^4.8.4:
resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734"
integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==
run-async@^2.4.0:
version "2.4.1"
resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455"
integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
rxjs@^6.5.3:
version "6.5.5"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz#c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec"
integrity sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==
dependencies:
tslib "^1.9.0"
safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
version "5.1.2"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
@ -5084,7 +5368,7 @@ semver-diff@^3.1.1:
resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
semver@^6.0.0, semver@^6.2.0, semver@^6.3.0:
semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
@ -5178,6 +5462,15 @@ slash@^2.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
slice-ansi@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636"
integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==
dependencies:
ansi-styles "^3.2.0"
astral-regex "^1.0.0"
is-fullwidth-code-point "^2.0.0"
snapdragon-node@^2.0.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b"
@ -5475,6 +5768,11 @@ strip-eof@^1.0.0:
resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf"
integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=
strip-json-comments@^3.0.1:
version "3.1.0"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz#7638d31422129ecf4457440009fba03f9f9ac180"
integrity sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==
strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
@ -5542,6 +5840,16 @@ symbol-tree@^3.2.2:
resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
table@^5.2.3:
version "5.4.6"
resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e"
integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==
dependencies:
ajv "^6.10.2"
lodash "^4.17.14"
slice-ansi "^2.1.0"
string-width "^3.0.0"
tar-fs@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.0.1.tgz#e44086c1c60d31a4f0cf893b1c4e155dabfae9e2"
@ -5586,6 +5894,11 @@ test-exclude@^5.2.3:
read-pkg-up "^4.0.0"
require-main-filename "^2.0.0"
text-table@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=
thenify-all@^1.0.0:
version "1.6.0"
resolved "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz#1a1918d402d8fc3f98fbf234db0bcc8cc10e9726"
@ -5620,7 +5933,7 @@ through2@^0.6.2, through2@^0.6.5:
readable-stream ">=1.0.33-1 <1.1.0-0"
xtend ">=4.0.0 <4.1.0-0"
through@~2.3.4:
through@^2.3.6, through@~2.3.4:
version "2.3.8"
resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
@ -5630,6 +5943,13 @@ tiny-queue@^0.2.0:
resolved "https://registry.yarnpkg.com/tiny-queue/-/tiny-queue-0.2.1.tgz#25a67f2c6e253b2ca941977b5ef7442ef97a6046"
integrity sha1-JaZ/LG4lOyypQZd7XvdELvl6YEY=
tmp@^0.0.33:
version "0.0.33"
resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
dependencies:
os-tmpdir "~1.0.2"
tmpl@1.0.x:
version "1.0.4"
resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1"
@ -5711,6 +6031,11 @@ truncate-utf8-bytes@^1.0.0:
dependencies:
utf8-byte-length "^1.0.1"
tslib@^1.9.0:
version "1.11.2"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.11.2.tgz#9c79d83272c9a7aaf166f73915c9667ecdde3cc9"
integrity sha512-tTSkux6IGPnUGUd1XAZHcpu85MOkIl5zX49pO+jfsie3eP0B6pyhOlLXm3cAC6T7s+euSDDUUV+Acop5WmtkVg==
tsscmp@1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/tsscmp/-/tsscmp-1.0.6.tgz#85b99583ac3589ec4bfef825b5000aa911d605eb"
@ -5740,6 +6065,11 @@ type-check@~0.3.2:
dependencies:
prelude-ls "~1.1.2"
type-fest@^0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz#97abf0872310fed88a5c466b25681576145e33f1"
integrity sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==
type-fest@^0.8.0, type-fest@^0.8.1:
version "0.8.1"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
@ -5899,6 +6229,11 @@ uuid@^3.3.2:
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
v8-compile-cache@^2.0.3:
version "2.1.0"
resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e"
integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==
validate-npm-package-license@^3.0.1:
version "3.0.4"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
@ -6081,6 +6416,13 @@ write-stream@~0.4.3:
dependencies:
readable-stream "~0.0.2"
write@1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3"
integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==
dependencies:
mkdirp "^0.5.1"
ws@^5.2.0:
version "5.2.2"
resolved "https://registry.yarnpkg.com/ws/-/ws-5.2.2.tgz#dffef14866b8e8dc9133582514d1befaf96e980f"