diff --git a/.gitignore b/.gitignore index a69b6987a..48a49d382 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +.data/ + # Logs logs *.log diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 000000000..6906bc7d9 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,16 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Initialise Budibase", + "program": "${workspaceFolder}/initialise/initialiseBudibase.js", + "args": ["--datastore=local", "--username=test", "--password=test", "--rootPath=./.data", "--cleanDev"], + "console": "externalTerminal" + } + ] +} \ No newline at end of file diff --git a/appPackages/master/access_levels.json b/appPackages/master/access_levels.json new file mode 100644 index 000000000..94599b6d6 --- /dev/null +++ b/appPackages/master/access_levels.json @@ -0,0 +1 @@ +{"levels":[{"name":"owner","permissions":[{"type":"create record","nodeKey":"/applications/1-{id}"},{"type":"update record","nodeKey":"/applications/1-{id}"},{"type":"delete record","nodeKey":"/applications/1-{id}"},{"type":"read record","nodeKey":"/applications/1-{id}"},{"type":"update record","nodeKey":"/applications/1-{id}/users/8-{id}"},{"type":"delete record","nodeKey":"/applications/1-{id}/users/8-{id}"},{"type":"create record","nodeKey":"/applications/1-{id}/users/8-{id}"},{"type":"read record","nodeKey":"/applications/1-{id}/users/8-{id}"},{"type":"create record","nodeKey":"/applications/1-{id}/instances/2-{id}"},{"type":"update record","nodeKey":"/applications/1-{id}/instances/2-{id}"},{"type":"delete record","nodeKey":"/applications/1-{id}/instances/2-{id}"},{"type":"read record","nodeKey":"/applications/1-{id}/instances/2-{id}"},{"type":"create record","nodeKey":"/applications/1-{id}/versions/3-{id}"},{"type":"update record","nodeKey":"/applications/1-{id}/versions/3-{id}"},{"type":"delete record","nodeKey":"/applications/1-{id}/versions/3-{id}"},{"type":"read record","nodeKey":"/applications/1-{id}/versions/3-{id}"},{"type":"read index","nodeKey":"/applications/1-{id}/allinstances"},{"type":"read index","nodeKey":"/applications/1-{id}/activeinstances"},{"type":"read index","nodeKey":"/applications/1-{id}/activeusers"},{"type":"read index","nodeKey":"/applications/1-{id}/all_versions"},{"type":"read index","nodeKey":"/applications/1-{id}/instances/2-{id}/users_on_this_instance"},{"type":"read index","nodeKey":"/applications/1-{id}/versions/3-{id}/instances_for_this_version"},{"type":"read index","nodeKey":"/applications/1-{id}/versions/3-{id}/instances_on_this_version"},{"type":"set user access levels"},{"type":"manage collection"},{"type":"list access levels"},{"type":"list users"},{"type":"write access levels"},{"type":"enable or disable user"},{"type":"create temporary access"},{"type":"set password"},{"type":"create user"},{"type":"write templates"}]}],"version":0} \ No newline at end of file diff --git a/appPackages/master/appDefinition.json b/appPackages/master/appDefinition.json new file mode 100644 index 000000000..19ab12759 --- /dev/null +++ b/appPackages/master/appDefinition.json @@ -0,0 +1 @@ +{"hierarchy":{"name":"root","type":"root","children":[{"name":"application","type":"record","fields":[{"name":"name","type":"string","typeOptions":{"maxLength":500,"values":null,"allowDeclaredValuesOnly":false},"label":"Name","getInitialValue":"default","getUndefinedValue":"default"},{"name":"domain","type":"string","typeOptions":{"maxLength":500,"values":null,"allowDeclaredValuesOnly":false},"label":"domain","getInitialValue":"default","getUndefinedValue":"default"},{"name":"application_resolve_strategy","type":"string","typeOptions":{"maxLength":100,"values":["domain","path"],"allowDeclaredValuesOnly":true},"label":"Resolve Application By","getInitialValue":"default","getUndefinedValue":"default"}],"children":[{"name":"user","type":"record","fields":[{"name":"unique_name","type":"string","typeOptions":{"maxLength":200,"values":null,"allowDeclaredValuesOnly":false},"label":"Name (unique)","getInitialValue":"default","getUndefinedValue":"default"},{"name":"active","type":"bool","typeOptions":{"allowNulls":false},"label":"Is Active","getInitialValue":"default","getUndefinedValue":"default"},{"name":"instance","type":"reference","typeOptions":{"indexNodeKey":"/applications/1-{id}/allinstances","reverseIndexNodeKeys":["/applications/1-{id}/instances/2-{id}/users_on_this_instance"],"displayValue":"name"},"label":"Instance","getInitialValue":"default","getUndefinedValue":"default"}],"children":[],"validationRules":[],"nodeId":8,"indexes":[],"allidsShardFactor":"64","collectionName":"users","isSingle":false},{"name":"instance","type":"record","fields":[{"name":"name","type":"string","typeOptions":{"maxLength":1000,"values":null,"allowDeclaredValuesOnly":false},"label":"Name","getInitialValue":"default","getUndefinedValue":"default"},{"name":"active","type":"bool","typeOptions":{"allowNulls":false},"label":"Is Active","getInitialValue":"default","getUndefinedValue":"default"},{"name":"version","type":"reference","typeOptions":{"indexNodeKey":"/applications/1-{id}/all_versions","reverseIndexNodeKeys":["/applications/1-{id}/versions/3-{id}/instances_on_this_version"],"displayValue":"name"},"label":"Version","getInitialValue":"default","getUndefinedValue":"default"},{"name":"datastoreconfig","type":"string","typeOptions":{"maxLength":1000,"values":null,"allowDeclaredValuesOnly":false},"label":"Datastore Config","getInitialValue":"default","getUndefinedValue":"default"}],"children":[],"validationRules":[],"nodeId":2,"indexes":[{"name":"users_on_this_instance","type":"index","map":"return {...record};","filter":"","indexType":"reference","getShardName":"","getSortKey":"record.id","aggregateGroups":[],"allowedRecordNodeIds":[],"nodeId":15}],"allidsShardFactor":1,"collectionName":"instances","isSingle":false},{"name":"version","type":"record","fields":[{"name":"name","type":"string","typeOptions":{"maxLength":200,"values":null,"allowDeclaredValuesOnly":false},"label":"Name","getInitialValue":"default","getUndefinedValue":"default"}],"children":[],"validationRules":[],"nodeId":3,"indexes":[{"name":"instances_for_this_version","type":"index","map":"return {name:record.name};","filter":"","indexType":"ancestor","getShardName":"","getSortKey":"record.id","aggregateGroups":[],"allowedRecordNodeIds":[],"nodeId":9},{"name":"instances_on_this_version","type":"index","map":"return {...record};","filter":"","indexType":"reference","getShardName":"","getSortKey":"record.id","aggregateGroups":[],"allowedRecordNodeIds":[],"nodeId":10}],"allidsShardFactor":1,"collectionName":"versions","isSingle":false}],"validationRules":[],"nodeId":1,"indexes":[{"name":"allinstances","type":"index","map":"return {...record};","filter":"","indexType":"ancestor","getShardName":"","getSortKey":"record.id","aggregateGroups":[],"allowedRecordNodeIds":[null],"nodeId":6},{"name":"activeinstances","type":"index","map":"return {...record};","filter":"record.active === false","indexType":"ancestor","getShardName":"","getSortKey":"record.id","aggregateGroups":[],"allowedRecordNodeIds":[null],"nodeId":7},{"name":"activeusers","type":"index","map":"return {...record};","filter":"record.active === true","indexType":"ancestor","getShardName":"","getSortKey":"record.id","aggregateGroups":[],"allowedRecordNodeIds":[null],"nodeId":14},{"name":"all_versions","type":"index","map":"return {...record};","filter":"","indexType":"ancestor","getShardName":"","getSortKey":"record.id","aggregateGroups":[],"allowedRecordNodeIds":[null,null,null],"nodeId":9}],"allidsShardFactor":64,"collectionName":"applications","isSingle":false}],"pathMaps":[],"indexes":[],"nodeId":0},"actions":{},"triggers":[]} \ No newline at end of file diff --git a/datastores/datastores/local.js b/datastores/datastores/local.js index d3b4a41c0..8e0e6bd80 100644 --- a/datastores/datastores/local.js +++ b/datastores/datastores/local.js @@ -40,11 +40,13 @@ const createFolder = root => async (path) => await mkdir( join(root, path)); -module.exports.deleteFile = root => async (path) => +const deleteFile = root => async (path) => await unlink( join(root, path) ); +module.exports.deleteFile = deleteFile; + const deleteFolder = root => async (path) => await rmdir( join(root, path)); @@ -71,33 +73,36 @@ const renameFile = root => async (oldPath, newPath) => join(root, newPath) ); -const datastoreFolder = (type, productSetId, productId, productInstanceId) => - !productSetId ? type - : !productInstanceId ? `${type}.${productSetId}` - : `${type}.${productSetId}.${productId}.${productInstanceId}`; +const datastoreFolder = (applicationId, instanceId) => + applicationId === "master" ? "master" + : `app.${applicationId}.${instanceId}`; -const createEmptyDb = async (dbRootConfig, type, productSetId, productId, productInstanceId) => { - const folder = datastoreFolder(type, productSetId, productId, productInstanceId); +const createEmptyDb = (rootConfig) => async (applicationId, instanceId) => { + const folder = datastoreFolder(applicationId, instanceId); + const dbRootConfig = getDbRootConfig(rootConfig, applicationId, instanceId); await createFolder(dbRootConfig)(folder); return folder; }; -const getDatastoreConfig = (dbRootConfig, type, productSetId, productId, productInstanceId) => - join(dbRootConfig, +const getDatastoreConfig = (rootConfig) => (applicationId, instanceId) => + join(rootConfig.rootPath, datastoreFolder( - type, productSetId, productId, productInstanceId + applicationId, instanceId )); -const getMasterDbRootConfig = () => "./data"; -const getProductSetDbRootConfig = async (productSetId) => "./data"; -const getProductInstanceDbRootConfig = - async (productSetId, productId, productInstanceId) => "./data"; - -module.exports.databaseManager = { - createEmptyDb, getDatastoreConfig, - getMasterDbRootConfig, getProductSetDbRootConfig, - getProductInstanceDbRootConfig -}; +const getMasterDbRootConfig = (rootConfig) => () => rootConfig.rootPath; +const getInstanceDbRootConfig = (rootConfig) => async (applicationId, instanceId) => rootConfig.rootPath; +const getDbRootConfig = (rootConfig, applicationId, instanceId) => + applicationId === "master" + ? getMasterDbRootConfig(rootConfig)() + : getInstanceDbRootConfig(rootConfig)(applicationId, instanceId); + +module.exports.databaseManager = rootConfig => ({ + createEmptyDb:createEmptyDb(rootConfig), + getDatastoreConfig:getDatastoreConfig(rootConfig), + getMasterDbRootConfig:getMasterDbRootConfig(rootConfig), + getInstanceDbRootConfig:getInstanceDbRootConfig(rootConfig) +}); module.exports.getDatastore = rootFolderPath => ({ createFile : createFile(rootFolderPath), @@ -115,3 +120,7 @@ module.exports.getDatastore = rootFolderPath => ({ datastoreType : "local", datastoreDescription: rootFolderPath }); + +module.exports.configParameters = { + rootPath: "Root Data Folder" +}; diff --git a/initialise/createProductInstanceDb.js b/initialise/createInstanceDb.js similarity index 96% rename from initialise/createProductInstanceDb.js rename to initialise/createInstanceDb.js index c5cfcdd66..32f0b4ef5 100644 --- a/initialise/createProductInstanceDb.js +++ b/initialise/createInstanceDb.js @@ -1,35 +1,35 @@ -const {common, getAppApis} = require("budibase-core"); -const {getDatabaseManager} = require("./helpers"); - -module.exports = async (productSetId, productId, versionId) => { - const databaseManager = getDatabaseManager(datastoreModule); - const masterDatastore = datastoreModule.getDatastore( - databaseManager.masterDatastoreConfig - ); - - const master = await getAppApis(masterDatastore); - - const productSet = await master.recordApi.load( - common.joinKey("ProductSets", productSetId) - ); - - const prodcutSetDatastore = datastoreModule.getDatastore( - productSet.datastoreConfig - ); - - const productSetApis = await getAppApis(prodcutSetDatastore); - const product = await productSetApis.recordApi.load( - common.joinKey("Products", productId) - ); - - const version = await productSetApis.recordApi.load( - common.joinKey("Products", productId, "Versions", versionId) - ); - - const instance = await productSetApis.recordApi.getNew( - common.joinKey(product.key, "Versions", ) - ); - - - +const {common, getAppApis} = require("budibase-core"); +const {getDatabaseManager} = require("./helpers"); + +module.exports = async (productSetId, productId, versionId) => { + const databaseManager = getDatabaseManager(datastoreModule); + const masterDatastore = datastoreModule.getDatastore( + databaseManager.masterDatastoreConfig + ); + + const master = await getAppApis(masterDatastore); + + const productSet = await master.recordApi.load( + common.joinKey("ProductSets", productSetId) + ); + + const prodcutSetDatastore = datastoreModule.getDatastore( + productSet.datastoreConfig + ); + + const productSetApis = await getAppApis(prodcutSetDatastore); + const product = await productSetApis.recordApi.load( + common.joinKey("Products", productId) + ); + + const version = await productSetApis.recordApi.load( + common.joinKey("Products", productId, "Versions", versionId) + ); + + const instance = await productSetApis.recordApi.getNew( + common.joinKey(product.key, "Versions", ) + ); + + + } \ No newline at end of file diff --git a/initialise/createMasterDb.js b/initialise/createMasterDb.js index 6d22a584d..a5c787d5b 100644 --- a/initialise/createMasterDb.js +++ b/initialise/createMasterDb.js @@ -1,54 +1,41 @@ -const {initialiseData, +const {initialiseData, setupDatastore, getTemplateApi} = require("budibase-core"); -const {newField, getDatabaseManager, +const {getApisForUser, getDatabaseManager, getApisWithFullAccess} = require("./helpers"); - -module.exports = async (datastoreModule, username, password) => { - - const databaseManager = getDatabaseManager(datastoreModule); - - const masterDbConfig = await databaseManager.createEmptyMasterDb(); - const datastore = datastoreModule.getDatastore(masterDbConfig); - - const templateApi = getTemplateApi(); - const root = templateApi.getNewRootLevel(); - const productSets = templateApi.getNewCollectionTemplate(root); - productSets.name = "ProductSets"; - - const productSet = templateApi.getNewRecordTemplate(productSets); - productSet.name = "ProductSet"; - - const newProductSetField = newField(templateApi, productSet); - newProductSetField("name", "string", true); - newProductSetField("dbRootConfig", "string"); - - const products = templateApi.getNewCollectionTemplate(productSet); - products.name = "Products"; - - const product = templateApi.getNewRecordTemplate(products); - product.name = "product"; - - const newProductField = newField(templateApi, product); - newProductField("name", "string", true); - newProductField("domain", "string", true); - newProductField("datastoreConfig", "string", true); - - - await initialiseData(datastore, { - heirarchy:root, actions:[], triggers:[] - }); - - const bb = await getApisWithFullAccess(datastore); - - const fullAccess = bb.authApi.getNewAccessLevel(); - fullAccess.permissions = bb.authApi.generateFullPermissions(); - fullAccess.name = "Full Access"; - await bb.authApi.saveAccessLevels([fullAccess]); - const seedUser = bb.authApi.getNewUser(); - seedUser.name = username; - seedUser.accessLevels = ["Full Access"]; - await bb.authApi.createUser(seedUser, password); - - return masterDbConfig; +const masterDbAppDefinition = require("../appPackages/master/appDefinition.json"); +const masterDbAccessLevels = require("../appPackages/master/access_levels.json"); + +module.exports = async (datastoreModule, rootConfig, username, password) => { + try { + const databaseManager = getDatabaseManager(datastoreModule, rootConfig); + + await databaseManager.createEmptyMasterDb(); + const masterDbConfig = databaseManager.masterDatastoreConfig; + const datastore = setupDatastore( + datastoreModule.getDatastore(masterDbConfig) + ); + + const templateApi = getTemplateApi({datastore}); + + await initialiseData(datastore, { + heirarchy:templateApi.constructHeirarchy(masterDbAppDefinition.hierarchy), + actions:masterDbAppDefinition.actions, + triggers:masterDbAppDefinition.triggers + }); + + const bbMaster = await getApisWithFullAccess(datastore); + await bbMaster.authApi.saveAccessLevels(masterDbAccessLevels); + const user = bbMaster.authApi.getNewUser(); + user.name = username; + user.accessLevels= ["owner"]; + await bbMaster.authApi.createUser(user, password); + + return await getApisForUser(datastore, username, password); + } catch(e) { + throw e; + } }; + + + diff --git a/initialise/createProductSetDb.js b/initialise/createProductSetDb.js deleted file mode 100644 index cd245dbfb..000000000 --- a/initialise/createProductSetDb.js +++ /dev/null @@ -1,78 +0,0 @@ -const {initialiseData, getTemplateApi, - getAppApis} = require("budibase-core"); -const {newField, getDatabaseManager} = require("./helpers"); - -module.exports = async (datastoreModule, productSetName, - username, password) => { - - const databaseManager = getDatabaseManager(datastoreModule); - const masterDatastore = datastoreModule.getDatastore( - databaseManager.masterDatastoreConfig - ); - - const masterApi = await getAppApis(masterDatastore); - const ps = masterApi.recordApi.getNew("/ProductSets", "ProductSet"); - - const psDatastoreConfig = await databaseManager.createEmptyProductSetDb(ps.id); - ps.datastoreConfig = psDatastoreConfig; - ps.name = productSetName; - await bb.recordApi.save(ps); - - const datastore = datastoreFactory(psDatastoreConfig); - const templateApi = getTemplateApi(); - - const root = templateApi.getNewRootLevel(); - const products = templateApi.getNewCollectionTemplate(root, "Products"); - - const product = templateApi.getNewRecordTemplate(products); - product.name = "Product"; - - const newProductField = newField(templateApi, product); - newProductField("name", "string", true); - newProductField("domain", "string", true); - newProductField("certificate", "string", true); - - var productVersionsRefIndex = templateApi.getNewIndexTemplate(products); - - const versions = templateApi.getNewCollectionTemplate(product, "versions", false); - const version = templateApi.getNewRecordTemplate(versions); - const newVersionField = newField(templateApi, version); - newVersionField("date", "datetime", true); - newVersionField("description", "string", false); - newVersionField("appDefinition", "file", false); - newVersionField("publicFiles", "array", false); - const deployable = newVersionField("deployable", "bool", false) - deployable.getInitialValue = "false"; - deployable.typeOptions.allowNulls = false; - - const versionLookup = templateApi.getNewIndexTemplate(product); - versionLookup.name = "versionLookup"; - versionLookup.map = "return ({description:record.description, deployable:record.deployable});"; - versionLookup.allowedRecordNodeIds = [version.recordNodeId]; - - - - const productInstances = templateApi.getNewCollectionTemplate(product); - productInstances.name = "ProductInstances"; - const productInstance = templateApi.getNewRecordTemplate(productInstances); - productInstance.name = "ProductInstance"; - const newProductInstanceField = newField(templateApi, productInstance); - newProductInstanceField("description", "string", true); - const versionReference = newProductInstanceField("version", "reference"); - versionReference.typeOptions.indexNodeKey = versions.indexes[0].nodeKey(); - - await initialiseData(datastore, { - heirarchy:root, actions:[], triggers:[] - }); - - const bb = await getApisWithFullAccess(datastore); - const fullAccess = bb.authApi.getNewAccessLevel(); - fullAccess.permissions = bb.authApi.generateFullPermissions(); - fullAccess.name = "Full Access"; - await bb.authApi.saveAccessLevels([fullAccess]); - const seedUser = bb.authApi.getNewUser(); - seedUser.name = username; - seedUser.accessLevels = ["Full Access"]; - await bb.authApi.createUser(seedUser, password); - -}; \ No newline at end of file diff --git a/initialise/helpers.js b/initialise/helpers.js index 77e7c0ddb..57cc807ca 100644 --- a/initialise/helpers.js +++ b/initialise/helpers.js @@ -1,17 +1,5 @@ const crypto = require("../server/nodeCrypto"); -const { - getDatabaseFactory} = require("budibase-core"); - -module.exports.newField = (templateApi, recordNode) => (name, type, mandatory=false) => { - const field = templateApi.getNewField(type); - field.name = name; - templateApi.addField(recordNode, field); - if(mandatory) { - templateApi.addRecordValidationRule(recordNode) - (templateApi.commonValidationRules.fieldNotEmpty) - } - return field; -}; +const {getDatabaseManager, getAppApis} = require("budibase-core"); module.exports.getApisWithFullAccess = async (datastore) => { const bb = await getAppApis( @@ -20,10 +8,22 @@ module.exports.getApisWithFullAccess = async (datastore) => { crypto ); - bb.asFullAccess(); + bb.withFullAccess(); return bb; }; -module.exports.getDatabaseManager = (datastoreModule) => - getDatabaseFactory(datastoreModule.databaseManager); +module.exports.getApisForUser = async (datastore, username, password) => { + const bb = await getAppApis( + datastore, + null, null, null, + crypto + ); + + await bb.authenticateAs(username, password); + + return bb; +} + +module.exports.getDatabaseManager = (datastoreModule, datastoreConfig) => + getDatabaseManager(datastoreModule.databaseManager(datastoreConfig)); diff --git a/initialise/initialise-budibase.js b/initialise/initialise-budibase.js deleted file mode 100644 index 5f9d647aa..000000000 --- a/initialise/initialise-budibase.js +++ /dev/null @@ -1,12 +0,0 @@ -const createMasterDb = require("./createMasterDb"); -//datastore.createDb("productSet", "product", "instance"); - -module.exports = async (datastoreFactory, rootDataOpts, username, password) => { - await createMasterDb( - datastoreFactory, rootDataOpts, - username, password); - - - -} - diff --git a/initialise/initialiseBudibase.js b/initialise/initialiseBudibase.js new file mode 100644 index 000000000..15fb339f3 --- /dev/null +++ b/initialise/initialiseBudibase.js @@ -0,0 +1,76 @@ +const create = require("./createMasterDb"); +const argv = require("yargs").argv + +const readline = require('readline'); +const { promisify } = require('util'); +const rimraf = promisify(require("rimraf")); +const fs = require("fs") + +const mkdir = promisify(fs.mkdir); + +readline.Interface.prototype.question[promisify.custom] = function(prompt) { + return new Promise(resolve => + readline.Interface.prototype.question.call(this, prompt, resolve), + ); +}; +readline.Interface.prototype.questionAsync = promisify( + readline.Interface.prototype.question, +); + + +const question = async (q) => { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout, + }); + var answer = await rl.questionAsync(q); + rl.close(); + return answer; +} + +(async () => { + const datastore = argv.datastore + ? argv.datastore + : await question("Datastore: "); + + + if(!datastore) throw new Error("Datastore not supplied!"); + + + + const username = argv.username + ? argv.username + : await question("Owner Username: "); + + const password = argv.password + ? argv.password + : await question("Owner Password: "); + + if(!username) throw new Error("Username not supplied!"); + if(!password) throw new Error("Password not supplied!"); + + var datastoreModule = require("../datastores/datastores/" + datastore); + + const rootconfig = {}; + for(let parameter in datastoreModule.configParameters) { + rootconfig[parameter] = argv[parameter] + ? argv[parameter] + : await question(`${datastoreModule.configParameters[parameter]}: `); + } + + const cleanDev = argv.cleanDev ? true : false; + + if(cleanDev) { + try { + await rimraf(rootconfig.rootPath); + } + catch(_){} + await mkdir(rootconfig.rootPath); + } + + await create( + datastoreModule, + rootconfig, + username, + password) +})() \ No newline at end of file diff --git a/package.json b/package.json index 0cc7e668b..31b14e81b 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,9 @@ "author": "Michael Shanks", "license": "AGPL-3.0-or-later", "dependencies": { - "budibase-core": "git+ssh://git@gitlab.com/budibase-dist/budibase-core.git" + "argon2": "^0.23.0", + "budibase-core": "git+ssh://git@github.com:Budibase/budibase-core-dist.git", + "rimraf": "^2.6.3", + "yargs": "^13.2.4" } } diff --git a/server/nodeCrypto.js b/server/nodeCrypto.js index e0efb9a89..ca67de730 100644 --- a/server/nodeCrypto.js +++ b/server/nodeCrypto.js @@ -1,5 +1,5 @@ const {hash, verify} = require("argon2"); -module.export = { +module.exports = { hash, verify }; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 743f60790..449c8fd0b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,35 +5,496 @@ "@nx-js/compiler-util@^2.0.0": version "2.0.0" resolved "https://registry.yarnpkg.com/@nx-js/compiler-util/-/compiler-util-2.0.0.tgz#c74c12165fa2f017a292bb79af007e8fce0af297" + integrity sha512-AxSQbwj9zqt8DYPZ6LwZdytqnwfiOEdcFdq4l8sdjkZmU2clTht7RDLCI8xvkp7KqgcNaOGlTeCM55TULWruyQ== + +"@phc/format@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@phc/format/-/format-0.5.0.tgz#a99d27a83d78b3100a191412adda04315e2e3aba" + integrity sha512-JWtZ5P1bfXU0bAtTzCpOLYHDXuxSVdtL/oqz4+xa97h8w9E5IlVN333wugXVFv8vZ1hbXObKQf1ptXmFFcMByg== + dependencies: + safe-buffer "^5.1.2" + +ansi-regex@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz#8b9f8f08cf1acb843756a839ca8c7e3168c51997" + integrity sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg== + +ansi-styles@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +argon2@^0.23.0: + version "0.23.0" + resolved "https://registry.yarnpkg.com/argon2/-/argon2-0.23.0.tgz#0b3cd77ed1501b2ebef23462d91cf114dfee5562" + integrity sha512-+CC/bLeHF3c1JmTgmeuVSCsNc/hk2yFPYdxvfX37G6VHgZAZ0gMezPI/qsYUy4YXGya8dGBUEu85itYtf8eIQQ== + dependencies: + "@phc/format" "^0.5.0" + node-addon-api "^1.6.3" + node-gyp-build "^4.1.0" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" "budibase-core@git+ssh://git@gitlab.com/budibase-dist/budibase-core.git": version "1.0.0" - resolved "git+ssh://git@gitlab.com/budibase-dist/budibase-core.git#7d0b44b6f7439b4b4f48b7b9c12e9eb3fa045203" + resolved "git+ssh://git@gitlab.com/budibase-dist/budibase-core.git#cd13d3f4212453347f0ae17ff93581ad687a4cea" dependencies: "@nx-js/compiler-util" "^2.0.0" date-fns "^1.29.0" lodash "^4.17.11" - papaparse "^4.3.7" + lunr "^2.3.5" + safe-buffer "^5.1.2" shortid "^2.2.8" + string_decoder "^1.2.0" + +camelcase@^5.0.0: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + +cross-spawn@^6.0.0: + version "6.0.5" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" + integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== + dependencies: + nice-try "^1.0.4" + path-key "^2.0.1" + semver "^5.5.0" + shebang-command "^1.2.0" + which "^1.2.9" date-fns@^1.29.0: version "1.30.1" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.30.1.tgz#2e71bf0b119153dbb4cc4e88d9ea5acfb50dc05c" + integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + integrity sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q== + dependencies: + once "^1.4.0" + +execa@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz#c6236a5bb4df6d6f15e88e7f017798216749ddd8" + integrity sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA== + dependencies: + cross-spawn "^6.0.0" + get-stream "^4.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + +get-caller-file@^2.0.1: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-stream@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + +glob@^7.1.3: + version "7.1.4" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255" + integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + +invert-kv@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" + integrity sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA== + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + +lcid@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" + integrity sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA== + dependencies: + invert-kv "^2.0.0" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" lodash@^4.17.11: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== + +lunr@^2.3.5: + version "2.3.6" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.6.tgz#f278beee7ffd56ad86e6e478ce02ab2b98c78dd5" + integrity sha512-swStvEyDqQ85MGpABCMBclZcLI/pBIlu8FFDtmX197+oEgKloJ67QnB+Tidh0340HmLMs39c4GrkPY3cmkXp6Q== + +map-age-cleaner@^0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" + integrity sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w== + dependencies: + p-defer "^1.0.0" + +mem@^4.0.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-4.3.0.tgz#461af497bc4ae09608cdb2e60eefb69bff744178" + integrity sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w== + dependencies: + map-age-cleaner "^0.1.1" + mimic-fn "^2.0.0" + p-is-promise "^2.0.0" + +mimic-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== + dependencies: + brace-expansion "^1.1.7" nanoid@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.0.3.tgz#dde999e173bc9d7bd2ee2746b89909ade98e075e" + integrity sha512-NbaoqdhIYmY6FXDRB4eYtDVC9Z9eCbn8TyaiC16LNKtpPv/aqa0tOPD8y6gNE4yUNnaZ7LLhYtXOev/6+cBtfw== + +nice-try@^1.0.4: + version "1.0.5" + resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" + integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== + +node-addon-api@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.6.3.tgz#3998d4593e2dca2ea82114670a4eb003386a9fe1" + integrity sha512-FXWH6mqjWgU8ewuahp4spec8LkroFZK2NicOv6bNwZC3kcwZUI8LeZdG80UzTSLLhK4T7MsgNwlYDVRlDdfTDg== + +node-gyp-build@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.0.tgz#3bc3dd7dd4aafecaf64a2e3729e785bc3cdea565" + integrity sha512-rGLv++nK20BG8gc0MzzcYe1Nl3p3mtwJ74Q2QD0HTEDKZ6NvOFSelY6s2QBPWIHRR8h7hpad0LiwajfClBJfNg== + +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + +os-locale@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.1.0.tgz#a802a6ee17f24c10483ab9935719cef4ed16bf1a" + integrity sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q== + dependencies: + execa "^1.0.0" + lcid "^2.0.0" + mem "^4.0.0" + +p-defer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" + integrity sha1-n26xgvbJqozXQwBKfU+WsZaw+ww= + +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + +p-is-promise@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/p-is-promise/-/p-is-promise-2.1.0.tgz#918cebaea248a62cf7ffab8e3bca8c5f882fc42e" + integrity sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg== + +p-limit@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.0.tgz#417c9941e6027a9abcba5092dd2904e255b5fbc2" + integrity sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ== + dependencies: + p-try "^2.0.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + +path-key@^2.0.0, path-key@^2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-2.0.1.tgz#deb55cac196e3f138071911dabbc3726eb048864" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +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" + +safe-buffer@^5.1.2, safe-buffer@~5.1.0: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +semver@^5.5.0: + version "5.7.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.0.tgz#790a7cf6fea5459bac96110b29b60412dc8ff96b" + integrity sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" -papaparse@^4.3.7: - version "4.6.3" - resolved "https://registry.yarnpkg.com/papaparse/-/papaparse-4.6.3.tgz#742e5eaaa97fa6c7e1358d2934d8f18f44aee781" +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= shortid@^2.2.8: version "2.2.14" resolved "https://registry.yarnpkg.com/shortid/-/shortid-2.2.14.tgz#80db6aafcbc3e3a46850b3c88d39e051b84c8d18" + integrity sha512-4UnZgr9gDdA1kaKj/38IiudfC3KHKhDc1zi/HSxd9FQDR0VLwH3/y79tZJLsVYPsJgIjeHjqIWaWVRJUj9qZOQ== dependencies: nanoid "^2.0.0" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string_decoder@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + +y18n@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" + integrity sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w== + +yargs-parser@^13.1.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.0.tgz#7016b6dd03e28e1418a510e258be4bff5a31138f" + integrity sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs@^13.2.4: + version "13.2.4" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-13.2.4.tgz#0b562b794016eb9651b98bd37acf364aa5d6dc83" + integrity sha512-HG/DWAJa1PAnHT9JAhNa8AbAv3FPaiLzioSjCcmuXXhP8MlpHO5vwls4g4j6n30Z74GVQj8Xa62dWVx1QCGklg== + dependencies: + cliui "^5.0.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + os-locale "^3.1.0" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^13.1.0"