diff --git a/.gitignore b/.gitignore index e8af5af..6f5f8d5 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ npm-debug.log /.nyc_output /coverage /esdoc +/y-leveldb-databases diff --git a/Dockerfile b/Dockerfile index e2c9320..0ef4ad7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -16,4 +16,6 @@ RUN yarn run build EXPOSE 8080 +VOLUME ["/usr/src/app/y-leveldb-databases"] + CMD ["yarn", "run", "server"] diff --git a/README.md b/README.md index b1619d4..b51cb65 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ Now you can visit `http://localhost:8080/` to view the application. ```bash docker build . -t cattaz # --build-arg http_proxy=http://user:pass@proxy.example.com:8080 --build-arg https_proxy=http://user:pass@proxy.example.com:8080 -docker run -it -p 8080:8080 cattaz +docker run -it -p 8080:8080 -v $(pwd)/y-leveldb-databases:/usr/src/app/y-leveldb-databases cattaz ``` Now you can visit `http://localhost:8080/` to view the application. diff --git a/docker-compose.yml b/docker-compose.yml index f7f16e9..21f125c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,3 +9,5 @@ services: PORT: ${PORT:-8080} ports: - "${PORT:-8080}:8080" + volumes: + - ./y-leveldb-databases:/usr/src/app/y-leveldb-databases diff --git a/docs/ja/usage.cattaz.md b/docs/ja/usage.cattaz.md index 32b12c7..fe18799 100644 --- a/docs/ja/usage.cattaz.md +++ b/docs/ja/usage.cattaz.md @@ -20,7 +20,7 @@ yarn start ```bash docker build . -t cattaz # --build-arg http_proxy=http://user:pass@proxy.example.com:8080 --build-arg https_proxy=http://user:pass@proxy.example.com:8080 -docker run -it -p 8080:8080 cattaz +docker run -it -p 8080:8080 -v $(pwd)/y-leveldb-databases:/usr/src/app/y-leveldb-databases cattaz ``` 上記コマンドを実行後、`http://localhost:8080/`にアクセスするとアプリケーションを見ることができます。 diff --git a/docs/usage.cattaz.md b/docs/usage.cattaz.md index 9f8eacd..f3572d4 100644 --- a/docs/usage.cattaz.md +++ b/docs/usage.cattaz.md @@ -20,7 +20,7 @@ Default port is 8080. To change port number, use `PORT=12345 yarn start` instead ```bash docker build . -t cattaz # --build-arg http_proxy=http://user:pass@proxy.example.com:8080 --build-arg https_proxy=http://user:pass@proxy.example.com:8080 -docker run -it -p 8080:8080 cattaz +docker run -it -p 8080:8080 -v $(pwd)/y-leveldb-databases:/usr/src/app/y-leveldb-databases cattaz ``` Now you can visit `http://localhost:8080/` to view the application. diff --git a/package.json b/package.json index 0c95f72..bcf6884 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,8 @@ "github-markdown-css": "^2.10.0", "hast-to-hyperscript": "^5.0.0", "js-yaml": "^3.12.0", + "leveldown": "^2.1.1", + "levelup": "^2.0.1", "lodash": "^4.17.10", "mdast-util-to-hast": "^3.0.2", "prop-types": "^15.6.2", @@ -28,10 +30,12 @@ "react-split-pane": "^0.1.82", "react-timeago": "^4.1.9", "remark": "^9.0.0", + "rimraf": "^2.6.2", "socket.io": "1.3.7", "socket.io-client": "1.3.7", "whatwg-fetch": "^2.0.4", "y-array": "^10.1.4", + "y-leveldb": "^0.0.3", "y-memory": "^8.0.9", "y-text": "^9.5.1", "y-websockets-client": "^8.0.16", @@ -73,7 +77,7 @@ "postcss": "^7.0.2", "postcss-loader": "^3.0.0", "react-test-renderer": "^16.4.2", - "rimraf": "^2.6.2", + "sanitize-filename": "^1.6.1", "sinon": "^6.1.5", "source-map-explorer": "^1.6.0", "webpack": "^4.16.5", diff --git a/server.js b/server.js index 15502e3..c1f70ed 100644 --- a/server.js +++ b/server.js @@ -6,7 +6,7 @@ import 'babel-polyfill'; import Y from 'yjs'; import yWebsocketsServer from 'y-websockets-server'; -import yMemory from 'y-memory'; +import yleveldb from 'y-leveldb'; import express from 'express'; import socketIo from 'socket.io'; @@ -15,7 +15,9 @@ import bodyParser from 'body-parser'; import clone from 'lodash/clone'; import crypto from 'crypto'; -Y.extend(yWebsocketsServer, yMemory); +import LevelDBLib from './src/server/LevelDBLib'; + +Y.extend(yWebsocketsServer, yleveldb); const isProduction = process.env.NODE_ENV === 'production'; const serverMode = process.env.SERVER_MODE; @@ -27,15 +29,15 @@ const io = socketIo.listen(server); const bodyParserText = bodyParser.text(); const yInstances = {}; -const metadata = {}; +const metadata = LevelDBLib.restoreMetadata('y-leveldb-databases'); function getInstanceOfY(room) { if (yInstances[room] == null) { yInstances[room] = Y({ db: { - name: 'memory', + name: 'leveldb', dir: 'y-leveldb-databases', - namespace: room, + namespace: LevelDBLib.escapeNamespace(room), }, connector: { name: 'websockets-server', @@ -46,18 +48,16 @@ function getInstanceOfY(room) { }, share: {}, }); - metadata[room] = { - created: new Date(), - modified: new Date(), - active: 0, - }; + if (!metadata[room]) { + metadata[room] = { + created: new Date(), + modified: new Date(), + active: 0, + }; + } } return yInstances[room]; } -function removeInstanceOfY(room) { - delete yInstances[room]; - delete metadata[room]; -} function getSha1Hash(plaintext) { const sha1 = crypto.createHash('sha1'); @@ -83,13 +83,7 @@ app.post('/deletePage', bodyParserText, async (req, res) => { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Content-Type', 'application/json'); const room = req.body; - const yPromise = yInstances[room]; - if (!yPromise) { - res.end(JSON.stringify({ status: 'FAILURE', msg: 'No y instance' })); - return; - } try { - const y = await yPromise; const roomMetadata = metadata[room]; if (!roomMetadata) { res.end(JSON.stringify({ status: 'FAILURE', msg: 'No metadata' })); @@ -99,17 +93,12 @@ app.post('/deletePage', bodyParserText, async (req, res) => { res.end(JSON.stringify({ status: 'FAILURE', msg: 'There are still users on this page' })); return; } - try { - await y.destroy(); - removeInstanceOfY(room); - res.end(JSON.stringify({ status: 'SUCCESS', msg: `Delete ${room}` })); - } catch (ex) { - console.error(ex); - res.end(JSON.stringify({ status: 'FAILURE', msg: 'Y instance destroy error' })); - } + await LevelDBLib.deleteDatabase('y-leveldb-databases', room); + delete metadata[room]; + res.end(JSON.stringify({ status: 'SUCCESS', msg: `Delete ${room}` })); } catch (ex) { console.error(ex); - res.end(JSON.stringify({ status: 'FAILURE', msg: ex })); + res.end(JSON.stringify({ status: 'FAILURE', msg: 'Failed to delete database' })); } }); @@ -148,6 +137,13 @@ io.on('connection', (socket) => { const escapedRoom = encodeURIComponent(room); io.in(escapedRoom).emit('activeUser', metadata[room].active); io.in(escapedRoom).emit('clientCursor', { type: 'delete', id: getSha1Hash(socket.id) }); + if (metadata[room].active === 0) { + LevelDBLib.closeDatabase(y).then(() => { + delete yInstances[room]; + }, (ex) => { + console.error(ex); + }); + } })); rooms.splice(0, rooms.length); }); @@ -162,6 +158,13 @@ io.on('connection', (socket) => { metadata[room].active -= 1; io.in(room).emit('activeUser', metadata[room].active); io.in(room).emit('clientCursor', { type: 'delete', id: getSha1Hash(socket.id) }); + if (metadata[room].active === 0) { + LevelDBLib.closeDatabase(y).then(() => { + delete yInstances[room]; + }, (ex) => { + console.error(ex); + }); + } } }); socket.on('clientCursor', (msg) => { diff --git a/src/server/LevelDBLib.js b/src/server/LevelDBLib.js new file mode 100644 index 0000000..88ed6d0 --- /dev/null +++ b/src/server/LevelDBLib.js @@ -0,0 +1,103 @@ +import { join, sep } from 'path'; +import { lstatSync, readdirSync } from 'fs'; +import rimraf from 'rimraf'; + +const unsafeChars = /[^-_a-zA-Z0-9]/g; +const windowsReserved = /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\..*)?$/i; +const escapeSeq = /%([_0-9a-fA-F]+)%/g; + +export default class LevelDBLib { + /** + * It escapes a namespace to a safe file name. + * This function is injective. + * @param {string} namespace namespace of Level DB + * @returns {string} + */ + static escapeNamespace(namespace) { + if (!namespace) return '%_%'; + if (namespace.match(windowsReserved)) { + return `%_%${namespace}`; + } + return namespace.replace(unsafeChars, substr => `%${substr.charCodeAt(0).toString(16)}%`); + } + + /** + * Reversed function of escapeNamespace. + * @param {string} escapedNamedpace file name generated by escapeNamespace + * @returns {string} + */ + static unescapeNamespace(escapedNamedpace) { + return escapedNamedpace.replace(escapeSeq, (substr, group) => { + if (group === '_') return ''; + return String.fromCharCode(parseInt(group, 16)); + }); + } + + static restoreMetadata(path) { + const isDirectory = (source) => { + try { + return lstatSync(source).isDirectory(); + } catch (e) { + return false; + } + }; + const getDirectories = source => (isDirectory(source) ? readdirSync(source).map(name => join(source, name)).filter(isDirectory) : []); + const pages = getDirectories(path).map(p => LevelDBLib.unescapeNamespace(p.split(sep)[1])); + return pages.reduce((accumulator, p) => { + const dbPath = join(path, LevelDBLib.escapeNamespace(p)); + const directoryCreated = lstatSync(dbPath).ctime; // Not correct on Linux + const latestFileModified = new Date(Math.max(...readdirSync(dbPath).map(name => join(dbPath, name)).map(f => lstatSync(f).mtimeMs))); + return Object.assign(accumulator, { + [p]: { + created: directoryCreated, + modified: latestFileModified, + active: 0, + }, + }); + }, {}); + } + + /** + * Closes database + * @param {*} y y instance + * @returns {Promise} + */ + static closeDatabase(y) { + // Because y.close waits whenTransactionsFinished forever, + // we copied y.close and removed whenTransactionsFinished. + if (y.connector.destroy != null) { + y.connector.destroy(); + } else { + y.connector.disconnect(); + } + y.connector.disconnect(); + y.db.destroyTypes(); + const g = y.db.destroy(); + for (;;) { + const i = g.next(); + if (i.done) { + break; + } + } + return y.db.whenTransactionsFinished(); + } + + /** + * Deletes database. The database must be closed before deleting. + * @param {string} path parent directory of each levelDB database + * @param {string} page raw page name of wiki page + * @returns {Promise} + */ + static deleteDatabase(path, page) { + const dbpath = join(path, LevelDBLib.escapeNamespace(page)); + return new Promise((resolve, reject) => { + rimraf(dbpath, {}, (err) => { + if (err) { + reject(err); + return; + } + resolve(); + }); + }); + } +} diff --git a/test/server/LevelDBLib.ava.js b/test/server/LevelDBLib.ava.js new file mode 100644 index 0000000..c0d94a8 --- /dev/null +++ b/test/server/LevelDBLib.ava.js @@ -0,0 +1,93 @@ +import test from 'ava'; +import sanitize from 'sanitize-filename'; + +import LevelDBLib from '../../src/server/LevelDBLib'; + +const unsafePaths = [ + // path traversal + '/', + '/etc/passwd', + '.', + './..', + './dir/../..', + '..', + '../', + // invalid filename + '', + ' ', + 'last space ', + 'last-dot.', + 'con', + 'con.txt', + 'nul', + // illegal chars + 'question?mark?char', + 'angle<>char', + 'asterisk*char', + 'null\0char', + 'newline\nchar', + 'tab\tchar', + // path separator + 'dir/file', + 'dir\\file', +]; + +/** @test {LevelDBLib.escapeNamespace} */ +test('escapeNamespace should escape unsafe path', t => { + unsafePaths.forEach(p => { + const escaped = LevelDBLib.escapeNamespace(p); + t.not(p, escaped, 'should escape unsafe filename'); + const sanitizedEscaped = sanitize(escaped); + t.is(escaped, sanitizedEscaped, 'escaped namespace must be a safe filename'); + }); +}); + +/** @test {LevelDBLib.unescapeNamespace} */ +test('unescapeNamespace should unescape path', t => { + unsafePaths.forEach(p => { + const escaped = LevelDBLib.escapeNamespace(p); + const unescaped = LevelDBLib.unescapeNamespace(escaped); + t.is(p, unescaped); + }); +}); + +/** @test {LevelDBLib.escapeNamespace} */ +test('escapeNamespace should be injective', t => { + const inputs = new Set([ + '', + '%', + '%%', + '%%%', + '%_%', + '%%_%', + '%%__%', + '%1%', + '%01%', + ]); + const outputs = new Set(); + inputs.forEach(p => { + const escaped = LevelDBLib.escapeNamespace(p); + t.false(outputs.has(escaped), `not injective: ${p} -> ${escaped}`); + outputs.add(escaped); + }); +}); + +/** @test {LevelDBLib.escapeNamespace} */ +test('escapeNamespace should handle non-ascii chars', t => { + const inputs = new Set([ + 'ひらがな', + 'カタカナ', + '漢字', + '汉语', + '한글', + 'عربی زبان', + ]); + inputs.forEach(p => { + const escaped = LevelDBLib.escapeNamespace(p); + t.not(p, escaped, 'should escape'); + const sanitizedEscaped = sanitize(escaped); + t.is(escaped, sanitizedEscaped, 'escaped namespace must be a safe filename'); + const unescaped = LevelDBLib.unescapeNamespace(escaped); + t.is(p, unescaped, 'should restore to non-ascii'); + }); +}); diff --git a/yarn.lock b/yarn.lock index 61cde2f..1844723 100644 --- a/yarn.lock +++ b/yarn.lock @@ -501,6 +501,36 @@ abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" +abstract-leveldown@~0.12.1: + version "0.12.4" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz#29e18e632e60e4e221d5810247852a63d7b2e410" + dependencies: + xtend "~3.0.0" + +abstract-leveldown@~2.6.0, abstract-leveldown@~2.6.1: + version "2.6.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.6.3.tgz#1c5e8c6a5ef965ae8c35dfb3a8770c476b82c4b8" + dependencies: + xtend "~4.0.0" + +abstract-leveldown@~2.7.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-2.7.2.tgz#87a44d7ebebc341d59665204834c8b7e0932cc93" + dependencies: + xtend "~4.0.0" + +abstract-leveldown@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-3.0.0.tgz#5cb89f958a44f526779d740d1440e743e0c30a57" + dependencies: + xtend "~4.0.0" + +abstract-leveldown@~4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-4.0.3.tgz#cb636f4965fbe117f5c8b76a7d51dd42aaed0580" + dependencies: + xtend "~4.0.0" + accepts@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" @@ -2049,6 +2079,23 @@ bindings@1.2.x, bindings@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.2.1.tgz#14ad6113812d2d37d72e67b4cacb4bb726505f11" +bindings@~1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" + +bl@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + +bl@~0.8.1: + version "0.8.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-0.8.2.tgz#c9b6bca08d1bc2ea00fc8afb4f1a5fd1e1c66e4e" + dependencies: + readable-stream "~1.0.26" + blob@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" @@ -2237,6 +2284,21 @@ buf-compare@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/buf-compare/-/buf-compare-1.0.1.tgz#fef28da8b8113a0a0db4430b0b6467b69730b34a" +buffer-alloc-unsafe@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" + +buffer-alloc@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" + dependencies: + buffer-alloc-unsafe "^1.1.0" + buffer-fill "^1.0.0" + +buffer-fill@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" + buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -2272,6 +2334,19 @@ bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" +bytewise-core@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/bytewise-core/-/bytewise-core-1.2.3.tgz#3fb410c7e91558eb1ab22a82834577aa6bd61d42" + dependencies: + typewise-core "^1.2" + +bytewise@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/bytewise/-/bytewise-1.1.0.tgz#1d13cbff717ae7158094aa881b35d081b387253e" + dependencies: + bytewise-core "^1.2.2" + typewise "^1.0.3" + cacache@^10.0.4: version "10.0.4" resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" @@ -3298,6 +3373,12 @@ decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" +decompress-response@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" + dependencies: + mimic-response "^1.0.0" + deep-equal@^1.0.0, deep-equal@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" @@ -3326,6 +3407,24 @@ default-require-extensions@^1.0.0: dependencies: strip-bom "^2.0.0" +deferred-leveldown@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz#2cef1f111e1c57870d8bbb8af2650e587cd2f5b4" + dependencies: + abstract-leveldown "~0.12.1" + +deferred-leveldown@~1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-1.2.2.tgz#3acd2e0b75d1669924bc0a4b642851131173e1eb" + dependencies: + abstract-leveldown "~2.6.0" + +deferred-leveldown@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-3.0.0.tgz#bff7241bf156aa3635f520bedf34330c408d3307" + dependencies: + abstract-leveldown "~4.0.0" + define-properties@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" @@ -3419,7 +3518,7 @@ detect-indent@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d" -detect-libc@^1.0.2: +detect-libc@^1.0.2, detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -3755,7 +3854,7 @@ equal-length@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c" -errno@^0.1.3, errno@~0.1.7: +errno@^0.1.3, errno@~0.1.1, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" dependencies: @@ -4275,6 +4374,10 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" +expand-template@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.1.tgz#981f188c0c3a87d2e28f559bc541426ff94f21dd" + expand-tilde@^2.0.0, expand-tilde@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" @@ -4388,6 +4491,10 @@ fast-diff@^1.1.1: version "1.1.2" resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.1.2.tgz#4b62c42b8e03de3f848460b639079920695d0154" +fast-future@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/fast-future/-/fast-future-1.0.2.tgz#8435a9aaa02d79248d17d704e76259301d99280a" + fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" @@ -4606,6 +4713,10 @@ from@~0: version "0.1.7" resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + fs-extra@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" @@ -4729,6 +4840,10 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + github-markdown-css@^2.10.0: version "2.10.0" resolved "https://registry.yarnpkg.com/github-markdown-css/-/github-markdown-css-2.10.0.tgz#0612fed22816b33b282f37ef8def7a4ecabfe993" @@ -6144,6 +6259,134 @@ lcov-parse@0.0.10, lcov-parse@^0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" +level-codec@~7.0.0: + version "7.0.1" + resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-7.0.1.tgz#341f22f907ce0f16763f24bddd681e395a0fb8a7" + +level-errors@^1.0.3, level-errors@~1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.1.2.tgz#4399c2f3d3ab87d0625f7e3676e2d807deff404d" + dependencies: + errno "~0.1.1" + +level-errors@~1.0.3: + version "1.0.5" + resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-1.0.5.tgz#83dbfb12f0b8a2516bdc9a31c4876038e227b859" + dependencies: + errno "~0.1.1" + +level-iterator-stream@~1.3.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-1.3.1.tgz#e43b78b1a8143e6fa97a4f485eb8ea530352f2ed" + dependencies: + inherits "^2.0.1" + level-errors "^1.0.3" + readable-stream "^1.0.33" + xtend "^4.0.0" + +level-iterator-stream@~2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-2.0.3.tgz#ccfff7c046dcf47955ae9a86f46dfa06a31688b4" + dependencies: + inherits "^2.0.1" + readable-stream "^2.0.5" + xtend "^4.0.0" + +level-packager@~1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-1.2.1.tgz#067fedfd072b7fe3c6bec6080c0cbd4a6b2e11f4" + dependencies: + levelup "~1.3.0" + +level-post@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/level-post/-/level-post-1.0.7.tgz#19ccca9441a7cc527879a0635000f06d5e8f27d0" + dependencies: + ltgt "^2.1.2" + +level-sublevel@^6.5.4: + version "6.6.5" + resolved "https://registry.yarnpkg.com/level-sublevel/-/level-sublevel-6.6.5.tgz#acddfa2be033b9e503544e2c647f3c03d5a23fbd" + dependencies: + bytewise "~1.1.0" + levelup "~0.19.0" + ltgt "~2.1.1" + pull-defer "^0.2.2" + pull-level "^2.0.3" + pull-stream "^3.6.8" + typewiselite "~1.0.0" + xtend "~4.0.0" + +level@^1.4.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/level/-/level-1.7.0.tgz#43464a3a8ba73b2f3de56a24292805146da213a1" + dependencies: + level-packager "~1.2.0" + leveldown "~1.7.0" + +leveldown@^1.7.0-0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-1.9.0.tgz#057b4b5d9d9717f81fe88c6e6cf962f4b44961a1" + dependencies: + abstract-leveldown "~2.7.0" + bindings "~1.3.0" + fast-future "~1.0.2" + nan "~2.7.0" + prebuild-install "^2.1.0" + +leveldown@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-2.1.1.tgz#2f4d786dfe6ba3ecc63409784ce29eca110413bf" + dependencies: + abstract-leveldown "~3.0.0" + bindings "~1.3.0" + fast-future "~1.0.2" + nan "~2.8.0" + prebuild-install "^2.1.0" + +leveldown@~1.7.0: + version "1.7.2" + resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-1.7.2.tgz#5e3467bb27ee246a4a7b8dbd8fb2b16206a6eb8b" + dependencies: + abstract-leveldown "~2.6.1" + bindings "~1.2.1" + fast-future "~1.0.2" + nan "~2.6.1" + prebuild-install "^2.1.0" + +levelup@^1.0.0-4, levelup@~1.3.0: + version "1.3.9" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-1.3.9.tgz#2dbcae845b2bb2b6bea84df334c475533bbd82ab" + dependencies: + deferred-leveldown "~1.2.1" + level-codec "~7.0.0" + level-errors "~1.0.3" + level-iterator-stream "~1.3.0" + prr "~1.0.1" + semver "~5.4.1" + xtend "~4.0.0" + +levelup@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-2.0.2.tgz#83dd22ffd5ee14482143c37cddfb8457854d3727" + dependencies: + deferred-leveldown "~3.0.0" + level-errors "~1.1.0" + level-iterator-stream "~2.0.0" + xtend "~4.0.0" + +levelup@~0.19.0: + version "0.19.1" + resolved "https://registry.yarnpkg.com/levelup/-/levelup-0.19.1.tgz#f3a6a7205272c4b5f35e412ff004a03a0aedf50b" + dependencies: + bl "~0.8.1" + deferred-leveldown "~0.2.0" + errno "~0.1.1" + prr "~0.0.0" + readable-stream "~1.0.26" + semver "~5.1.0" + xtend "~3.0.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" @@ -6396,6 +6639,14 @@ longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" +looper@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/looper/-/looper-2.0.0.tgz#66cd0c774af3d4fedac53794f742db56da8f09ec" + +looper@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/looper/-/looper-3.0.0.tgz#2efa54c3b1cbaba9b94aee2e5914b0be57fbb749" + loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1: version "1.4.0" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" @@ -6424,6 +6675,14 @@ lru-cache@^4.0.1, lru-cache@^4.1.1: pseudomap "^1.0.2" yallist "^2.1.2" +ltgt@^2.1.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5" + +ltgt@~2.1.1: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.1.3.tgz#10851a06d9964b971178441c23c9e52698eece34" + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -6694,6 +6953,10 @@ mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" +mimic-response@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" + min-document@^2.19.0: version "2.19.0" resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" @@ -6821,6 +7084,18 @@ nan@~2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.4.0.tgz#fb3c59d45fe4effe215f0b890f8adf6eb32d2232" +nan@~2.6.1: + version "2.6.2" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" + +nan@~2.7.0: + version "2.7.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" + +nan@~2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -6891,6 +7166,12 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +node-abi@^2.2.0: + version "2.4.3" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.4.3.tgz#43666b7b17e57863e572409edbb82115ac7af28b" + dependencies: + semver "^5.4.1" + node-dir@^0.1.10: version "0.1.17" resolved "https://registry.yarnpkg.com/node-dir/-/node-dir-0.1.17.tgz#5f5665d93351335caabef8f1c554516cf5f1e4e5" @@ -6954,6 +7235,10 @@ nomnom@~1.6.2: colors "0.5.x" underscore "~1.4.4" +noop-logger@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -7020,7 +7305,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npmlog@^4.0.2, npmlog@^4.1.2: +npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: @@ -7899,6 +8184,26 @@ postcss@^7.0.0, postcss@^7.0.2: source-map "^0.6.1" supports-color "^5.4.0" +prebuild-install@^2.1.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.5.3.tgz#9f65f242782d370296353710e9bc843490c19f69" + dependencies: + detect-libc "^1.0.3" + expand-template "^1.0.2" + github-from-package "0.0.0" + minimist "^1.2.0" + mkdirp "^0.5.1" + node-abi "^2.2.0" + noop-logger "^0.1.1" + npmlog "^4.0.1" + os-homedir "^1.0.1" + pump "^2.0.1" + rc "^1.1.6" + simple-get "^2.7.0" + tar-fs "^1.13.0" + tunnel-agent "^0.6.0" + which-pm-runs "^1.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" @@ -7988,6 +8293,10 @@ proxy-addr@~2.0.3: forwarded "~0.1.2" ipaddr.js "1.8.0" +prr@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" + prr@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" @@ -8016,6 +8325,54 @@ public-encrypt@^4.0.0: parse-asn1 "^5.0.0" randombytes "^2.0.1" +pull-cat@^1.1.9: + version "1.1.11" + resolved "https://registry.yarnpkg.com/pull-cat/-/pull-cat-1.1.11.tgz#b642dd1255da376a706b6db4fa962f5fdb74c31b" + +pull-defer@^0.2.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/pull-defer/-/pull-defer-0.2.3.tgz#4ee09c6d9e227bede9938db80391c3dac489d113" + +pull-level@^2.0.3: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pull-level/-/pull-level-2.0.4.tgz#4822e61757c10bdcc7cf4a03af04c92734c9afac" + dependencies: + level-post "^1.0.7" + pull-cat "^1.1.9" + pull-live "^1.0.1" + pull-pushable "^2.0.0" + pull-stream "^3.4.0" + pull-window "^2.1.4" + stream-to-pull-stream "^1.7.1" + +pull-live@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/pull-live/-/pull-live-1.0.1.tgz#a4ecee01e330155e9124bbbcf4761f21b38f51f5" + dependencies: + pull-cat "^1.1.9" + pull-stream "^3.4.0" + +pull-pushable@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/pull-pushable/-/pull-pushable-2.2.0.tgz#5f2f3aed47ad86919f01b12a2e99d6f1bd776581" + +pull-stream@^3.2.3, pull-stream@^3.4.0, pull-stream@^3.6.8: + version "3.6.8" + resolved "https://registry.yarnpkg.com/pull-stream/-/pull-stream-3.6.8.tgz#d63dee1c55ff2023fd380f724c387e931b752413" + +pull-window@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/pull-window/-/pull-window-2.1.4.tgz#fc3b86feebd1920c7ae297691e23f705f88552f0" + dependencies: + looper "^2.0.0" + +pump@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + pump@^2.0.0, pump@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" @@ -8415,7 +8772,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: @@ -8427,7 +8784,7 @@ read-pkg@^3.0.0: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@1.0: +readable-stream@1.0, readable-stream@~1.0.26: version "1.0.34" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" dependencies: @@ -8445,6 +8802,15 @@ readable-stream@1.1: isarray "0.0.1" string_decoder "~0.10.x" +readable-stream@^1.0.33: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + readdirp@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" @@ -8922,6 +9288,12 @@ samsam@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" +sanitize-filename@^1.6.1: + version "1.6.1" + resolved "https://registry.yarnpkg.com/sanitize-filename/-/sanitize-filename-1.6.1.tgz#612da1c96473fa02dccda92dcd5b4ab164a6772a" + dependencies: + truncate-utf8-bytes "^1.0.0" + sax@^1.1.4, sax@^1.2.4, sax@~1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" @@ -8957,6 +9329,14 @@ semver-diff@^2.0.0: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" +semver@~5.1.0: + version "5.1.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.1.tgz#a3292a373e6f3e0798da0b20641b9a9c5bc47e19" + +semver@~5.4.1: + version "5.4.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -9088,6 +9468,18 @@ signal-exit@^3.0.0, signal-exit@^3.0.1, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" +simple-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.0.tgz#7344cbb8b6e26fb27d66b2fc86f9f6d5997521c6" + +simple-get@^2.7.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-2.8.1.tgz#0e22e91d4575d87620620bc91308d57a77f44b5d" + dependencies: + decompress-response "^3.3.0" + once "^1.3.1" + simple-concat "^1.0.0" + sinon@^6.1.5: version "6.1.5" resolved "https://registry.yarnpkg.com/sinon/-/sinon-6.1.5.tgz#41451502d43cd5ffb9d051fbf507952400e81d09" @@ -9424,6 +9816,13 @@ stream-shift@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" +stream-to-pull-stream@^1.7.1: + version "1.7.2" + resolved "https://registry.yarnpkg.com/stream-to-pull-stream/-/stream-to-pull-stream-1.7.2.tgz#757609ae1cebd33c7432d4afbe31ff78650b9dde" + dependencies: + looper "^3.0.0" + pull-stream "^3.2.3" + strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" @@ -9658,6 +10057,27 @@ tapable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" +tar-fs@^1.13.0: + version "1.16.3" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.3.tgz#966a628841da2c4010406a82167cbd5e0c72d509" + dependencies: + chownr "^1.0.1" + mkdirp "^0.5.1" + pump "^1.0.0" + tar-stream "^1.1.2" + +tar-stream@^1.1.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395" + dependencies: + bl "^1.0.0" + buffer-alloc "^1.1.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.0" + xtend "^4.0.0" + tar@^4: version "4.4.6" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" @@ -9744,6 +10164,10 @@ to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" +to-buffer@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -9823,6 +10247,12 @@ trough@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/trough/-/trough-1.0.3.tgz#e29bd1614c6458d44869fc28b255ab7857ef7c24" +truncate-utf8-bytes@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz#405923909592d56f78a5818434b0b78489ca5f2b" + dependencies: + utf8-byte-length "^1.0.1" + tslib@^1.9.0: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" @@ -9866,6 +10296,20 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" +typewise-core@^1.2, typewise-core@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/typewise-core/-/typewise-core-1.2.0.tgz#97eb91805c7f55d2f941748fa50d315d991ef195" + +typewise@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/typewise/-/typewise-1.0.3.tgz#1067936540af97937cc5dcf9922486e9fa284651" + dependencies: + typewise-core "^1.2.0" + +typewiselite@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typewiselite/-/typewiselite-1.0.0.tgz#c8882fa1bb1092c06005a97f34ef5c8508e3664e" + ua-parser-js@^0.7.18: version "0.7.18" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.18.tgz#a7bfd92f56edfb117083b69e31d2aa8882d4b1ed" @@ -10148,6 +10592,10 @@ utf-8-validate@1.2.x: bindings "~1.2.1" nan "~2.4.0" +utf8-byte-length@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz#f45f150c4c66eee968186505ab93fcbb8ad6bf61" + utf8@2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/utf8/-/utf8-2.1.0.tgz#0cfec5c8052d44a23e3aaa908104e8075f95dfd5" @@ -10440,6 +10888,10 @@ which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" +which-pm-runs@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.0.0.tgz#670b3afbc552e0b55df6b7780ca74615f23ad1cb" + which@^1.2.14, which@^1.2.9, which@^1.3.0: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -10561,14 +11013,28 @@ xregexp@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: +xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" +xtend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" + y-array@^10.1.4: version "10.1.4" resolved "https://registry.yarnpkg.com/y-array/-/y-array-10.1.4.tgz#e131a5b030d6dcbca10268d4293ecf44bdae7b34" +y-leveldb@^0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/y-leveldb/-/y-leveldb-0.0.3.tgz#67390503e254682a63132c73667bbbee098cd39e" + dependencies: + level "^1.4.0" + level-sublevel "^6.5.4" + leveldown "^1.7.0-0" + levelup "^1.0.0-4" + mkdirp "^0.5.1" + y-memory@^8.0.0, y-memory@^8.0.9: version "8.0.9" resolved "https://registry.yarnpkg.com/y-memory/-/y-memory-8.0.9.tgz#551af9ca153bd344647663b91ebde59a6802b23b"