diff --git a/lerna.json b/lerna.json index aaafa6837a..39e368fc2f 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "0.1.22", + "version": "0.1.23", "npmClient": "yarn", "packages": [ "packages/*" diff --git a/package.json b/package.json index 10cebbd720..d99718ca02 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "test:e2e:ci": "lerna run cy:ci" }, "dependencies": { - "@fortawesome/fontawesome": "^1.1.8" + "@fortawesome/fontawesome": "^1.1.8", + "pouchdb-replication-stream": "^1.2.9" } } diff --git a/packages/builder/package.json b/packages/builder/package.json index a983119423..19f8a5a9cf 100644 --- a/packages/builder/package.json +++ b/packages/builder/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/builder", - "version": "0.1.22", + "version": "0.1.23", "license": "AGPL-3.0", "private": true, "scripts": { @@ -64,7 +64,7 @@ }, "dependencies": { "@budibase/bbui": "^1.34.6", - "@budibase/client": "^0.1.22", + "@budibase/client": "^0.1.23", "@budibase/colorpicker": "^1.0.1", "@fortawesome/fontawesome-free": "^5.14.0", "@sentry/browser": "5.19.1", diff --git a/packages/builder/src/components/start/AppList.svelte b/packages/builder/src/components/start/AppList.svelte index efd448b94a..0a87e63cbb 100644 --- a/packages/builder/src/components/start/AppList.svelte +++ b/packages/builder/src/components/start/AppList.svelte @@ -1,20 +1,44 @@
-
-
+ Your Apps + {#await promise} +
+ +
+ {:then apps} +
-
- {#each apps as app} - - {/each} +
+
+ {#each apps as app} + + {/each} +
-
+ {:catch err} +

{err}

+ {/await}
diff --git a/packages/builder/src/pages/index.svelte b/packages/builder/src/pages/index.svelte index 58beb4bbec..8bec57be69 100644 --- a/packages/builder/src/pages/index.svelte +++ b/packages/builder/src/pages/index.svelte @@ -5,25 +5,12 @@ import AppList from "components/start/AppList.svelte" import { onMount } from "svelte" import ActionButton from "components/common/ActionButton.svelte" - import { get } from "builderStore/api" import Spinner from "components/common/Spinner.svelte" import CreateAppModal from "components/start/CreateAppModal.svelte" + import TemplateList from "components/start/TemplateList.svelte" import { Button } from "@budibase/bbui" import analytics from "analytics" - let promise = getApps() - - async function getApps() { - const res = await get("/api/applications") - const json = await res.json() - - if (res.ok) { - return json - } else { - throw new Error(json) - } - } - let hasKey async function fetchKeys() { @@ -47,11 +34,12 @@ // Handle create app modal const { open } = getContext("simple-modal") - const showCreateAppModal = () => { + const showCreateAppModal = template => { open( CreateAppModal, { hasKey, + template, }, { closeButton: false, @@ -68,7 +56,7 @@
Welcome to the Budibase Beta
-
@@ -80,15 +68,8 @@
-{#await promise} -
- -
-{:then result} - -{:catch err} -

{err}

-{/await} + + diff --git a/packages/cli/package.json b/packages/cli/package.json index ad5614005e..d035553f10 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "budibase", - "version": "0.1.22", + "version": "0.1.23", "description": "Budibase CLI", "repository": "https://github.com/Budibase/Budibase", "homepage": "https://www.budibase.com", @@ -17,7 +17,7 @@ "author": "Budibase", "license": "AGPL-3.0-or-later", "dependencies": { - "@budibase/server": "^0.1.22", + "@budibase/server": "^0.1.23", "@inquirer/password": "^0.0.6-alpha.0", "chalk": "^2.4.2", "dotenv": "^8.2.0", diff --git a/packages/client/package.json b/packages/client/package.json index 0cfdf53f4d..7b6ea75def 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/client", - "version": "0.1.22", + "version": "0.1.23", "license": "MPL-2.0", "main": "dist/budibase-client.js", "module": "dist/budibase-client.esm.mjs", diff --git a/packages/client/src/state/eventHandlers.js b/packages/client/src/state/eventHandlers.js index 788ebf857f..05d8ef2fa3 100644 --- a/packages/client/src/state/eventHandlers.js +++ b/packages/client/src/state/eventHandlers.js @@ -1,3 +1,4 @@ +import api from "../api" import renderTemplateString from "./renderTemplateString" export const EVENT_TYPE_MEMBER_NAME = "##eventHandlerType" @@ -5,6 +6,9 @@ export const EVENT_TYPE_MEMBER_NAME = "##eventHandlerType" export const eventHandlers = routeTo => { const handlers = { "Navigate To": param => routeTo(param && param.url), + "Create Record": api.createRecord, + "Update Record": api.updateRecord, + "Trigger Workflow": api.triggerWorkflow, } // when an event is called, this is what gets run diff --git a/packages/server/build/icon.icns b/packages/server/build/icon.icns index 82da3dde6e..0b609a3bb4 100644 Binary files a/packages/server/build/icon.icns and b/packages/server/build/icon.icns differ diff --git a/packages/server/builder/assets/roboto-v20-latin-ext_latin-300.woff b/packages/server/builder/assets/roboto-v20-latin-ext_latin-300.woff deleted file mode 100644 index 72f1207930..0000000000 Binary files a/packages/server/builder/assets/roboto-v20-latin-ext_latin-300.woff and /dev/null differ diff --git a/packages/server/builder/assets/roboto-v20-latin-ext_latin-300.woff2 b/packages/server/builder/assets/roboto-v20-latin-ext_latin-300.woff2 deleted file mode 100644 index 05fda6ab5c..0000000000 Binary files a/packages/server/builder/assets/roboto-v20-latin-ext_latin-300.woff2 and /dev/null differ diff --git a/packages/server/builder/assets/roboto-v20-latin-ext_latin-500.woff b/packages/server/builder/assets/roboto-v20-latin-ext_latin-500.woff deleted file mode 100644 index fb70b7e915..0000000000 Binary files a/packages/server/builder/assets/roboto-v20-latin-ext_latin-500.woff and /dev/null differ diff --git a/packages/server/builder/assets/roboto-v20-latin-ext_latin-500.woff2 b/packages/server/builder/assets/roboto-v20-latin-ext_latin-500.woff2 deleted file mode 100644 index 96981bc870..0000000000 Binary files a/packages/server/builder/assets/roboto-v20-latin-ext_latin-500.woff2 and /dev/null differ diff --git a/packages/server/builder/assets/roboto-v20-latin-ext_latin-700.woff b/packages/server/builder/assets/roboto-v20-latin-ext_latin-700.woff deleted file mode 100644 index d023f3de32..0000000000 Binary files a/packages/server/builder/assets/roboto-v20-latin-ext_latin-700.woff and /dev/null differ diff --git a/packages/server/builder/assets/roboto-v20-latin-ext_latin-700.woff2 b/packages/server/builder/assets/roboto-v20-latin-ext_latin-700.woff2 deleted file mode 100644 index fd49210352..0000000000 Binary files a/packages/server/builder/assets/roboto-v20-latin-ext_latin-700.woff2 and /dev/null differ diff --git a/packages/server/builder/assets/roboto-v20-latin-ext_latin-900.woff b/packages/server/builder/assets/roboto-v20-latin-ext_latin-900.woff deleted file mode 100644 index 397450501b..0000000000 Binary files a/packages/server/builder/assets/roboto-v20-latin-ext_latin-900.woff and /dev/null differ diff --git a/packages/server/builder/assets/roboto-v20-latin-ext_latin-900.woff2 b/packages/server/builder/assets/roboto-v20-latin-ext_latin-900.woff2 deleted file mode 100644 index 5cd76971f1..0000000000 Binary files a/packages/server/builder/assets/roboto-v20-latin-ext_latin-900.woff2 and /dev/null differ diff --git a/packages/server/builder/assets/roboto-v20-latin-ext_latin-regular.woff b/packages/server/builder/assets/roboto-v20-latin-ext_latin-regular.woff deleted file mode 100644 index f9849dfbee..0000000000 Binary files a/packages/server/builder/assets/roboto-v20-latin-ext_latin-regular.woff and /dev/null differ diff --git a/packages/server/builder/assets/roboto-v20-latin-ext_latin-regular.woff2 b/packages/server/builder/assets/roboto-v20-latin-ext_latin-regular.woff2 deleted file mode 100644 index 1f7dd5b890..0000000000 Binary files a/packages/server/builder/assets/roboto-v20-latin-ext_latin-regular.woff2 and /dev/null differ diff --git a/packages/server/builder/assets/rocket.jpg b/packages/server/builder/assets/rocket.jpg deleted file mode 100644 index cc2edf02a4..0000000000 Binary files a/packages/server/builder/assets/rocket.jpg and /dev/null differ diff --git a/packages/server/builder/assets/spacex.jpg b/packages/server/builder/assets/spacex.jpg deleted file mode 100644 index 30004eadd9..0000000000 Binary files a/packages/server/builder/assets/spacex.jpg and /dev/null differ diff --git a/packages/server/package.json b/packages/server/package.json index ae90b7b8b5..1875e44285 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@budibase/server", - "version": "0.1.22", + "version": "0.1.23", "description": "Budibase Web Server", "main": "src/electron.js", "repository": { @@ -42,7 +42,7 @@ "author": "Michael Shanks", "license": "AGPL-3.0-or-later", "dependencies": { - "@budibase/client": "^0.1.22", + "@budibase/client": "^0.1.23", "@koa/router": "^8.0.0", "@sendgrid/mail": "^7.1.1", "@sentry/node": "^5.19.2", diff --git a/packages/server/scripts/exportAppTemplate.js b/packages/server/scripts/exportAppTemplate.js new file mode 100755 index 0000000000..95ab8c718c --- /dev/null +++ b/packages/server/scripts/exportAppTemplate.js @@ -0,0 +1,40 @@ +#!/usr/bin/env node +const { exportTemplateFromApp } = require("../src/utilities/templates") +const yargs = require("yargs") + +// Script to export a chosen budibase app into a package +// Usage: ./scripts/exportAppTemplate.js export --name=Funky --instanceId=someInstanceId --appId=appId + +yargs + .command( + "export", + "Export an existing budibase application to the .budibase/templates directory", + { + name: { + description: "The name of the newly exported template", + alias: "n", + type: "string", + }, + instanceId: { + description: "The instanceId to dump the database for", + alias: "inst", + type: "string", + }, + appId: { + description: "The appId of the application you want to export", + alias: "app", + type: "string", + }, + }, + async args => { + console.log("Exporting app..") + const exportPath = await exportTemplateFromApp({ + templateName: args.name, + instanceId: args.instanceId, + appId: args.appId, + }) + console.log(`Template ${args.name} exported to ${exportPath}`) + } + ) + .help() + .alias("help", "h").argv diff --git a/packages/server/src/api/controllers/application.js b/packages/server/src/api/controllers/application.js index ea8e348fa5..75d6f9544f 100644 --- a/packages/server/src/api/controllers/application.js +++ b/packages/server/src/api/controllers/application.js @@ -66,6 +66,7 @@ exports.create = async function(ctx) { userInstanceMap: {}, componentLibraries: ["@budibase/standard-components"], name: ctx.request.body.name, + template: ctx.request.body.template, } const { rev } = await db.put(newApplication) @@ -75,9 +76,13 @@ exports.create = async function(ctx) { appId: newApplication._id, }, request: { - body: { name: `dev-${clientId}` }, + body: { + name: `dev-${clientId}`, + template: ctx.request.body.template, + }, }, } + await instanceController.create(createInstCtx) newApplication.instances.push(createInstCtx.body) @@ -154,6 +159,19 @@ const createEmptyAppPackage = async (ctx, app) => { name: npmFriendlyAppName(app.name), }) + // if this app is being created from a template, + // copy the frontend page definition files from + // the template directory. + if (app.template) { + const templatePageDefinitions = join( + appsFolder, + "templates", + app.template.key, + "pages" + ) + await copy(templatePageDefinitions, join(appsFolder, app._id, "pages")) + } + const mainJson = await updateJsonFile( join(appsFolder, app._id, "pages", "main", "page.json"), app diff --git a/packages/server/src/api/controllers/instance.js b/packages/server/src/api/controllers/instance.js index 02697bb9a0..c0997596e2 100644 --- a/packages/server/src/api/controllers/instance.js +++ b/packages/server/src/api/controllers/instance.js @@ -1,9 +1,12 @@ +const fs = require("fs") const CouchDB = require("../../db") const client = require("../../db/clientDb") const newid = require("../../db/newid") +const { downloadTemplate } = require("../../utilities/templates") exports.create = async function(ctx) { const instanceName = ctx.request.body.name + const template = ctx.request.body.template const { appId } = ctx.user const appShortId = appId.substring(0, 7) const instanceId = `inst_${appShortId}_${newid()}` @@ -28,6 +31,16 @@ exports.create = async function(ctx) { budibaseApp.instances.push(instance) await clientDb.put(budibaseApp) + // replicate the template data to the instance DB + if (template) { + const templatePath = await downloadTemplate(...template.key.split("/")) + const dbDumpReadStream = fs.createReadStream(`${templatePath}/db/dump.txt`) + const { ok } = await db.load(dbDumpReadStream) + if (!ok) { + ctx.throw(500, "Error loading database dump from template.") + } + } + ctx.status = 200 ctx.message = `Instance Database ${instanceName} successfully provisioned.` ctx.body = instance diff --git a/packages/server/src/api/controllers/static.js b/packages/server/src/api/controllers/static.js index 663c4c7257..f0388fdb86 100644 --- a/packages/server/src/api/controllers/static.js +++ b/packages/server/src/api/controllers/static.js @@ -2,7 +2,7 @@ const send = require("koa-send") const { resolve, join } = require("path") const jwt = require("jsonwebtoken") const fetch = require("node-fetch") -const fs = require("fs") +const fs = require("fs-extra") const uuid = require("uuid") const AWS = require("aws-sdk") const { prepareUploadForS3 } = require("./deploy/aws") diff --git a/packages/server/src/api/controllers/templates.js b/packages/server/src/api/controllers/templates.js new file mode 100644 index 0000000000..c7be43b4e3 --- /dev/null +++ b/packages/server/src/api/controllers/templates.js @@ -0,0 +1,44 @@ +const fetch = require("node-fetch") +const { + downloadTemplate, + exportTemplateFromApp, +} = require("../../utilities/templates") + +const DEFAULT_TEMPLATES_BUCKET = + "prod-budi-templates.s3-eu-west-1.amazonaws.com" + +exports.fetch = async function(ctx) { + const { type = "app" } = ctx.query + + const response = await fetch( + `https://${DEFAULT_TEMPLATES_BUCKET}/manifest.json` + ) + const json = await response.json() + ctx.body = Object.values(json.templates[type]) +} + +exports.downloadTemplate = async function(ctx) { + const { type, name } = ctx.params + + await downloadTemplate(type, name) + + ctx.body = { + message: `template ${type}:${name} downloaded successfully.`, + } +} + +exports.exportTemplateFromApp = async function(ctx) { + const { appId, instanceId } = ctx.user + const { templateName } = ctx.request.body + + await exportTemplateFromApp({ + appId, + instanceId, + templateName, + }) + + ctx.status = 200 + ctx.body = { + message: `Created template: ${templateName}`, + } +} diff --git a/packages/server/src/api/index.js b/packages/server/src/api/index.js index 0ab10e3e4d..2688baf832 100644 --- a/packages/server/src/api/index.js +++ b/packages/server/src/api/index.js @@ -19,6 +19,7 @@ const { automationRoutes, accesslevelRoutes, apiKeysRoutes, + templatesRoutes, analyticsRoutes, } = require("./routes") @@ -90,6 +91,9 @@ router.use(automationRoutes.allowedMethods()) router.use(deployRoutes.routes()) router.use(deployRoutes.allowedMethods()) + +router.use(templatesRoutes.routes()) +router.use(templatesRoutes.allowedMethods()) // end auth routes router.use(pageRoutes.routes()) diff --git a/packages/server/src/api/routes/index.js b/packages/server/src/api/routes/index.js index 0a5b0b1934..d24ef50935 100644 --- a/packages/server/src/api/routes/index.js +++ b/packages/server/src/api/routes/index.js @@ -13,6 +13,7 @@ const automationRoutes = require("./automation") const accesslevelRoutes = require("./accesslevel") const deployRoutes = require("./deploy") const apiKeysRoutes = require("./apikeys") +const templatesRoutes = require("./templates") const analyticsRoutes = require("./analytics") module.exports = { @@ -31,5 +32,6 @@ module.exports = { automationRoutes, accesslevelRoutes, apiKeysRoutes, + templatesRoutes, analyticsRoutes, } diff --git a/packages/server/src/api/routes/templates.js b/packages/server/src/api/routes/templates.js new file mode 100644 index 0000000000..3e481610ce --- /dev/null +++ b/packages/server/src/api/routes/templates.js @@ -0,0 +1,17 @@ +const Router = require("@koa/router") +const controller = require("../controllers/templates") +const authorized = require("../../middleware/authorized") +const { BUILDER } = require("../../utilities/accessLevels") + +const router = Router() + +router + .get("/api/templates", authorized(BUILDER), controller.fetch) + .get( + "/api/templates/:type/:name", + authorized(BUILDER), + controller.downloadTemplate + ) + .post("/api/templates", authorized(BUILDER), controller.exportTemplateFromApp) + +module.exports = router diff --git a/packages/server/src/db/client.js b/packages/server/src/db/client.js index 182cd8e032..a3051eea7f 100644 --- a/packages/server/src/db/client.js +++ b/packages/server/src/db/client.js @@ -1,4 +1,5 @@ const PouchDB = require("pouchdb") +const replicationStream = require("pouchdb-replication-stream") const allDbs = require("pouchdb-all-dbs") const { budibaseAppsDir } = require("../utilities/budibaseDir") const env = require("../environment") @@ -6,6 +7,9 @@ const env = require("../environment") const COUCH_DB_URL = env.COUCH_DB_URL || `leveldb://${budibaseAppsDir()}/.data/` const isInMemory = env.NODE_ENV === "jest" +PouchDB.plugin(replicationStream.plugin) +PouchDB.adapter("writableStream", replicationStream.adapters.writableStream) + let POUCH_DB_DEFAULTS = { prefix: COUCH_DB_URL, } diff --git a/packages/server/src/utilities/templates.js b/packages/server/src/utilities/templates.js new file mode 100644 index 0000000000..4aef7f7db3 --- /dev/null +++ b/packages/server/src/utilities/templates.js @@ -0,0 +1,57 @@ +const path = require("path") +const fs = require("fs-extra") +const os = require("os") +const fetch = require("node-fetch") +const stream = require("stream") +const tar = require("tar-fs") +const zlib = require("zlib") +const { promisify } = require("util") +const streamPipeline = promisify(stream.pipeline) +const { budibaseAppsDir } = require("./budibaseDir") +const CouchDB = require("../db") + +const DEFAULT_TEMPLATES_BUCKET = + "prod-budi-templates.s3-eu-west-1.amazonaws.com" + +exports.downloadTemplate = async function(type, name) { + const templateUrl = `https://${DEFAULT_TEMPLATES_BUCKET}/templates/${type}/${name}.tar.gz` + const response = await fetch(templateUrl) + + if (!response.ok) { + throw new Error( + `Error downloading template ${type}:${name}: ${response.statusText}` + ) + } + + // stream the response, unzip and extract + await streamPipeline( + response.body, + zlib.Unzip(), + tar.extract(path.join(budibaseAppsDir(), "templates", type)) + ) + + return path.join(budibaseAppsDir(), "templates", type, name) +} + +exports.exportTemplateFromApp = async function({ + appId, + templateName, + instanceId, +}) { + // Copy frontend files + const appToExport = path.join(os.homedir(), ".budibase", appId, "pages") + const templatesDir = path.join(os.homedir(), ".budibase", "templates") + fs.ensureDirSync(templatesDir) + + const templateOutputPath = path.join(templatesDir, templateName) + fs.copySync(appToExport, `${templateOutputPath}/pages`) + + fs.ensureDirSync(path.join(templateOutputPath, "db")) + const writeStream = fs.createWriteStream(`${templateOutputPath}/db/dump.txt`) + + // perform couch dump + const instanceDb = new CouchDB(instanceId) + + await instanceDb.dump(writeStream) + return templateOutputPath +} diff --git a/packages/standard-components/package.json b/packages/standard-components/package.json index e3fac8c3d6..53ea1883da 100644 --- a/packages/standard-components/package.json +++ b/packages/standard-components/package.json @@ -13,7 +13,7 @@ "dev:builder": "rollup -cw" }, "devDependencies": { - "@budibase/client": "^0.1.22", + "@budibase/client": "^0.1.23", "@rollup/plugin-commonjs": "^11.1.0", "lodash": "^4.17.15", "rollup": "^1.11.0", @@ -31,7 +31,7 @@ "keywords": [ "svelte" ], - "version": "0.1.22", + "version": "0.1.23", "license": "MIT", "gitHead": "284cceb9b703c38566c6e6363c022f79a08d5691", "dependencies": { diff --git a/yarn.lock b/yarn.lock index 8c37dc6f01..2022a94d16 100644 --- a/yarn.lock +++ b/yarn.lock @@ -913,6 +913,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argsarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/argsarray/-/argsarray-0.0.1.tgz#6e7207b4ecdb39b0af88303fa5ae22bda8df61cb" + integrity sha1-bnIHtOzbObCviDA/pa4ivajfYcs= + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -2331,6 +2336,11 @@ ignore@^4.0.6: version "4.0.6" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" +immediate@~3.0.5: + version "3.0.6" + resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" + integrity sha1-nbHb0Pr43m++D13V5Wu2BigN5ps= + import-fresh@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546" @@ -2377,7 +2387,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: +inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" @@ -2628,6 +2638,11 @@ is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -2790,6 +2805,13 @@ libnpmpublish@^1.1.1: semver "^5.5.1" ssri "^6.0.1" +lie@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + integrity sha1-mkNrLMd0bKWd56QfpGmz77dr2H4= + dependencies: + immediate "~3.0.5" + load-json-file@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" @@ -2839,6 +2861,11 @@ lodash.ismatch@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37" +lodash.pick@^4.0.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + lodash.set@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" @@ -3177,6 +3204,16 @@ natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" +ndjson@^1.4.3: + version "1.5.0" + resolved "https://registry.yarnpkg.com/ndjson/-/ndjson-1.5.0.tgz#ae603b36b134bcec347b452422b0bf98d5832ec8" + integrity sha1-rmA7NrE0vOw0e0UkIrC/mNWDLsg= + dependencies: + json-stringify-safe "^5.0.1" + minimist "^1.2.0" + split2 "^2.1.0" + through2 "^2.0.3" + neo-async@^2.6.0: version "2.6.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" @@ -3680,6 +3717,34 @@ posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" +pouch-stream@^0.4.0: + version "0.4.1" + resolved "https://registry.yarnpkg.com/pouch-stream/-/pouch-stream-0.4.1.tgz#0c6d8475c9307677627991a2f079b301c3b89bdd" + integrity sha1-DG2EdckwdndieZGi8HmzAcO4m90= + dependencies: + inherits "^2.0.1" + readable-stream "^1.0.27-1" + +pouchdb-promise@^6.0.4: + version "6.4.3" + resolved "https://registry.yarnpkg.com/pouchdb-promise/-/pouchdb-promise-6.4.3.tgz#74516f4acf74957b54debd0fb2c0e5b5a68ca7b3" + integrity sha512-ruJaSFXwzsxRHQfwNHjQfsj58LBOY1RzGzde4PM5CWINZwFjCQAhZwfMrch2o/0oZT6d+Xtt0HTWhq35p3b0qw== + dependencies: + lie "3.1.1" + +pouchdb-replication-stream@^1.2.9: + version "1.2.9" + resolved "https://registry.yarnpkg.com/pouchdb-replication-stream/-/pouchdb-replication-stream-1.2.9.tgz#aa4fa5d8f52df4825392f18e07c7e11acffc650a" + integrity sha1-qk+l2PUt9IJTkvGOB8fhGs/8ZQo= + dependencies: + argsarray "0.0.1" + inherits "^2.0.3" + lodash.pick "^4.0.0" + ndjson "^1.4.3" + pouch-stream "^0.4.0" + pouchdb-promise "^6.0.4" + through2 "^2.0.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -3862,6 +3927,16 @@ read@1, read@~1.0.1: string_decoder "^1.1.1" util-deprecate "^1.0.1" +readable-stream@^1.0.27-1: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + integrity sha1-fPTFTvZI44EwhMY23SB54WbAgdk= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readdir-scoped-modules@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309" @@ -4216,7 +4291,7 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split2@^2.0.0: +split2@^2.0.0, split2@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/split2/-/split2-2.2.0.tgz#186b2575bcf83e85b7d18465756238ee4ee42493" dependencies: @@ -4321,6 +4396,11 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= + string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -4441,7 +4521,7 @@ text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" -through2@^2.0.0, through2@^2.0.2: +through2@^2.0.0, through2@^2.0.2, through2@^2.0.3: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" dependencies: