From 6f32a89015328819bf90bcb862c5995e816400c2 Mon Sep 17 00:00:00 2001 From: Julien Fontanet Date: Mon, 5 Feb 2018 14:30:21 +0100 Subject: [PATCH] WiP: feat(xo-server-rework): new version from scratch --- .gitignore | 2 + @xen-orchestra/async-fs/.babelrc.js | 3 + @xen-orchestra/async-fs/.npmignore | 24 + @xen-orchestra/async-fs/README.md | 49 + @xen-orchestra/async-fs/package.json | 47 + @xen-orchestra/async-fs/src/index.js | 10 + @xen-orchestra/async-map/.babelrc.js | 3 + @xen-orchestra/async-map/.npmignore | 24 + @xen-orchestra/async-map/README.md | 49 + @xen-orchestra/async-map/package.json | 50 + @xen-orchestra/async-map/src/index.js | 36 + @xen-orchestra/babel-config/index.js | 54 +- @xen-orchestra/cron/package.json | 10 +- @xen-orchestra/defined/.babelrc.js | 3 + @xen-orchestra/defined/.npmignore | 24 + @xen-orchestra/defined/README.md | 49 + @xen-orchestra/defined/package.json | 48 + @xen-orchestra/defined/src/index.js | 65 + @xen-orchestra/emit-async/.babelrc.js | 3 + @xen-orchestra/emit-async/.npmignore | 24 + @xen-orchestra/emit-async/README.md | 49 + @xen-orchestra/emit-async/package.json | 48 + @xen-orchestra/emit-async/src/index.js | 24 + @xen-orchestra/log/.babelrc.js | 44 +- @xen-orchestra/log/package.json | 17 +- @xen-orchestra/mixin/.babelrc.js | 3 + @xen-orchestra/mixin/.npmignore | 24 + @xen-orchestra/mixin/README.md | 49 + @xen-orchestra/mixin/package.json | 50 + @xen-orchestra/mixin/src/index.js | 128 ++ package.json | 2 +- packages/complex-matcher/package.json | 6 +- packages/value-matcher/package.json | 8 +- packages/xo-cli/package.json | 10 +- packages/xo-server-perf-alert/package.json | 8 +- packages/xo-server-rework/.babelrc.js | 3 + packages/xo-server-rework/.npmignore | 24 + packages/xo-server-rework/README.md | 51 + packages/xo-server-rework/config.json | 40 + .../flow-typed/npm/lodash_v4.x.x.js | 1047 +++++++++++++++++ packages/xo-server-rework/package.json | 81 ++ packages/xo-server-rework/src/app/index.js | 8 + .../src/app/mixins/.index-modules | 0 .../xo-server-rework/src/app/mixins/hooks.js | 51 + .../src/app/mixins/http-request.js | 13 + .../src/app/mixins/http-server.js | 132 +++ .../xo-server-rework/src/app/mixins/jwt.js | 28 + .../src/app/mixins/plugins.js | 110 ++ .../xo-server-rework/src/app/mixins/store.js | 58 + .../xo-server-rework/src/app/mixins/users.js | 13 + .../src/app/mixins/workers.js | 88 ++ packages/xo-server-rework/src/index.js | 115 ++ .../src/node_modules/generate-token.js | 10 + .../src/node_modules/mp-atch.js | 103 ++ .../src/node_modules/mp-atch.spec.js | 103 ++ .../src/node_modules/simple-mkdirp.js | 26 + packages/xo-server-rework/src/task.js | 71 ++ packages/xo-server-rework/src/task.spec.js | 54 + packages/xo-server-rework/src/to-decorator.js | 23 + packages/xo-server-rework/src/worker.js | 23 + packages/xo-server/package.json | 24 +- yarn.lock | 910 +++++++++++++- 62 files changed, 4091 insertions(+), 165 deletions(-) create mode 100644 @xen-orchestra/async-fs/.babelrc.js create mode 100644 @xen-orchestra/async-fs/.npmignore create mode 100644 @xen-orchestra/async-fs/README.md create mode 100644 @xen-orchestra/async-fs/package.json create mode 100644 @xen-orchestra/async-fs/src/index.js create mode 100644 @xen-orchestra/async-map/.babelrc.js create mode 100644 @xen-orchestra/async-map/.npmignore create mode 100644 @xen-orchestra/async-map/README.md create mode 100644 @xen-orchestra/async-map/package.json create mode 100644 @xen-orchestra/async-map/src/index.js create mode 100644 @xen-orchestra/defined/.babelrc.js create mode 100644 @xen-orchestra/defined/.npmignore create mode 100644 @xen-orchestra/defined/README.md create mode 100644 @xen-orchestra/defined/package.json create mode 100644 @xen-orchestra/defined/src/index.js create mode 100644 @xen-orchestra/emit-async/.babelrc.js create mode 100644 @xen-orchestra/emit-async/.npmignore create mode 100644 @xen-orchestra/emit-async/README.md create mode 100644 @xen-orchestra/emit-async/package.json create mode 100644 @xen-orchestra/emit-async/src/index.js create mode 100644 @xen-orchestra/mixin/.babelrc.js create mode 100644 @xen-orchestra/mixin/.npmignore create mode 100644 @xen-orchestra/mixin/README.md create mode 100644 @xen-orchestra/mixin/package.json create mode 100644 @xen-orchestra/mixin/src/index.js create mode 100644 packages/xo-server-rework/.babelrc.js create mode 100644 packages/xo-server-rework/.npmignore create mode 100644 packages/xo-server-rework/README.md create mode 100644 packages/xo-server-rework/config.json create mode 100644 packages/xo-server-rework/flow-typed/npm/lodash_v4.x.x.js create mode 100644 packages/xo-server-rework/package.json create mode 100644 packages/xo-server-rework/src/app/index.js create mode 100644 packages/xo-server-rework/src/app/mixins/.index-modules create mode 100644 packages/xo-server-rework/src/app/mixins/hooks.js create mode 100644 packages/xo-server-rework/src/app/mixins/http-request.js create mode 100644 packages/xo-server-rework/src/app/mixins/http-server.js create mode 100644 packages/xo-server-rework/src/app/mixins/jwt.js create mode 100644 packages/xo-server-rework/src/app/mixins/plugins.js create mode 100644 packages/xo-server-rework/src/app/mixins/store.js create mode 100644 packages/xo-server-rework/src/app/mixins/users.js create mode 100644 packages/xo-server-rework/src/app/mixins/workers.js create mode 100755 packages/xo-server-rework/src/index.js create mode 100644 packages/xo-server-rework/src/node_modules/generate-token.js create mode 100644 packages/xo-server-rework/src/node_modules/mp-atch.js create mode 100644 packages/xo-server-rework/src/node_modules/mp-atch.spec.js create mode 100644 packages/xo-server-rework/src/node_modules/simple-mkdirp.js create mode 100644 packages/xo-server-rework/src/task.js create mode 100644 packages/xo-server-rework/src/task.spec.js create mode 100644 packages/xo-server-rework/src/to-decorator.js create mode 100644 packages/xo-server-rework/src/worker.js diff --git a/.gitignore b/.gitignore index 12ea9283f..d2a8592a2 100644 --- a/.gitignore +++ b/.gitignore @@ -24,6 +24,8 @@ /packages/xo-web/src/common/intl/locales/index.js /packages/xo-web/src/common/themes/index.js +/packages/xo-server-rework/src/app/mixins/index.js + npm-debug.log npm-debug.log.* pnpm-debug.log diff --git a/@xen-orchestra/async-fs/.babelrc.js b/@xen-orchestra/async-fs/.babelrc.js new file mode 100644 index 000000000..4e27ec135 --- /dev/null +++ b/@xen-orchestra/async-fs/.babelrc.js @@ -0,0 +1,3 @@ +module.exports = require('../../@xen-orchestra/babel-config')( + require('./package.json') +) diff --git a/@xen-orchestra/async-fs/.npmignore b/@xen-orchestra/async-fs/.npmignore new file mode 100644 index 000000000..e058b6bc1 --- /dev/null +++ b/@xen-orchestra/async-fs/.npmignore @@ -0,0 +1,24 @@ +/benchmark/ +/benchmarks/ +*.bench.js +*.bench.js.map + +/examples/ +example.js +example.js.map +*.example.js +*.example.js.map + +/fixture/ +/fixtures/ +*.fixture.js +*.fixture.js.map +*.fixtures.js +*.fixtures.js.map + +/test/ +/tests/ +*.spec.js +*.spec.js.map + +__snapshots__/ diff --git a/@xen-orchestra/async-fs/README.md b/@xen-orchestra/async-fs/README.md new file mode 100644 index 000000000..7d35dc618 --- /dev/null +++ b/@xen-orchestra/async-fs/README.md @@ -0,0 +1,49 @@ +# ${pkg.name} [![Build Status](https://travis-ci.org/${pkg.shortGitHubPath}.png?branch=master)](https://travis-ci.org/${pkg.shortGitHubPath}) + +> ${pkg.description} + +## Install + +Installation of the [npm package](https://npmjs.org/package/${pkg.name}): + +``` +> npm install --save ${pkg.name} +``` + +## Usage + +**TODO** + +## Development + +``` +# Install dependencies +> yarn + +# Run the tests +> yarn test + +# Continuously compile +> yarn dev + +# Continuously run the tests +> yarn dev-test + +# Build for production (automatically called by npm install) +> yarn build +``` + +## Contributions + +Contributions are *very* welcomed, either on the documentation or on +the code. + +You may: + +- report any [issue](${pkg.bugs}) + you've encountered; +- fork and create a pull request. + +## License + +${pkg.license} © [${pkg.author.name}](${pkg.author.url}) diff --git a/@xen-orchestra/async-fs/package.json b/@xen-orchestra/async-fs/package.json new file mode 100644 index 000000000..6c96d9998 --- /dev/null +++ b/@xen-orchestra/async-fs/package.json @@ -0,0 +1,47 @@ +{ + "private": true, + "name": "@xen-orchestra/async-fs", + "version": "0.0.0", + "license": "ISC", + "description": "", + "keywords": [], + "homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/packages/@xen-orchestra/async-fs", + "bugs": "https://github.com/vatesfr/xo-web/issues", + "repository": { + "type": "git", + "url": "https://github.com/vatesfr/xen-orchestra.git" + }, + "author": { + "name": "Julien Fontanet", + "email": "julien.fontanet@isonoe.net" + }, + "preferGlobal": false, + "main": "dist/", + "bin": {}, + "files": [ + "dist/" + ], + "engines": { + "node": ">=4" + }, + "dependencies": { + "promise-toolbox": "^0.9.5" + }, + "devDependencies": { + "@babel/cli": "7.0.0-beta.46", + "@babel/core": "7.0.0-beta.46", + "@babel/preset-env": "7.0.0-beta.46", + "@babel/preset-flow": "7.0.0-beta.46", + "babel-plugin-lodash": "^3.3.2", + "cross-env": "^5.1.3", + "rimraf": "^2.6.2" + }, + "scripts": { + "build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/", + "clean": "rimraf dist/", + "dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/", + "prebuild": "yarn run clean", + "predev": "yarn run prebuild", + "prepublishOnly": "yarn run build" + } +} diff --git a/@xen-orchestra/async-fs/src/index.js b/@xen-orchestra/async-fs/src/index.js new file mode 100644 index 000000000..f62d4901c --- /dev/null +++ b/@xen-orchestra/async-fs/src/index.js @@ -0,0 +1,10 @@ +// @flow + +import fs from 'fs' +import { promisifyAll } from 'promise-toolbox' + +const NOT_PROMISIFIABLE_RE = /^(?:[_A-Z]|exists$)|(?:Async|Stream|Sync)$/ + +module.exports = promisifyAll(fs, { + mapper: name => !NOT_PROMISIFIABLE_RE.test(name) && name, +}) diff --git a/@xen-orchestra/async-map/.babelrc.js b/@xen-orchestra/async-map/.babelrc.js new file mode 100644 index 000000000..4e27ec135 --- /dev/null +++ b/@xen-orchestra/async-map/.babelrc.js @@ -0,0 +1,3 @@ +module.exports = require('../../@xen-orchestra/babel-config')( + require('./package.json') +) diff --git a/@xen-orchestra/async-map/.npmignore b/@xen-orchestra/async-map/.npmignore new file mode 100644 index 000000000..e058b6bc1 --- /dev/null +++ b/@xen-orchestra/async-map/.npmignore @@ -0,0 +1,24 @@ +/benchmark/ +/benchmarks/ +*.bench.js +*.bench.js.map + +/examples/ +example.js +example.js.map +*.example.js +*.example.js.map + +/fixture/ +/fixtures/ +*.fixture.js +*.fixture.js.map +*.fixtures.js +*.fixtures.js.map + +/test/ +/tests/ +*.spec.js +*.spec.js.map + +__snapshots__/ diff --git a/@xen-orchestra/async-map/README.md b/@xen-orchestra/async-map/README.md new file mode 100644 index 000000000..7d35dc618 --- /dev/null +++ b/@xen-orchestra/async-map/README.md @@ -0,0 +1,49 @@ +# ${pkg.name} [![Build Status](https://travis-ci.org/${pkg.shortGitHubPath}.png?branch=master)](https://travis-ci.org/${pkg.shortGitHubPath}) + +> ${pkg.description} + +## Install + +Installation of the [npm package](https://npmjs.org/package/${pkg.name}): + +``` +> npm install --save ${pkg.name} +``` + +## Usage + +**TODO** + +## Development + +``` +# Install dependencies +> yarn + +# Run the tests +> yarn test + +# Continuously compile +> yarn dev + +# Continuously run the tests +> yarn dev-test + +# Build for production (automatically called by npm install) +> yarn build +``` + +## Contributions + +Contributions are *very* welcomed, either on the documentation or on +the code. + +You may: + +- report any [issue](${pkg.bugs}) + you've encountered; +- fork and create a pull request. + +## License + +${pkg.license} © [${pkg.author.name}](${pkg.author.url}) diff --git a/@xen-orchestra/async-map/package.json b/@xen-orchestra/async-map/package.json new file mode 100644 index 000000000..284dddd0b --- /dev/null +++ b/@xen-orchestra/async-map/package.json @@ -0,0 +1,50 @@ +{ + "private": true, + "name": "@xen-orchestra/async-map", + "version": "0.0.0", + "license": "ISC", + "description": "", + "keywords": [], + "homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/packages/@xen-orchestra/async-map", + "bugs": "https://github.com/vatesfr/xo-web/issues", + "repository": { + "type": "git", + "url": "https://github.com/vatesfr/xen-orchestra.git" + }, + "author": { + "name": "Julien Fontanet", + "email": "julien.fontanet@isonoe.net" + }, + "preferGlobal": false, + "main": "dist/", + "bin": {}, + "files": [ + "dist/" + ], + "browserslist": [ + ">2%" + ], + "engines": { + "node": ">=4" + }, + "dependencies": { + "lodash": "^4.17.4" + }, + "devDependencies": { + "@babel/cli": "7.0.0-beta.46", + "@babel/core": "7.0.0-beta.46", + "@babel/preset-env": "7.0.0-beta.46", + "@babel/preset-flow": "7.0.0-beta.46", + "babel-plugin-lodash": "^3.3.2", + "cross-env": "^5.1.3", + "rimraf": "^2.6.2" + }, + "scripts": { + "build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/", + "clean": "rimraf dist/", + "dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/", + "prebuild": "yarn run clean", + "predev": "yarn run prebuild", + "prepublishOnly": "yarn run build" + } +} diff --git a/@xen-orchestra/async-map/src/index.js b/@xen-orchestra/async-map/src/index.js new file mode 100644 index 000000000..9bb025fc4 --- /dev/null +++ b/@xen-orchestra/async-map/src/index.js @@ -0,0 +1,36 @@ +// @flow + +import { map } from 'lodash' + +// Similar to map() + Promise.all() but wait for all promises to +// settle before rejecting (with the first error) +const asyncMap = ( + collection: Array | Promise>, + iteratee: (value: T1, key: number, collection: Array) => T2 +): Promise> => { + if (!Array.isArray(collection)) { + return collection.then(collection => asyncMap(collection, iteratee)) + } + + let errorContainer + const onError = error => { + if (errorContainer === undefined) { + errorContainer = { error } + } + } + + return Promise.all( + map(collection, (item, key, collection) => + new Promise(resolve => { + resolve(iteratee(item, key, collection)) + }).catch(onError) + ) + ).then(values => { + if (errorContainer !== undefined) { + throw errorContainer.error + } + return values + }) +} + +export { asyncMap as default } diff --git a/@xen-orchestra/babel-config/index.js b/@xen-orchestra/babel-config/index.js index f3aa4c680..754e4bad1 100644 --- a/@xen-orchestra/babel-config/index.js +++ b/@xen-orchestra/babel-config/index.js @@ -7,34 +7,46 @@ const NODE_ENV = process.env.NODE_ENV || 'development' const __PROD__ = NODE_ENV === 'production' const __TEST__ = NODE_ENV === 'test' +const configs = { + '@babel/plugin-proposal-decorators': { + legacy: true, + }, + '@babel/preset-env' (pkg) { + return { + debug: !__TEST__, + loose: true, + shippedProposals: true, + targets: __PROD__ + ? (() => { + let node = (pkg.engines || {}).node + if (node !== undefined) { + const trimChars = '^=>~' + while (trimChars.includes(node[0])) { + node = node.slice(1) + } + return { node: node } + } + })() + : { browsers: '', node: 'current' }, + useBuiltIns: '@babel/polyfill' in (pkg.dependencies || {}) && 'usage', + } + }, +} + +const getConfig = (key, ...args) => { + const config = configs[key] + return config === undefined ? {} : typeof config === 'function' ? config(...args) : config +} + module.exports = function (pkg, plugins, presets) { plugins === undefined && (plugins = {}) - presets === undefined && (presets = {}) - presets['@babel/preset-env'] = { - debug: !__TEST__, - loose: true, - shippedProposals: true, - targets: __PROD__ - ? (() => { - let node = (pkg.engines || {}).node - if (node !== undefined) { - const trimChars = '^=>~' - while (trimChars.includes(node[0])) { - node = node.slice(1) - } - return { node: node } - } - })() - : { browsers: '', node: 'current' }, - useBuiltIns: '@babel/polyfill' in (pkg.dependencies || {}) && 'usage', - } Object.keys(pkg.devDependencies || {}).forEach(name => { if (!(name in presets) && PLUGINS_RE.test(name)) { - plugins[name] = {} + plugins[name] = getConfig(name, pkg) } else if (!(name in presets) && PRESETS_RE.test(name)) { - presets[name] = {} + presets[name] = getConfig(name, pkg) } }) diff --git a/@xen-orchestra/cron/package.json b/@xen-orchestra/cron/package.json index 6a5b82df7..3817d4cb8 100644 --- a/@xen-orchestra/cron/package.json +++ b/@xen-orchestra/cron/package.json @@ -41,10 +41,10 @@ "moment-timezone": "^0.5.14" }, "devDependencies": { - "@babel/cli": "7.0.0-beta.44", - "@babel/core": "7.0.0-beta.44", - "@babel/preset-env": "7.0.0-beta.44", - "@babel/preset-flow": "7.0.0-beta.44", + "@babel/cli": "7.0.0-beta.46", + "@babel/core": "7.0.0-beta.46", + "@babel/preset-env": "7.0.0-beta.46", + "@babel/preset-flow": "7.0.0-beta.46", "cross-env": "^5.1.3", "rimraf": "^2.6.2" }, @@ -53,7 +53,7 @@ "clean": "rimraf dist/", "dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/", "prebuild": "yarn run clean", - "predev": "yarn run clean", + "predev": "yarn run prebuild", "prepublishOnly": "yarn run build" } } diff --git a/@xen-orchestra/defined/.babelrc.js b/@xen-orchestra/defined/.babelrc.js new file mode 100644 index 000000000..4e27ec135 --- /dev/null +++ b/@xen-orchestra/defined/.babelrc.js @@ -0,0 +1,3 @@ +module.exports = require('../../@xen-orchestra/babel-config')( + require('./package.json') +) diff --git a/@xen-orchestra/defined/.npmignore b/@xen-orchestra/defined/.npmignore new file mode 100644 index 000000000..e058b6bc1 --- /dev/null +++ b/@xen-orchestra/defined/.npmignore @@ -0,0 +1,24 @@ +/benchmark/ +/benchmarks/ +*.bench.js +*.bench.js.map + +/examples/ +example.js +example.js.map +*.example.js +*.example.js.map + +/fixture/ +/fixtures/ +*.fixture.js +*.fixture.js.map +*.fixtures.js +*.fixtures.js.map + +/test/ +/tests/ +*.spec.js +*.spec.js.map + +__snapshots__/ diff --git a/@xen-orchestra/defined/README.md b/@xen-orchestra/defined/README.md new file mode 100644 index 000000000..7d35dc618 --- /dev/null +++ b/@xen-orchestra/defined/README.md @@ -0,0 +1,49 @@ +# ${pkg.name} [![Build Status](https://travis-ci.org/${pkg.shortGitHubPath}.png?branch=master)](https://travis-ci.org/${pkg.shortGitHubPath}) + +> ${pkg.description} + +## Install + +Installation of the [npm package](https://npmjs.org/package/${pkg.name}): + +``` +> npm install --save ${pkg.name} +``` + +## Usage + +**TODO** + +## Development + +``` +# Install dependencies +> yarn + +# Run the tests +> yarn test + +# Continuously compile +> yarn dev + +# Continuously run the tests +> yarn dev-test + +# Build for production (automatically called by npm install) +> yarn build +``` + +## Contributions + +Contributions are *very* welcomed, either on the documentation or on +the code. + +You may: + +- report any [issue](${pkg.bugs}) + you've encountered; +- fork and create a pull request. + +## License + +${pkg.license} © [${pkg.author.name}](${pkg.author.url}) diff --git a/@xen-orchestra/defined/package.json b/@xen-orchestra/defined/package.json new file mode 100644 index 000000000..0d7cf3006 --- /dev/null +++ b/@xen-orchestra/defined/package.json @@ -0,0 +1,48 @@ +{ + "private": true, + "name": "@xen-orchestra/defined", + "version": "0.0.0", + "license": "ISC", + "description": "", + "keywords": [], + "homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/packages/@xen-orchestra/defined", + "bugs": "https://github.com/vatesfr/xo-web/issues", + "repository": { + "type": "git", + "url": "https://github.com/vatesfr/xen-orchestra.git" + }, + "author": { + "name": "Julien Fontanet", + "email": "julien.fontanet@vates.fr" + }, + "preferGlobal": false, + "main": "dist/", + "bin": {}, + "files": [ + "dist/" + ], + "browserslist": [ + ">2%" + ], + "engines": { + "node": ">=4" + }, + "dependencies": {}, + "devDependencies": { + "@babel/cli": "7.0.0-beta.46", + "@babel/core": "7.0.0-beta.46", + "@babel/preset-env": "7.0.0-beta.46", + "@babel/preset-flow": "7.0.0-beta.46", + "babel-plugin-lodash": "^3.3.2", + "cross-env": "^5.1.3", + "rimraf": "^2.6.2" + }, + "scripts": { + "build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/", + "clean": "rimraf dist/", + "dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/", + "prebuild": "yarn run clean", + "predev": "yarn run prebuild", + "prepublishOnly": "yarn run build" + } +} diff --git a/@xen-orchestra/defined/src/index.js b/@xen-orchestra/defined/src/index.js new file mode 100644 index 000000000..4e874543e --- /dev/null +++ b/@xen-orchestra/defined/src/index.js @@ -0,0 +1,65 @@ +// @flow + +// Usage: +// +// ```js +// const httpProxy = defined( +// process.env.HTTP_PROXY, +// process.env.http_proxy +// ) +// +// const httpProxy = defined([ +// process.env.HTTP_PROXY, +// process.env.http_proxy +// ]) +// ``` +export default function defined () { + let args = arguments + let n = args.length + if (n === 1) { + args = arguments[0] + n = args.length + } + + for (let i = 0; i < n; ++i) { + let arg = arguments[i] + if (typeof arg === 'function') { + arg = get(arg) + } + if (arg !== undefined) { + return arg + } + } +} + +// Usage: +// +// ```js +// const friendName = get(() => props.user.friends[0].name) +// +// // this form can be used to avoid recreating functions: +// const getFriendName = _ => _.friends[0].name +// const friendName = get(getFriendName, props.user) +// ``` +export const get = (accessor: (input: ?any) => any, arg: ?any) => { + try { + return accessor(arg) + } catch (error) { + if (!(error instanceof TypeError)) { // avoid hidding other errors + throw error + } + } +} + +// Usage: +// +// ```js +// const httpAgent = ifDef( +// process.env.HTTP_PROXY, +// _ => new ProxyAgent(_) +// ) +// ``` +export const ifDef = (value: ?any, thenFn: (value: any) => any) => + value !== undefined + ? thenFn(value) + : value diff --git a/@xen-orchestra/emit-async/.babelrc.js b/@xen-orchestra/emit-async/.babelrc.js new file mode 100644 index 000000000..4e27ec135 --- /dev/null +++ b/@xen-orchestra/emit-async/.babelrc.js @@ -0,0 +1,3 @@ +module.exports = require('../../@xen-orchestra/babel-config')( + require('./package.json') +) diff --git a/@xen-orchestra/emit-async/.npmignore b/@xen-orchestra/emit-async/.npmignore new file mode 100644 index 000000000..e058b6bc1 --- /dev/null +++ b/@xen-orchestra/emit-async/.npmignore @@ -0,0 +1,24 @@ +/benchmark/ +/benchmarks/ +*.bench.js +*.bench.js.map + +/examples/ +example.js +example.js.map +*.example.js +*.example.js.map + +/fixture/ +/fixtures/ +*.fixture.js +*.fixture.js.map +*.fixtures.js +*.fixtures.js.map + +/test/ +/tests/ +*.spec.js +*.spec.js.map + +__snapshots__/ diff --git a/@xen-orchestra/emit-async/README.md b/@xen-orchestra/emit-async/README.md new file mode 100644 index 000000000..7d35dc618 --- /dev/null +++ b/@xen-orchestra/emit-async/README.md @@ -0,0 +1,49 @@ +# ${pkg.name} [![Build Status](https://travis-ci.org/${pkg.shortGitHubPath}.png?branch=master)](https://travis-ci.org/${pkg.shortGitHubPath}) + +> ${pkg.description} + +## Install + +Installation of the [npm package](https://npmjs.org/package/${pkg.name}): + +``` +> npm install --save ${pkg.name} +``` + +## Usage + +**TODO** + +## Development + +``` +# Install dependencies +> yarn + +# Run the tests +> yarn test + +# Continuously compile +> yarn dev + +# Continuously run the tests +> yarn dev-test + +# Build for production (automatically called by npm install) +> yarn build +``` + +## Contributions + +Contributions are *very* welcomed, either on the documentation or on +the code. + +You may: + +- report any [issue](${pkg.bugs}) + you've encountered; +- fork and create a pull request. + +## License + +${pkg.license} © [${pkg.author.name}](${pkg.author.url}) diff --git a/@xen-orchestra/emit-async/package.json b/@xen-orchestra/emit-async/package.json new file mode 100644 index 000000000..83486c4d5 --- /dev/null +++ b/@xen-orchestra/emit-async/package.json @@ -0,0 +1,48 @@ +{ + "private": true, + "name": "@xen-orchestra/emit-async", + "version": "0.0.0", + "license": "ISC", + "description": "", + "keywords": [], + "homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/packages/@xen-orchestra/emit-async", + "bugs": "https://github.com/vatesfr/xo-web/issues", + "repository": { + "type": "git", + "url": "https://github.com/vatesfr/xen-orchestra.git" + }, + "author": { + "name": "Julien Fontanet", + "email": "julien.fontanet@vates.fr" + }, + "preferGlobal": false, + "main": "dist/", + "bin": {}, + "files": [ + "dist/" + ], + "browserslist": [ + ">2%" + ], + "engines": { + "node": ">=4" + }, + "dependencies": {}, + "devDependencies": { + "@babel/cli": "7.0.0-beta.46", + "@babel/core": "7.0.0-beta.46", + "@babel/preset-env": "7.0.0-beta.46", + "@babel/preset-flow": "7.0.0-beta.46", + "babel-plugin-lodash": "^3.3.2", + "cross-env": "^5.1.3", + "rimraf": "^2.6.2" + }, + "scripts": { + "build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/", + "clean": "rimraf dist/", + "dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/", + "prebuild": "yarn run clean", + "predev": "yarn run prebuild", + "prepublishOnly": "yarn run build" + } +} diff --git a/@xen-orchestra/emit-async/src/index.js b/@xen-orchestra/emit-async/src/index.js new file mode 100644 index 000000000..3800c471c --- /dev/null +++ b/@xen-orchestra/emit-async/src/index.js @@ -0,0 +1,24 @@ +export default function emitAsync (event) { + let opts + let i = 1 + + // an option object has been passed as first param + if (typeof event !== 'string') { + opts = event + event = arguments[i++] + } + + const n = arguments.length - i + const args = new Array(n) + for (let j = 0; j < n; ++j) { + args[j] = arguments[j + i] + } + + const onError = opts != null && opts.onError + + return Promise.all(this.listeners(event).map( + listener => new Promise(resolve => { + resolve(listener.apply(this, args)) + }).catch(onError) + )) +} diff --git a/@xen-orchestra/log/.babelrc.js b/@xen-orchestra/log/.babelrc.js index 4d6b191e5..4e27ec135 100644 --- a/@xen-orchestra/log/.babelrc.js +++ b/@xen-orchestra/log/.babelrc.js @@ -1,41 +1,3 @@ -'use strict' - -const NODE_ENV = process.env.NODE_ENV || 'development' -const __PROD__ = NODE_ENV === 'production' -const __TEST__ = NODE_ENV === 'test' - -const pkg = require('./package') - -let nodeCompat = (pkg.engines || {}).node -if (nodeCompat === undefined) { - nodeCompat = '6' -} else { - const trimChars = '^=>~' - while (trimChars.includes(nodeCompat[0])) { - nodeCompat = nodeCompat.slice(1) - } -} - -module.exports = { - comments: !__PROD__, - ignore: __TEST__ ? undefined : [/\.spec\.js$/], - plugins: ['lodash'], - presets: [ - [ - '@babel/env', - { - debug: !__TEST__, - loose: true, - shippedProposals: true, - targets: __PROD__ - ? { - browsers: '>2%', - node: nodeCompat, - } - : { node: 'current' }, - useBuiltIns: '@babel/polyfill' in (pkg.dependencies || {}) && 'usage', - }, - ], - '@babel/flow', - ], -} +module.exports = require('../../@xen-orchestra/babel-config')( + require('./package.json') +) diff --git a/@xen-orchestra/log/package.json b/@xen-orchestra/log/package.json index ac80a5253..4acfc9ba1 100644 --- a/@xen-orchestra/log/package.json +++ b/@xen-orchestra/log/package.json @@ -6,7 +6,7 @@ "description": "", "keywords": [], "homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/packages/@xen-orchestra/log", - "bugs": "https://github.com/vatesfr/xo-web/issues", + "bugs": "https://github.com/vatesfr/xen-orchestra/issues", "repository": { "type": "git", "url": "https://github.com/vatesfr/xen-orchestra.git" @@ -21,19 +21,22 @@ "files": [ "dist/" ], + "browserslist": [ + ">2%" + ], "engines": { "node": ">=4" }, "dependencies": { - "@babel/polyfill": "7.0.0-beta.39", + "@babel/polyfill": "7.0.0-beta.46", "lodash": "^4.17.4", "promise-toolbox": "^0.9.5" }, "devDependencies": { - "@babel/cli": "7.0.0-beta.39", - "@babel/core": "7.0.0-beta.39", - "@babel/preset-env": "7.0.0-beta.39", - "@babel/preset-flow": "7.0.0-beta.39", + "@babel/cli": "7.0.0-beta.46", + "@babel/core": "7.0.0-beta.46", + "@babel/preset-env": "7.0.0-beta.46", + "@babel/preset-flow": "7.0.0-beta.46", "babel-plugin-lodash": "^3.3.2", "cross-env": "^5.1.3", "index-modules": "^0.3.0", @@ -44,7 +47,7 @@ "clean": "rimraf dist/", "dev": "index-modules --cjs-lazy src/transports && cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/", "prebuild": "yarn run clean", - "predev": "yarn run clean", + "predev": "yarn run prebuild", "prepublishOnly": "yarn run build" } } diff --git a/@xen-orchestra/mixin/.babelrc.js b/@xen-orchestra/mixin/.babelrc.js new file mode 100644 index 000000000..4e27ec135 --- /dev/null +++ b/@xen-orchestra/mixin/.babelrc.js @@ -0,0 +1,3 @@ +module.exports = require('../../@xen-orchestra/babel-config')( + require('./package.json') +) diff --git a/@xen-orchestra/mixin/.npmignore b/@xen-orchestra/mixin/.npmignore new file mode 100644 index 000000000..e058b6bc1 --- /dev/null +++ b/@xen-orchestra/mixin/.npmignore @@ -0,0 +1,24 @@ +/benchmark/ +/benchmarks/ +*.bench.js +*.bench.js.map + +/examples/ +example.js +example.js.map +*.example.js +*.example.js.map + +/fixture/ +/fixtures/ +*.fixture.js +*.fixture.js.map +*.fixtures.js +*.fixtures.js.map + +/test/ +/tests/ +*.spec.js +*.spec.js.map + +__snapshots__/ diff --git a/@xen-orchestra/mixin/README.md b/@xen-orchestra/mixin/README.md new file mode 100644 index 000000000..7d35dc618 --- /dev/null +++ b/@xen-orchestra/mixin/README.md @@ -0,0 +1,49 @@ +# ${pkg.name} [![Build Status](https://travis-ci.org/${pkg.shortGitHubPath}.png?branch=master)](https://travis-ci.org/${pkg.shortGitHubPath}) + +> ${pkg.description} + +## Install + +Installation of the [npm package](https://npmjs.org/package/${pkg.name}): + +``` +> npm install --save ${pkg.name} +``` + +## Usage + +**TODO** + +## Development + +``` +# Install dependencies +> yarn + +# Run the tests +> yarn test + +# Continuously compile +> yarn dev + +# Continuously run the tests +> yarn dev-test + +# Build for production (automatically called by npm install) +> yarn build +``` + +## Contributions + +Contributions are *very* welcomed, either on the documentation or on +the code. + +You may: + +- report any [issue](${pkg.bugs}) + you've encountered; +- fork and create a pull request. + +## License + +${pkg.license} © [${pkg.author.name}](${pkg.author.url}) diff --git a/@xen-orchestra/mixin/package.json b/@xen-orchestra/mixin/package.json new file mode 100644 index 000000000..c1791f826 --- /dev/null +++ b/@xen-orchestra/mixin/package.json @@ -0,0 +1,50 @@ +{ + "private": true, + "name": "@xen-orchestra/mixin", + "version": "0.0.0", + "license": "ISC", + "description": "", + "keywords": [], + "homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/packages/@xen-orchestra/mixin", + "bugs": "https://github.com/vatesfr/xo-web/issues", + "repository": { + "type": "git", + "url": "https://github.com/vatesfr/xen-orchestra.git" + }, + "author": { + "name": "Julien Fontanet", + "email": "julien.fontanet@vates.fr" + }, + "preferGlobal": false, + "main": "dist/", + "bin": {}, + "files": [ + "dist/" + ], + "browserslist": [ + ">2%" + ], + "engines": { + "node": ">=4" + }, + "dependencies": { + "bind-property-descriptor": "^1.0.0" + }, + "devDependencies": { + "@babel/cli": "7.0.0-beta.46", + "@babel/core": "7.0.0-beta.46", + "@babel/preset-env": "7.0.0-beta.46", + "@babel/preset-flow": "7.0.0-beta.46", + "babel-plugin-lodash": "^3.3.2", + "cross-env": "^5.1.3", + "rimraf": "^2.6.2" + }, + "scripts": { + "build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/", + "clean": "rimraf dist/", + "dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/", + "prebuild": "yarn run clean", + "predev": "yarn run prebuild", + "prepublishOnly": "yarn run build" + } +} diff --git a/@xen-orchestra/mixin/src/index.js b/@xen-orchestra/mixin/src/index.js new file mode 100644 index 000000000..7b3b2418f --- /dev/null +++ b/@xen-orchestra/mixin/src/index.js @@ -0,0 +1,128 @@ +import { getBoundPropertyDescriptor } from 'bind-property-descriptor' + +// =================================================================== + +const { defineProperties, getOwnPropertyDescriptor } = Object + +const isIgnoredProperty = name => name[0] === '_' || name === 'constructor' + +const IGNORED_STATIC_PROPERTIES = { + __proto__: null, + + arguments: true, + caller: true, + length: true, + name: true, + prototype: true, +} +const isIgnoredStaticProperty = name => name in IGNORED_STATIC_PROPERTIES + +const ownKeys = + (typeof Reflect !== 'undefined' && Reflect.ownKeys) || + (({ getOwnPropertyNames: names, getOwnPropertySymbols: symbols }) => + symbols !== undefined ? obj => names(obj).concat(symbols(obj)) : names)(Object) + +// ------------------------------------------------------------------- + +const mixin = Mixins => Class => { + if (__DEV__ && !Array.isArray(Mixins)) { + throw new TypeError('Mixins should be an array') + } + + const { name } = Class + + // Copy properties of plain object mix-ins to the prototype. + { + const allMixins = Mixins + Mixins = [] + const { prototype } = Class + const descriptors = { __proto__: null } + allMixins.forEach(Mixin => { + if (typeof Mixin === 'function') { + Mixins.push(Mixin) + return + } + + for (const prop of ownKeys(Mixin)) { + if (__DEV__ && prop in prototype) { + throw new Error(`${name}#${prop} is already defined`) + } + + ;(descriptors[prop] = getOwnPropertyDescriptor( + Mixin, + prop + )).enumerable = false // Object methods are enumerable but class methods are not. + } + }) + defineProperties(prototype, descriptors) + } + + const n = Mixins.length + + function DecoratedClass (...args) { + const instance = new Class(...args) + + for (let i = 0; i < n; ++i) { + const Mixin = Mixins[i] + const { prototype } = Mixin + const mixinInstance = new Mixin(instance, ...args) + const descriptors = { __proto__: null } + const props = ownKeys(prototype) + for (let j = 0, m = props.length; j < m; ++j) { + const prop = props[j] + + if (isIgnoredProperty(prop)) { + continue + } + + if (prop in instance) { + throw new Error(`${name}#${prop} is already defined`) + } + + descriptors[prop] = getBoundPropertyDescriptor( + prototype, + prop, + mixinInstance + ) + } + defineProperties(instance, descriptors) + } + + return instance + } + + // Copy original and mixed-in static properties on Decorator class. + const descriptors = { __proto__: null } + ownKeys(Class).forEach(prop => { + let descriptor + if (!( + // Special properties are not defined... + isIgnoredStaticProperty(prop) && + + // if they already exist... + (descriptor = getOwnPropertyDescriptor(DecoratedClass, prop)) !== undefined && + + // and are not configurable. + !descriptor.configurable + )) { + descriptors[prop] = getOwnPropertyDescriptor(Class, prop) + } + }) + Mixins.forEach(Mixin => { + ownKeys(Mixin).forEach(prop => { + if (isIgnoredStaticProperty(prop)) { + return + } + + if (__DEV__ && prop in descriptors) { + throw new Error(`${name}.${prop} is already defined`) + } + + descriptors[prop] = getOwnPropertyDescriptor(Mixin, prop) + }) + }) + defineProperties(DecoratedClass, descriptors) + + return DecoratedClass +} +export { mixin as default } diff --git a/package.json b/package.json index c923f1112..96e06ab31 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "devDependencies": { - "@babel/register": "^7.0.0-beta.44", + "@babel/register": "^7.0.0-beta.46", "babel-7-jest": "^21.3.2", "babel-eslint": "^8.1.2", "benchmark": "^2.1.4", diff --git a/packages/complex-matcher/package.json b/packages/complex-matcher/package.json index 1da08c0a9..399d05830 100644 --- a/packages/complex-matcher/package.json +++ b/packages/complex-matcher/package.json @@ -30,9 +30,9 @@ "lodash": "^4.17.4" }, "devDependencies": { - "@babel/cli": "7.0.0-beta.44", - "@babel/core": "7.0.0-beta.44", - "@babel/preset-env": "7.0.0-beta.44", + "@babel/cli": "7.0.0-beta.46", + "@babel/core": "7.0.0-beta.46", + "@babel/preset-env": "7.0.0-beta.46", "babel-plugin-lodash": "^3.3.2", "cross-env": "^5.1.1", "rimraf": "^2.6.2" diff --git a/packages/value-matcher/package.json b/packages/value-matcher/package.json index 80ef0fa3c..060694bd6 100644 --- a/packages/value-matcher/package.json +++ b/packages/value-matcher/package.json @@ -28,10 +28,10 @@ }, "dependencies": {}, "devDependencies": { - "@babel/cli": "7.0.0-beta.44", - "@babel/core": "7.0.0-beta.44", - "@babel/preset-env": "7.0.0-beta.44", - "@babel/preset-flow": "7.0.0-beta.44", + "@babel/cli": "7.0.0-beta.46", + "@babel/core": "7.0.0-beta.46", + "@babel/preset-env": "7.0.0-beta.46", + "@babel/preset-flow": "7.0.0-beta.46", "cross-env": "^5.1.3", "rimraf": "^2.6.2" }, diff --git a/packages/xo-cli/package.json b/packages/xo-cli/package.json index 530031952..463a2cd55 100644 --- a/packages/xo-cli/package.json +++ b/packages/xo-cli/package.json @@ -28,7 +28,7 @@ "node": ">=6" }, "dependencies": { - "@babel/polyfill": "7.0.0-beta.44", + "@babel/polyfill": "7.0.0-beta.46", "bluebird": "^3.5.1", "chalk": "^2.2.0", "event-to-promise": "^0.8.0", @@ -49,10 +49,10 @@ "xo-lib": "^0.9.0" }, "devDependencies": { - "@babel/cli": "7.0.0-beta.44", - "@babel/core": "7.0.0-beta.44", - "@babel/preset-env": "7.0.0-beta.44", - "@babel/preset-flow": "7.0.0-beta.44", + "@babel/cli": "7.0.0-beta.46", + "@babel/core": "7.0.0-beta.46", + "@babel/preset-env": "7.0.0-beta.46", + "@babel/preset-flow": "7.0.0-beta.46", "babel-plugin-lodash": "^3.3.2", "cross-env": "^5.1.3", "rimraf": "^2.6.2" diff --git a/packages/xo-server-perf-alert/package.json b/packages/xo-server-perf-alert/package.json index 9bba0af37..3b08476a5 100644 --- a/packages/xo-server-perf-alert/package.json +++ b/packages/xo-server-perf-alert/package.json @@ -26,10 +26,10 @@ "lodash": "^4.17.4" }, "devDependencies": { - "@babel/cli": "7.0.0-beta.44", - "@babel/core": "7.0.0-beta.44", - "@babel/preset-env": "7.0.0-beta.44", - "@babel/preset-flow": "^7.0.0-beta.44", + "@babel/cli": "7.0.0-beta.46", + "@babel/core": "7.0.0-beta.46", + "@babel/preset-env": "7.0.0-beta.46", + "@babel/preset-flow": "^7.0.0-beta.46", "babel-plugin-lodash": "^3.3.2", "cross-env": "^5.1.3", "rimraf": "^2.6.2" diff --git a/packages/xo-server-rework/.babelrc.js b/packages/xo-server-rework/.babelrc.js new file mode 100644 index 000000000..4e27ec135 --- /dev/null +++ b/packages/xo-server-rework/.babelrc.js @@ -0,0 +1,3 @@ +module.exports = require('../../@xen-orchestra/babel-config')( + require('./package.json') +) diff --git a/packages/xo-server-rework/.npmignore b/packages/xo-server-rework/.npmignore new file mode 100644 index 000000000..e058b6bc1 --- /dev/null +++ b/packages/xo-server-rework/.npmignore @@ -0,0 +1,24 @@ +/benchmark/ +/benchmarks/ +*.bench.js +*.bench.js.map + +/examples/ +example.js +example.js.map +*.example.js +*.example.js.map + +/fixture/ +/fixtures/ +*.fixture.js +*.fixture.js.map +*.fixtures.js +*.fixtures.js.map + +/test/ +/tests/ +*.spec.js +*.spec.js.map + +__snapshots__/ diff --git a/packages/xo-server-rework/README.md b/packages/xo-server-rework/README.md new file mode 100644 index 000000000..6b90790df --- /dev/null +++ b/packages/xo-server-rework/README.md @@ -0,0 +1,51 @@ +# xo-server [![Build Status](https://travis-ci.org/vatesfr/xo-server.png?branch=master)](https://travis-ci.org/vatesfr/xo-server) + +> Server part of [Xen Orchestra](https://xen-orchestra.com) + +## Install + +Installation of the [npm package](https://npmjs.org/package/xo-server): + +``` +> npm install --global xo-server +``` + +## Usage + +``` +> xo-server +``` + +## Development + +``` +# Install dependencies +> yarn + +# Run the tests +> yarn test + +# Continuously compile +> yarn dev + +# Continuously run the tests +> yarn dev-test + +# Build for production (automatically called by npm install) +> yarn build +``` + +## Contributions + +Contributions are *very* welcomed, either on the documentation or on +the code. + +You may: + +- report any [issue](https://github.com/vatesfr/xo-web/issues) + you've encountered; +- fork and create a pull request. + +## License + +AGPL3 © [Vates SAS](http://vates.fr) diff --git a/packages/xo-server-rework/config.json b/packages/xo-server-rework/config.json new file mode 100644 index 000000000..8d58a3457 --- /dev/null +++ b/packages/xo-server-rework/config.json @@ -0,0 +1,40 @@ +// Vendor config: DO NOT TOUCH! +// +// See sample.config.yaml to override. +{ + + // Should users be created on first sign in? + // + // Necessary for external authentication providers. + "createUserOnFirstSignin": true, + + "datadir": "/var/lib/xo-server/data", + + "http": { + "listen": [ + { + "port": 80 + } + ], + + "mounts": {}, + + // Ciphers to use. + // + // These are the default ciphers in Node 4.2.6, we are setting + // them explicitly for older Node versions. + "ciphers": "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:DHE-RSA-AES256-SHA384:ECDHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA256:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!SRP:!CAMELLIA", + + // Tell Node to respect the cipher order. + "honorCipherOrder": true, + + // Specify to use at least TLSv1.1. + // See: https://github.com/certsimple/minimum-tls-version + "secureOptions": 117440512 + }, + + "jwt": { + "expiresIn": "7d", + "secret": "P],7x#cRhuy,wCR'$}'N?<2yOQ3v6.!b*|1B2P36(wKsYICH|6" + } +} diff --git a/packages/xo-server-rework/flow-typed/npm/lodash_v4.x.x.js b/packages/xo-server-rework/flow-typed/npm/lodash_v4.x.x.js new file mode 100644 index 000000000..40245d51c --- /dev/null +++ b/packages/xo-server-rework/flow-typed/npm/lodash_v4.x.x.js @@ -0,0 +1,1047 @@ +// flow-typed signature: 83935520f5ff73d31271b162a330d97e +// flow-typed version: 3b064385b7/lodash_v4.x.x/flow_>=v0.47.x + +declare module 'lodash' { + declare type TemplateSettings = { + escape?: RegExp, + evaluate?: RegExp, + imports?: Object, + interpolate?: RegExp, + variable?: string + }; + + declare type TruncateOptions = { + length?: number, + omission?: string, + separator?: RegExp | string + }; + + declare type DebounceOptions = { + leading?: boolean, + maxWait?: number, + trailing?: boolean + }; + + declare type ThrottleOptions = { + leading?: boolean, + trailing?: boolean + }; + + declare type NestedArray = Array>; + + declare type matchesIterateeShorthand = Object; + declare type matchesPropertyIterateeShorthand = [string, any]; + declare type propertyIterateeShorthand = string; + + declare type OPredicate = + | ((value: A, key: string, object: O) => any) + | matchesIterateeShorthand + | matchesPropertyIterateeShorthand + | propertyIterateeShorthand; + + declare type OIterateeWithResult = + | Object + | string + | ((value: V, key: string, object: O) => R); + declare type OIteratee = OIterateeWithResult; + declare type OFlatMapIteratee = OIterateeWithResult>; + + declare type Predicate = + | ((value: T, index: number, array: Array) => any) + | matchesIterateeShorthand + | matchesPropertyIterateeShorthand + | propertyIterateeShorthand; + + declare type _ValueOnlyIteratee = (value: T) => mixed; + declare type ValueOnlyIteratee = _ValueOnlyIteratee | string; + declare type _Iteratee = ( + item: T, + index: number, + array: ?Array + ) => mixed; + declare type Iteratee = _Iteratee | Object | string; + declare type FlatMapIteratee = + | ((item: T, index: number, array: ?Array) => Array) + | Object + | string; + declare type Comparator = (item: T, item2: T) => boolean; + + declare type MapIterator = + | ((item: T, index: number, array: Array) => U) + | propertyIterateeShorthand; + + declare type OMapIterator = + | ((item: T, key: string, object: O) => U) + | propertyIterateeShorthand; + + declare class Lodash { + // Array + chunk(array: ?Array, size?: number): Array>, + compact(array: Array): Array, + concat(base: Array, ...elements: Array): Array, + difference(array: ?Array, values?: Array): Array, + differenceBy( + array: ?Array, + values: Array, + iteratee: ValueOnlyIteratee + ): T[], + differenceWith(array: T[], values: T[], comparator?: Comparator): T[], + drop(array: ?Array, n?: number): Array, + dropRight(array: ?Array, n?: number): Array, + dropRightWhile(array: ?Array, predicate?: Predicate): Array, + dropWhile(array: ?Array, predicate?: Predicate): Array, + fill( + array: ?Array, + value: U, + start?: number, + end?: number + ): Array, + findIndex( + array: ?Array, + predicate?: Predicate, + fromIndex?: number + ): number, + findLastIndex( + array: ?Array, + predicate?: Predicate, + fromIndex?: number + ): number, + // alias of _.head + first(array: ?Array): T, + flatten(array: Array | X>): Array, + flattenDeep(array: any[]): Array, + flattenDepth(array: any[], depth?: number): any[], + fromPairs(pairs: Array): Object, + head(array: ?Array): T, + indexOf(array: ?Array, value: T, fromIndex?: number): number, + initial(array: ?Array): Array, + intersection(...arrays: Array>): Array, + // Workaround until (...parameter: T, parameter2: U) works + intersectionBy(a1: Array, iteratee?: ValueOnlyIteratee): Array, + intersectionBy( + a1: Array, + a2: Array, + iteratee?: ValueOnlyIteratee + ): Array, + intersectionBy( + a1: Array, + a2: Array, + a3: Array, + iteratee?: ValueOnlyIteratee + ): Array, + intersectionBy( + a1: Array, + a2: Array, + a3: Array, + a4: Array, + iteratee?: ValueOnlyIteratee + ): Array, + // Workaround until (...parameter: T, parameter2: U) works + intersectionWith(a1: Array, comparator: Comparator): Array, + intersectionWith( + a1: Array, + a2: Array, + comparator: Comparator + ): Array, + intersectionWith( + a1: Array, + a2: Array, + a3: Array, + comparator: Comparator + ): Array, + intersectionWith( + a1: Array, + a2: Array, + a3: Array, + a4: Array, + comparator: Comparator + ): Array, + join(array: ?Array, separator?: string): string, + last(array: ?Array): T, + lastIndexOf(array: ?Array, value: T, fromIndex?: number): number, + nth(array: T[], n?: number): T, + pull(array: ?Array, ...values?: Array): Array, + pullAll(array: ?Array, values: Array): Array, + pullAllBy( + array: ?Array, + values: Array, + iteratee?: ValueOnlyIteratee + ): Array, + pullAllWith(array?: T[], values: T[], comparator?: Function): T[], + pullAt(array: ?Array, ...indexed?: Array): Array, + pullAt(array: ?Array, indexed?: Array): Array, + remove(array: ?Array, predicate?: Predicate): Array, + reverse(array: ?Array): Array, + slice(array: ?Array, start?: number, end?: number): Array, + sortedIndex(array: ?Array, value: T): number, + sortedIndexBy( + array: ?Array, + value: T, + iteratee?: ValueOnlyIteratee + ): number, + sortedIndexOf(array: ?Array, value: T): number, + sortedLastIndex(array: ?Array, value: T): number, + sortedLastIndexBy( + array: ?Array, + value: T, + iteratee?: ValueOnlyIteratee + ): number, + sortedLastIndexOf(array: ?Array, value: T): number, + sortedUniq(array: ?Array): Array, + sortedUniqBy(array: ?Array, iteratee?: (value: T) => mixed): Array, + tail(array: ?Array): Array, + take(array: ?Array, n?: number): Array, + takeRight(array: ?Array, n?: number): Array, + takeRightWhile(array: ?Array, predicate?: Predicate): Array, + takeWhile(array: ?Array, predicate?: Predicate): Array, + union(...arrays?: Array>): Array, + // Workaround until (...parameter: T, parameter2: U) works + unionBy(a1: Array, iteratee?: ValueOnlyIteratee): Array, + unionBy( + a1: Array, + a2: Array, + iteratee?: ValueOnlyIteratee + ): Array, + unionBy( + a1: Array, + a2: Array, + a3: Array, + iteratee?: ValueOnlyIteratee + ): Array, + unionBy( + a1: Array, + a2: Array, + a3: Array, + a4: Array, + iteratee?: ValueOnlyIteratee + ): Array, + // Workaround until (...parameter: T, parameter2: U) works + unionWith(a1: Array, comparator?: Comparator): Array, + unionWith( + a1: Array, + a2: Array, + comparator?: Comparator + ): Array, + unionWith( + a1: Array, + a2: Array, + a3: Array, + comparator?: Comparator + ): Array, + unionWith( + a1: Array, + a2: Array, + a3: Array, + a4: Array, + comparator?: Comparator + ): Array, + uniq(array: ?Array): Array, + uniqBy(array: ?Array, iteratee?: ValueOnlyIteratee): Array, + uniqWith(array: ?Array, comparator?: Comparator): Array, + unzip(array: ?Array): Array, + unzipWith(array: ?Array, iteratee?: Iteratee): Array, + without(array: ?Array, ...values?: Array): Array, + xor(...array: Array>): Array, + // Workaround until (...parameter: T, parameter2: U) works + xorBy(a1: Array, iteratee?: ValueOnlyIteratee): Array, + xorBy( + a1: Array, + a2: Array, + iteratee?: ValueOnlyIteratee + ): Array, + xorBy( + a1: Array, + a2: Array, + a3: Array, + iteratee?: ValueOnlyIteratee + ): Array, + xorBy( + a1: Array, + a2: Array, + a3: Array, + a4: Array, + iteratee?: ValueOnlyIteratee + ): Array, + // Workaround until (...parameter: T, parameter2: U) works + xorWith(a1: Array, comparator?: Comparator): Array, + xorWith( + a1: Array, + a2: Array, + comparator?: Comparator + ): Array, + xorWith( + a1: Array, + a2: Array, + a3: Array, + comparator?: Comparator + ): Array, + xorWith( + a1: Array, + a2: Array, + a3: Array, + a4: Array, + comparator?: Comparator + ): Array, + zip(a1: A[], a2: B[]): Array<[A, B]>, + zip(a1: A[], a2: B[], a3: C[]): Array<[A, B, C]>, + zip(a1: A[], a2: B[], a3: C[], a4: D[]): Array<[A, B, C, D]>, + zip( + a1: A[], + a2: B[], + a3: C[], + a4: D[], + a5: E[] + ): Array<[A, B, C, D, E]>, + + zipObject(props?: Array, values?: Array): Object, + zipObjectDeep(props?: any[], values?: any): Object, + // Workaround until (...parameter: T, parameter2: U) works + zipWith(a1: NestedArray, iteratee?: Iteratee): Array, + zipWith( + a1: NestedArray, + a2: NestedArray, + iteratee?: Iteratee + ): Array, + zipWith( + a1: NestedArray, + a2: NestedArray, + a3: NestedArray, + iteratee?: Iteratee + ): Array, + zipWith( + a1: NestedArray, + a2: NestedArray, + a3: NestedArray, + a4: NestedArray, + iteratee?: Iteratee + ): Array, + + // Collection + countBy(array: ?Array, iteratee?: ValueOnlyIteratee): Object, + countBy(object: T, iteratee?: ValueOnlyIteratee): Object, + // alias of _.forEach + each(array: ?Array, iteratee?: Iteratee): Array, + each(object: T, iteratee?: OIteratee): T, + // alias of _.forEachRight + eachRight(array: ?Array, iteratee?: Iteratee): Array, + eachRight(object: T, iteratee?: OIteratee): T, + every(array: ?Array, iteratee?: Iteratee): boolean, + every(object: T, iteratee?: OIteratee): boolean, + filter(array: ?Array, predicate?: Predicate): Array, + filter( + object: T, + predicate?: OPredicate + ): Array, + find( + array: ?Array, + predicate?: Predicate, + fromIndex?: number + ): T | void, + find( + object: T, + predicate?: OPredicate, + fromIndex?: number + ): V, + findLast( + array: ?Array, + predicate?: Predicate, + fromIndex?: number + ): T | void, + findLast( + object: T, + predicate?: OPredicate + ): V, + flatMap(array: ?Array, iteratee?: FlatMapIteratee): Array, + flatMap( + object: T, + iteratee?: OFlatMapIteratee + ): Array, + flatMapDeep( + array: ?Array, + iteratee?: FlatMapIteratee + ): Array, + flatMapDeep( + object: T, + iteratee?: OFlatMapIteratee + ): Array, + flatMapDepth( + array: ?Array, + iteratee?: FlatMapIteratee, + depth?: number + ): Array, + flatMapDepth( + object: T, + iteratee?: OFlatMapIteratee, + depth?: number + ): Array, + forEach(array: ?Array, iteratee?: Iteratee): Array, + forEach(object: T, iteratee?: OIteratee): T, + forEachRight(array: ?Array, iteratee?: Iteratee): Array, + forEachRight(object: T, iteratee?: OIteratee): T, + groupBy( + array: ?Array, + iteratee?: ValueOnlyIteratee + ): { [key: V]: Array }, + groupBy( + object: T, + iteratee?: ValueOnlyIteratee + ): { [key: V]: Array }, + includes(array: ?Array, value: T, fromIndex?: number): boolean, + includes(object: T, value: any, fromIndex?: number): boolean, + includes(str: string, value: string, fromIndex?: number): boolean, + invokeMap( + array: ?Array, + path: ((value: T) => Array | string) | Array | string, + ...args?: Array + ): Array, + invokeMap( + object: T, + path: ((value: any) => Array | string) | Array | string, + ...args?: Array + ): Array, + keyBy( + array: ?Array, + iteratee?: ValueOnlyIteratee + ): { [key: V]: ?T }, + keyBy( + object: T, + iteratee?: ValueOnlyIteratee + ): { [key: V]: ?A }, + map(array: ?Array, iteratee?: MapIterator): Array, + map( + object: ?T, + iteratee?: OMapIterator + ): Array, + map( + str: ?string, + iteratee?: (char: string, index: number, str: string) => any + ): string, + orderBy( + array: ?Array, + iteratees?: Array> | string, + orders?: Array<"asc" | "desc"> | string + ): Array, + orderBy( + object: T, + iteratees?: Array> | string, + orders?: Array<"asc" | "desc"> | string + ): Array, + partition(array: ?Array, predicate?: Predicate): NestedArray, + partition( + object: T, + predicate?: OPredicate + ): NestedArray, + reduce( + array: ?Array, + iteratee?: ( + accumulator: U, + value: T, + index: number, + array: ?Array + ) => U, + accumulator?: U + ): U, + reduce( + object: T, + iteratee?: (accumulator: U, value: any, key: string, object: T) => U, + accumulator?: U + ): U, + reduceRight( + array: ?Array, + iteratee?: ( + accumulator: U, + value: T, + index: number, + array: ?Array + ) => U, + accumulator?: U + ): U, + reduceRight( + object: T, + iteratee?: (accumulator: U, value: any, key: string, object: T) => U, + accumulator?: U + ): U, + reject(array: ?Array, predicate?: Predicate): Array, + reject( + object: T, + predicate?: OPredicate + ): Array, + sample(array: ?Array): T, + sample(object: T): V, + sampleSize(array: ?Array, n?: number): Array, + sampleSize(object: T, n?: number): Array, + shuffle(array: ?Array): Array, + shuffle(object: T): Array, + size(collection: Array | Object): number, + some(array: ?Array, predicate?: Predicate): boolean, + some( + object?: ?T, + predicate?: OPredicate + ): boolean, + sortBy(array: ?Array, ...iteratees?: Array>): Array, + sortBy(array: ?Array, iteratees?: Array>): Array, + sortBy( + object: T, + ...iteratees?: Array> + ): Array, + sortBy(object: T, iteratees?: Array>): Array, + + // Date + now(): number, + + // Function + after(n: number, fn: Function): Function, + ary(func: Function, n?: number): Function, + before(n: number, fn: Function): Function, + bind(func: Function, thisArg: any, ...partials: Array): Function, + bindKey(obj: Object, key: string, ...partials: Array): Function, + curry(func: Function, arity?: number): Function, + curryRight(func: Function, arity?: number): Function, + debounce( + func: Function, + wait?: number, + options?: DebounceOptions + ): Function, + defer(func: Function, ...args?: Array): number, + delay(func: Function, wait: number, ...args?: Array): number, + flip(func: Function): Function, + memoize(func: Function, resolver?: Function): Function, + negate(predicate: Function): Function, + once(func: Function): Function, + overArgs(func: Function, ...transforms: Array): Function, + overArgs(func: Function, transforms: Array): Function, + partial(func: Function, ...partials: any[]): Function, + partialRight(func: Function, ...partials: Array): Function, + partialRight(func: Function, partials: Array): Function, + rearg(func: Function, ...indexes: Array): Function, + rearg(func: Function, indexes: Array): Function, + rest(func: Function, start?: number): Function, + spread(func: Function): Function, + throttle( + func: Function, + wait?: number, + options?: ThrottleOptions + ): Function, + unary(func: Function): Function, + wrap(value: any, wrapper: Function): Function, + + // Lang + castArray(value: *): any[], + clone(value: T): T, + cloneDeep(value: T): T, + cloneDeepWith( + value: T, + customizer?: ?(value: T, key: number | string, object: T, stack: any) => U + ): U, + cloneWith( + value: T, + customizer?: ?(value: T, key: number | string, object: T, stack: any) => U + ): U, + conformsTo( + source: T, + predicates: T & { [key: string]: (x: any) => boolean } + ): boolean, + eq(value: any, other: any): boolean, + gt(value: any, other: any): boolean, + gte(value: any, other: any): boolean, + isArguments(value: any): boolean, + isArray(value: any): boolean, + isArrayBuffer(value: any): boolean, + isArrayLike(value: any): boolean, + isArrayLikeObject(value: any): boolean, + isBoolean(value: any): boolean, + isBuffer(value: any): boolean, + isDate(value: any): boolean, + isElement(value: any): boolean, + isEmpty(value: any): boolean, + isEqual(value: any, other: any): boolean, + isEqualWith( + value: T, + other: U, + customizer?: ( + objValue: any, + otherValue: any, + key: number | string, + object: T, + other: U, + stack: any + ) => boolean | void + ): boolean, + isError(value: any): boolean, + isFinite(value: any): boolean, + isFunction(value: Function): true, + isFunction(value: number | string | void | null | Object): false, + isInteger(value: any): boolean, + isLength(value: any): boolean, + isMap(value: any): boolean, + isMatch(object?: ?Object, source: Object): boolean, + isMatchWith( + object: T, + source: U, + customizer?: ( + objValue: any, + srcValue: any, + key: number | string, + object: T, + source: U + ) => boolean | void + ): boolean, + isNaN(value: any): boolean, + isNative(value: any): boolean, + isNil(value: any): boolean, + isNull(value: any): boolean, + isNumber(value: any): boolean, + isObject(value: any): boolean, + isObjectLike(value: any): boolean, + isPlainObject(value: any): boolean, + isRegExp(value: any): boolean, + isSafeInteger(value: any): boolean, + isSet(value: any): boolean, + isString(value: string): true, + isString( + value: number | boolean | Function | void | null | Object | Array + ): false, + isSymbol(value: any): boolean, + isTypedArray(value: any): boolean, + isUndefined(value: any): boolean, + isWeakMap(value: any): boolean, + isWeakSet(value: any): boolean, + lt(value: any, other: any): boolean, + lte(value: any, other: any): boolean, + toArray(value: any): Array, + toFinite(value: any): number, + toInteger(value: any): number, + toLength(value: any): number, + toNumber(value: any): number, + toPlainObject(value: any): Object, + toSafeInteger(value: any): number, + toString(value: any): string, + + // Math + add(augend: number, addend: number): number, + ceil(number: number, precision?: number): number, + divide(dividend: number, divisor: number): number, + floor(number: number, precision?: number): number, + max(array: ?Array): T, + maxBy(array: ?Array, iteratee?: Iteratee): T, + mean(array: Array<*>): number, + meanBy(array: Array, iteratee?: Iteratee): number, + min(array: ?Array): T, + minBy(array: ?Array, iteratee?: Iteratee): T, + multiply(multiplier: number, multiplicand: number): number, + round(number: number, precision?: number): number, + subtract(minuend: number, subtrahend: number): number, + sum(array: Array<*>): number, + sumBy(array: Array, iteratee?: Iteratee): number, + + // number + clamp(number: number, lower?: number, upper: number): number, + inRange(number: number, start?: number, end: number): boolean, + random(lower?: number, upper?: number, floating?: boolean): number, + + // Object + assign(object?: ?Object, ...sources?: Array): Object, + assignIn(a: A, b: B): A & B, + assignIn(a: A, b: B, c: C): A & B & C, + assignIn(a: A, b: B, c: C, d: D): A & B & C & D, + assignIn(a: A, b: B, c: C, d: D, e: E): A & B & C & D & E, + assignInWith( + object: T, + s1: A, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void + ): Object, + assignInWith( + object: T, + s1: A, + s2: B, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B + ) => any | void + ): Object, + assignInWith( + object: T, + s1: A, + s2: B, + s3: C, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C + ) => any | void + ): Object, + assignInWith( + object: T, + s1: A, + s2: B, + s3: C, + s4: D, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C | D + ) => any | void + ): Object, + assignWith( + object: T, + s1: A, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void + ): Object, + assignWith( + object: T, + s1: A, + s2: B, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B + ) => any | void + ): Object, + assignWith( + object: T, + s1: A, + s2: B, + s3: C, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C + ) => any | void + ): Object, + assignWith( + object: T, + s1: A, + s2: B, + s3: C, + s4: D, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C | D + ) => any | void + ): Object, + at(object?: ?Object, ...paths: Array): Array, + at(object?: ?Object, paths: Array): Array, + create(prototype: T, properties?: Object): $Supertype, + defaults(object?: ?Object, ...sources?: Array): Object, + defaultsDeep(object?: ?Object, ...sources?: Array): Object, + // alias for _.toPairs + entries(object?: ?Object): NestedArray, + // alias for _.toPairsIn + entriesIn(object?: ?Object): NestedArray, + // alias for _.assignIn + extend(a: A, b: B): A & B, + extend(a: A, b: B, c: C): A & B & C, + extend(a: A, b: B, c: C, d: D): A & B & C & D, + extend(a: A, b: B, c: C, d: D, e: E): A & B & C & D & E, + // alias for _.assignInWith + extendWith( + object: T, + s1: A, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void + ): Object, + extendWith( + object: T, + s1: A, + s2: B, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B + ) => any | void + ): Object, + extendWith( + object: T, + s1: A, + s2: B, + s3: C, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C + ) => any | void + ): Object, + extendWith( + object: T, + s1: A, + s2: B, + s3: C, + s4: D, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C | D + ) => any | void + ): Object, + findKey( + object?: ?T, + predicate?: OPredicate + ): string | void, + findLastKey( + object?: ?T, + predicate?: OPredicate + ): string | void, + forIn(object?: ?Object, iteratee?: OIteratee<*>): Object, + forInRight(object?: ?Object, iteratee?: OIteratee<*>): Object, + forOwn(object?: ?Object, iteratee?: OIteratee<*>): Object, + forOwnRight(object?: ?Object, iteratee?: OIteratee<*>): Object, + functions(object?: ?Object): Array, + functionsIn(object?: ?Object): Array, + get( + object?: ?Object | ?Array, + path?: ?Array | string, + defaultValue?: any + ): any, + has(object?: ?Object, path?: ?Array | string): boolean, + hasIn(object?: ?Object, path?: ?Array | string): boolean, + invert(object?: ?Object, multiVal?: boolean): Object, + invertBy(object: ?Object, iteratee?: Function): Object, + invoke( + object?: ?Object, + path?: ?Array | string, + ...args?: Array + ): any, + keys(object?: ?Object): Array, + keysIn(object?: ?Object): Array, + mapKeys(object?: ?Object, iteratee?: OIteratee<*>): Object, + mapValues(object?: ?Object, iteratee?: OIteratee<*>): Object, + merge(object?: ?Object, ...sources?: Array): Object, + mergeWith( + object: T, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A + ) => any | void + ): Object, + mergeWith( + object: T, + s1: A, + s2: B, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B + ) => any | void + ): Object, + mergeWith( + object: T, + s1: A, + s2: B, + s3: C, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C + ) => any | void + ): Object, + mergeWith( + object: T, + s1: A, + s2: B, + s3: C, + s4: D, + customizer?: ( + objValue: any, + srcValue: any, + key: string, + object: T, + source: A | B | C | D + ) => any | void + ): Object, + omit(object?: ?Object, ...props: Array): Object, + omit(object?: ?Object, props: Array): Object, + omitBy( + object?: ?T, + predicate?: OPredicate + ): Object, + pick(object?: ?Object, ...props: Array): Object, + pick(object?: ?Object, props: Array): Object, + pickBy( + object?: ?T, + predicate?: OPredicate + ): Object, + result( + object?: ?Object, + path?: ?Array | string, + defaultValue?: any + ): any, + set(object?: ?Object, path?: ?Array | string, value: any): Object, + setWith( + object: T, + path?: ?Array | string, + value: any, + customizer?: (nsValue: any, key: string, nsObject: T) => any + ): Object, + toPairs(object?: ?Object | Array<*>): NestedArray, + toPairsIn(object?: ?Object): NestedArray, + transform( + collection: Object | Array, + iteratee?: OIteratee<*>, + accumulator?: any + ): any, + unset(object?: ?Object, path?: ?Array | string): boolean, + update(object: Object, path: string[] | string, updater: Function): Object, + updateWith( + object: Object, + path: string[] | string, + updater: Function, + customizer?: Function + ): Object, + values(object?: ?Object): Array, + valuesIn(object?: ?Object): Array, + + // Seq + // harder to read, but this is _() + (value: any): any, + chain(value: T): any, + tap(value: T, interceptor: (value: T) => any): T, + thru(value: T1, interceptor: (value: T1) => T2): T2, + // TODO: _.prototype.* + + // String + camelCase(string?: ?string): string, + capitalize(string?: string): string, + deburr(string?: string): string, + endsWith(string?: string, target?: string, position?: number): boolean, + escape(string?: string): string, + escapeRegExp(string?: string): string, + kebabCase(string?: string): string, + lowerCase(string?: string): string, + lowerFirst(string?: string): string, + pad(string?: string, length?: number, chars?: string): string, + padEnd(string?: string, length?: number, chars?: string): string, + padStart(string?: string, length?: number, chars?: string): string, + parseInt(string: string, radix?: number): number, + repeat(string?: string, n?: number): string, + replace( + string?: string, + pattern: RegExp | string, + replacement: ((string: string) => string) | string + ): string, + snakeCase(string?: string): string, + split( + string?: string, + separator: RegExp | string, + limit?: number + ): Array, + startCase(string?: string): string, + startsWith(string?: string, target?: string, position?: number): boolean, + template(string?: string, options?: TemplateSettings): Function, + toLower(string?: string): string, + toUpper(string?: string): string, + trim(string?: string, chars?: string): string, + trimEnd(string?: string, chars?: string): string, + trimStart(string?: string, chars?: string): string, + truncate(string?: string, options?: TruncateOptions): string, + unescape(string?: string): string, + upperCase(string?: string): string, + upperFirst(string?: string): string, + words(string?: string, pattern?: RegExp | string): Array, + + // Util + attempt(func: Function, ...args: Array): any, + bindAll(object?: ?Object, methodNames: Array): Object, + bindAll(object?: ?Object, ...methodNames: Array): Object, + cond(pairs: NestedArray): Function, + conforms(source: Object): Function, + constant(value: T): () => T, + defaultTo( + value: T1, + defaultValue: T2 + ): T1, + // NaN is a number instead of its own type, otherwise it would behave like null/void + defaultTo(value: T1, defaultValue: T2): T1 | T2, + defaultTo(value: T1, defaultValue: T2): T2, + flow(...funcs?: Array): Function, + flow(funcs?: Array): Function, + flowRight(...funcs?: Array): Function, + flowRight(funcs?: Array): Function, + identity(value: T): T, + iteratee(func?: any): Function, + matches(source: Object): Function, + matchesProperty(path?: ?Array | string, srcValue: any): Function, + method(path?: ?Array | string, ...args?: Array): Function, + methodOf(object?: ?Object, ...args?: Array): Function, + mixin( + object?: T, + source: Object, + options?: { chain: boolean } + ): T, + noConflict(): Lodash, + noop(...args: Array): void, + nthArg(n?: number): Function, + over(...iteratees: Array): Function, + over(iteratees: Array): Function, + overEvery(...predicates: Array): Function, + overEvery(predicates: Array): Function, + overSome(...predicates: Array): Function, + overSome(predicates: Array): Function, + property(path?: ?Array | string): Function, + propertyOf(object?: ?Object): Function, + range(start: number, end: number, step?: number): Array, + range(end: number, step?: number): Array, + rangeRight(start: number, end: number, step?: number): Array, + rangeRight(end: number, step?: number): Array, + runInContext(context?: Object): Function, + + stubArray(): Array<*>, + stubFalse(): false, + stubObject(): {}, + stubString(): "", + stubTrue(): true, + times(n: number, ...rest: Array): Array, + times(n: number, iteratee: (i: number) => T): Array, + toPath(value: any): Array, + uniqueId(prefix?: string): string, + + // Properties + VERSION: string, + templateSettings: TemplateSettings + } + + declare var exports: Lodash; +} diff --git a/packages/xo-server-rework/package.json b/packages/xo-server-rework/package.json new file mode 100644 index 000000000..4967b2267 --- /dev/null +++ b/packages/xo-server-rework/package.json @@ -0,0 +1,81 @@ +{ + "private": true, + "name": "xo-server-rework", + "version": "0.0.0", + "license": "AGPL-3.0", + "description": "Server part of Xen Orchestra", + "keywords": [ + "orchestra", + "server", + "xen", + "xen-orchestra" + ], + "homepage": "https://github.com/vatesfr/xen-orchestra/tree/master/packages/xo-server-rework", + "bugs": "https://github.com/vatesfr/xo-web/issues", + "repository": { + "type": "git", + "url": "https://github.com/vatesfr/xen-orchestra.git" + }, + "author": { + "name": "Julien Fontanet", + "email": "julien.fontanet@isonoe.net" + }, + "preferGlobal": true, + "main": "dist/", + "bin": { + "xo-server": "dist/index.js" + }, + "files": [ + "dist/" + ], + "engines": { + "node": ">=6" + }, + "dependencies": { + "@babel/polyfill": "7.0.0-beta.46", + "app-conf": "^0.5.0", + "base64url": "^2.0.0", + "bind-property-descriptor": "^1.0.0", + "bluebird": "^3.5.1", + "cuid": "^2.0.2", + "dataloader": "^1.3.0", + "event-to-promise": "^0.8.0", + "golike-defer": "^0.4.1", + "graphql": "^0.13.0", + "http-request-plus": "^0.5.0", + "http-server-plus": "^0.9.0", + "immutable": "^4.0.0-rc.4", + "index-modules": "^0.3.0", + "jsonwebtoken": "^8.1.0", + "lodash": "^4.17.4", + "mnemonist": "^0.21.0", + "promise-toolbox": "^0.9.5", + "proxy-agent": "^2.1.0", + "spdy": "^3.4.7", + "uuid": "^3.1.0", + "zen-observable": "^0.8.6" + }, + "devDependencies": { + "@babel/cli": "7.0.0-beta.46", + "@babel/core": "7.0.0-beta.46", + "@babel/plugin-proposal-decorators": "7.0.0-beta.46", + "@babel/plugin-proposal-optional-chaining": "7.0.0-beta.46", + "@babel/plugin-proposal-pipeline-operator": "7.0.0-beta.46", + "@babel/plugin-proposal-throw-expressions": "7.0.0-beta.46", + "@babel/preset-env": "7.0.0-beta.46", + "@babel/preset-flow": "7.0.0-beta.46", + "babel-plugin-dev": "^1.0.0", + "babel-plugin-lodash": "^3.3.2", + "cross-env": "^5.1.3", + "rimraf": "^2.6.2" + }, + "scripts": { + "build": "cross-env NODE_ENV=production babel --source-maps --out-dir=dist/ src/", + "clean": "rimraf dist/", + "dev": "cross-env NODE_ENV=development babel --watch --source-maps --out-dir=dist/ src/", + "prebuild": "yarn run clean && index-modules --auto src/", + "predev": "yarn run prebuild", + "prepublishOnly": "yarn run build", + "start": "./dist/index.js" + } +} diff --git a/packages/xo-server-rework/src/app/index.js b/packages/xo-server-rework/src/app/index.js new file mode 100644 index 000000000..02c1ab001 --- /dev/null +++ b/packages/xo-server-rework/src/app/index.js @@ -0,0 +1,8 @@ +import EventEmitter from 'events' +import mixin from '@xen-orchestra/mixin' +import { values } from 'lodash' + +import Mixins from './mixins' + +@mixin(values(Mixins)) +export default class App extends EventEmitter {} diff --git a/packages/xo-server-rework/src/app/mixins/.index-modules b/packages/xo-server-rework/src/app/mixins/.index-modules new file mode 100644 index 000000000..e69de29bb diff --git a/packages/xo-server-rework/src/app/mixins/hooks.js b/packages/xo-server-rework/src/app/mixins/hooks.js new file mode 100644 index 000000000..4554c65a9 --- /dev/null +++ b/packages/xo-server-rework/src/app/mixins/hooks.js @@ -0,0 +1,51 @@ +// @flow + +import createLogger from '@xen-orchestra/log' +import emitAsync from '@xen-orchestra/emit-async' + +const { debug, warn } = createLogger('hooks') + +const makeSingletonHook = (hook, postEvent) => { + let promise + return function () { + if (promise === undefined) { + promise = runHook(this, hook) + promise.then(() => { + this.removeAllListeners(hook) + this.emit(postEvent) + this.removeAllListeners(postEvent) + }) + } + return promise + } +} + +const runHook = (app, hook) => { + debug(`${hook} start…`) + const promise = emitAsync.call(app, { + onError: error => warn(`${hook} failure`, error), + }, hook) + promise.then(() => { + debug(`${hook} finished`) + }) + return promise +} + +export default { + // Run *clean* async listeners. + // + // They normalize existing data, clear invalid entries, etc. + clean () { + return runHook(this, 'clean') + }, + + // Run *start* async listeners. + // + // They initialize the application. + start: makeSingletonHook('start', 'started'), + + // Run *stop* async listeners. + // + // They close connections, unmount file systems, save states, etc. + stop: makeSingletonHook('stop', 'stopped'), +} diff --git a/packages/xo-server-rework/src/app/mixins/http-request.js b/packages/xo-server-rework/src/app/mixins/http-request.js new file mode 100644 index 000000000..3b725dd7b --- /dev/null +++ b/packages/xo-server-rework/src/app/mixins/http-request.js @@ -0,0 +1,13 @@ +import defined, { ifDef } from '@xen-orchestra/defined' +import hrp from 'http-request-plus' +import ProxyAgent from 'proxy-agent' + +export default class HttpRequest { + constructor (_, { + httpProxy = defined(process.env.http_proxy, process.env.HTTP_PROXY), + }) { + this.httpRequest = hrp.extend({ + agent: ifDef(httpProxy, _ => new ProxyAgent(_)), + }) + } +} diff --git a/packages/xo-server-rework/src/app/mixins/http-server.js b/packages/xo-server-rework/src/app/mixins/http-server.js new file mode 100644 index 000000000..fbdd10d3e --- /dev/null +++ b/packages/xo-server-rework/src/app/mixins/http-server.js @@ -0,0 +1,132 @@ +// @flow + +import type EventEmitter from 'events' +import type { + IncomingMessage, + Server, + ServerResponse, +} from 'http' + +import createLogger from '@xen-orchestra/log' +import generateToken from 'generate-token' +import { fromCallback } from 'promise-toolbox' +import { once } from 'lodash' + +const HTTP_REQUEST_VALIDITY = 1e3 * 60 * 60 +const { warn } = createLogger('web-server') + +type Handler = (IncomingMessage, ServerResponse, any) => void +type HandlerInfo = {| + data: any, + handler: Handler, + method: ?string, + once: boolean, + path: string, + unregister: () => void +|} + +type HandlerInfoMap = { [url: string]: HandlerInfo } + +export default class httpServer { + _handlers: HandlerInfoMap + + constructor (app: EventEmitter, { httpServer }: { httpServer: Server }) { + const openConnections = new Set() + httpServer.on('connection', connection => { + openConnections.add(connection) + connection.once('close', () => { + openConnections.delete(connection) + }) + }) + app.on('stop', () => { + const timeout = setTimeout(() => { + openConnections.forEach(connection => { + connection.end() + }) + }, 5e3).unref() + + return fromCallback(cb => httpServer.close(cb)).then(() => { + clearTimeout(timeout) + }) + }) + + const handlers = this._handlers = Object.create(null) + httpServer.on('request', (req, res) => { + const handler = handlers[req.url] + if ( + handler !== undefined && + (handler.method !== undefined || handler.method === req.method) + ) { + if (handler.once) { + handler.unregister() + } + + try { + handler.handler.call(app, req, res, handler.data) + } catch (error) { + warn('handler error', { error }) + if (!res.headersSent) { + res.writeHead(500) + } + res.end() + } + return + } + + res.writeHead(404) + res.end(`Page not found: ${req.url}`) + }) + } + + registerHttpHandler ( + handler: Handler, + { data, method, once: once_ = false, path, ttl } + ) { + const handlers = this._handlers + + if (path in handlers) { + throw new Error(`there is already an HTTP handler for ${path}`) + } + + const unregister = once(() => { + delete handlers[path] + }) + + handlers[path] = { + data, + handler, + method: method && method.toUpperCase(), + once: once_, + path, + unregister, + } + + if (ttl !== undefined) { + setTimeout(unregister, ttl) + } + + return unregister + } + + registerHttpRequest ( + handler: Handler, + { data, path, method = 'GET', suffix } + ) { + return generateToken().then(token => { + let path = `/${token}` + if (suffix) { + path += `/${encodeURI(token)}` + } + + this.registerHttpHandler(handler, { + data, + method, + once: true, + path, + ttl: HTTP_REQUEST_VALIDITY, + }) + + return path + }) + } +} diff --git a/packages/xo-server-rework/src/app/mixins/jwt.js b/packages/xo-server-rework/src/app/mixins/jwt.js new file mode 100644 index 000000000..4dcb80893 --- /dev/null +++ b/packages/xo-server-rework/src/app/mixins/jwt.js @@ -0,0 +1,28 @@ +// @flow + +import jwt from 'jsonwebtoken' +import { fromCallback } from 'promise-toolbox' + +export default class JsonWebToken { + _encodeOpts: Object + _secret: string + + constructor (_: any, { + config: { jwt: { expiresIn, secret } }, + }: { + config: { jwt: { expiresIn?: string, secret: string } } + }) { + this._encodeOpts = { expiresIn } + this._secret = secret + } + + decodeJwt (token: string): Promise { + return fromCallback(cb => jwt.verify(token, this._secret, cb)) + } + + encodeJwt (payload: any): Promise { + return fromCallback(cb => + jwt.sign(payload, this._secret, this._encodeOpts, cb) + ) + } +} diff --git a/packages/xo-server-rework/src/app/mixins/plugins.js b/packages/xo-server-rework/src/app/mixins/plugins.js new file mode 100644 index 000000000..b50a53c19 --- /dev/null +++ b/packages/xo-server-rework/src/app/mixins/plugins.js @@ -0,0 +1,110 @@ +// @flow + +import asyncMap from '@xen-orchestra/async-map' +import createLogger from '@xen-orchestra/log' +import { forEach, startsWith } from 'lodash' +import { join } from 'path' +import { readdir } from '@xen-orchestra/async-fs' + +const { info, warn } = createLogger('plugins') + +// =================================================================== + +const LOOKUP_PATHS = [ + '/usr/local/lib/node_modules', + join(__dirname, '../../../node_modules'), +] + +// ------------------------------------------------------------------- + +export default class Plugins { + _plugins: Object + _prefix: string + + constructor (app: any, { appName, safeMode }: { appName: string, safeMode: ?boolean }) { + this._plugins = {} + this._prefix = `${appName}-` + + app.on('start', () => { + if (!safeMode) { + return this.discoverPlugins() + } + }) + } + + discoverPlugins () { + return asyncMap(this._listPlugins(), async (plugin, name) => {}) + } + + _listPlugins () { + const plugins = { __proto__: null } + + const prefix = this._prefix + const prefixLength = prefix.length + + return asyncMap(LOOKUP_PATHS, lookupPath => + readdir(lookupPath).then( + basenames => + forEach(basenames, basename => { + if (startsWith(basename, prefix)) { + const name = basename.slice(prefixLength) + const path = join(lookupPath, basename) + + const previous = plugins[name] + if (name in plugins) { + warn(`duplicate plugins ${name}`, { + name, + paths: [previous.path, path].sort(), + }) + + return + } + + let plugin + try { + plugin = require(path) + info(`successfully imported plugin ${name}`, { + name, + path, + }) + } catch (error) { + warn(`failed to import plugin ${name}`, { + error, + name, + path, + }) + return + } + + let version + try { + ;({ version } = require(join(path, 'package.json'))) + } catch (_) {} + + // Supports both “normal” CommonJS and Babel's ES2015 modules. + const { + default: factory = plugin, + configurationSchema, + configurationPresets, + } = plugin + + plugins[name] = { + configurationPresets, + configurationSchema, + factory, + version, + } + } + }), + error => { + if (error.code !== 'ENOENT') { + warn('plugins', 'failed to read directory', { + error, + lookupPath, + }) + } + } + ) + ) + } +} diff --git a/packages/xo-server-rework/src/app/mixins/store.js b/packages/xo-server-rework/src/app/mixins/store.js new file mode 100644 index 000000000..425953d64 --- /dev/null +++ b/packages/xo-server-rework/src/app/mixins/store.js @@ -0,0 +1,58 @@ +// import generateId from 'cuid' +// import mkdirp from 'simple-mkdirp' +// import { pCatch, pTap } from 'promise-toolbox' +// import { join } from 'path' +// import { readFile, writeFile } from '@xen-orchestra/async-fs' + +// TODO: transition from in-memory database to a real database system. +export default class Store { + // constructor (app, { config: { datadir } }) { + // this._get = () => { + // const datafile = join(datadir, 'store.json') + // + // const promise = readFile(datafile) + // .then(JSON.parse) + // .catch(pCatch({ code: 'ENOENT' }, () => ({}))) + // .then(pTap(data => { + // app.on('stop', data => + // mkdirp(datadir) + // .then(() => writeFile(datafile, JSON.stringify(data))) + // ) + // })) + // + // // Inline future accesses. + // this._get = () => promise + // + // return promise + // } + // + // this._types = {} + // } + // + // registerType (name, spec) { + // const types = this._types + // + // if (__DEV__ && name in types) { + // throw new Error(`type ${name} is already registered`) + // } + // + // types[name] = spec + // } + // + // async createObject ({ type, ...props }) { + // if (__DEV__ && !type) { + // throw new Error('missing type') + // } + // + // const db = await this._get() + // const byType = db.byType || (db.byType = {}) + // const collection = byType[type] || (byType[type] = {}) + // + // let { id } = props + // if (!id) { + // props.id = id = generateId() + // } + // + // collection[id] = props + // } +} diff --git a/packages/xo-server-rework/src/app/mixins/users.js b/packages/xo-server-rework/src/app/mixins/users.js new file mode 100644 index 000000000..8f1d2ca19 --- /dev/null +++ b/packages/xo-server-rework/src/app/mixins/users.js @@ -0,0 +1,13 @@ +export default class Users { + // constructor (app) { + // app.on('start', async () => { + // + // }) + // + // app.on('export') + // } + // + // createUser ({ name }) { + // + // } +} diff --git a/packages/xo-server-rework/src/app/mixins/workers.js b/packages/xo-server-rework/src/app/mixins/workers.js new file mode 100644 index 000000000..7d1187041 --- /dev/null +++ b/packages/xo-server-rework/src/app/mixins/workers.js @@ -0,0 +1,88 @@ +// @flow + +import { cpus as getCpus } from 'os' +import { ChildProcess, fork } from 'child_process' + +const MAX = getCpus().length +const WORKER = `${__dirname}/../../worker.js` + +class Task { + data: any + reject: (error: any) => void + resolve: (result: any) => void + + constructor (data, resolve, reject) { + this.data = data + this.reject = reject + this.resolve = resolve + } +} + +export default class Workers { + _idleWorker: ?ChildProcess + _nWorkers: number + _tasksQueue: Array + + constructor () { + this._idleWorker = undefined + this._nWorkers = 0 + this._tasksQueue = [] + } + + callWorker (data: any): any { + return new Promise((resolve, reject) => { + const task = new Task(data, resolve, reject) + + const worker = this._getWorker() + if (worker !== undefined) { + this._submitTask(worker, task) + } else { + this._tasksQueue.push(task) + } + }) + } + + _getWorker () { + let worker = this._idleWorker + if (worker !== undefined) { + this._idleWorker = undefined + return worker + } + + if (this._nWorkers < MAX) { + this._nWorkers++ + + worker = fork(WORKER) + worker.on('error', error => { + console.error('worker error', error) + }) + worker.on('exit', (code, signal) => { + console.log('worker exit', code, signal) + this._nWorkers-- + }) + + return worker + } + } + + _submitTask (worker: ChildProcess, task: Task) { + worker.once('message', response => { + if ('error' in response) { + task.reject(response.error) + } else { + task.resolve(response.result) + } + + const nextTask = this._tasksQueue.shift() + if (nextTask !== undefined) { + this._submitTask(worker, nextTask) + } else if (this._idleWorker !== undefined) { + worker.kill() + } else { + this._idleWorker = worker + } + }) + + worker.send(task.data) + } +} diff --git a/packages/xo-server-rework/src/index.js b/packages/xo-server-rework/src/index.js new file mode 100755 index 000000000..33e75dc9d --- /dev/null +++ b/packages/xo-server-rework/src/index.js @@ -0,0 +1,115 @@ +#!/usr/bin/env node + +const APP_NAME = 'xo-server' + +// ------------------------------------------------------------------- + +const { info, warn } = require('@xen-orchestra/log').default('bootstrap') + +process.on('unhandledRejection', reason => { + warn('possibly unhandled rejection', reason) +}) +;(({ prototype }) => { + const { emit } = prototype + prototype.emit = function (event, error) { + event === 'error' && !this.listenerCount(event) + ? warn('unhandled error event', error) + : emit.apply(this, arguments) + } +})(require('events').EventEmitter) + +const Bluebird = require('bluebird') +Bluebird.longStackTraces() +global.Promise = Bluebird + +// ------------------------------------------------------------------- + +const main = async args => { + info('starting') + + const config = await require('app-conf').load(APP_NAME) + + const httpServer = new (require('http-server-plus'))() + + const readFile = Bluebird.promisify(require('fs').readFile) + await require('@xen-orchestra/async-map').default( + config.http.listen, + async ({ + certificate, + // The properties was called `certificate` before. + cert = certificate, + key, + ...opts + }) => { + if (cert !== undefined && key !== undefined) { + [opts.cert, opts.key] = await Promise.all([ + readFile(cert), + readFile(key), + ]) + } + + try { + const niceAddress = await httpServer.listen(opts) + info(`Web server listening on ${niceAddress}`) + } catch (error) { + if (error.niceAddress !== undefined) { + warn(`Web server could not listen on ${error.niceAddress}`) + + const { code } = error + if (code === 'EACCES') { + warn(' Access denied.') + warn(' Ports < 1024 are often reserved to privileges users.') + } else if (code === 'EADDRINUSE') { + warn(' Address already in use.') + } + } else { + warn('Web server could not listen', error) + } + } + } + ) + + try { + const { group, user } = config + group != null && process.setgid(group) + user != null && process.setuid(user) + } catch (error) { + warn('failed to change group/user', error) + } + + global.Observable = require('zen-observable') + + const App = require('./app').default + const app = new App({ + appName: APP_NAME, + config, + httpServer, + safeMode: require('lodash/includes')(args, '--safe-mode'), + }) + await app.start() + + // Gracefully shutdown on signals. + // + // TODO: implements a timeout? (or maybe it is the services launcher + // responsibility?) + require('lodash/forEach')(['SIGINT', 'SIGTERM'], signal => { + let alreadyCalled = false + + process.on(signal, () => { + if (alreadyCalled) { + warn('forced exit') + process.exit(1) + } + alreadyCalled = true + + info(`${signal} caught, closing…`) + app.stop() + }) + }) + + return require('event-to-promise')(app, 'stopped') +} +main(process.argv.slice(2)).then( + () => info('bye :-)'), + error => warn('fatal error', error) +) diff --git a/packages/xo-server-rework/src/node_modules/generate-token.js b/packages/xo-server-rework/src/node_modules/generate-token.js new file mode 100644 index 000000000..73b1af87b --- /dev/null +++ b/packages/xo-server-rework/src/node_modules/generate-token.js @@ -0,0 +1,10 @@ +// @flow + +import base64url from 'base64url' +import { fromCallback } from 'promise-toolbox' +import { randomBytes } from 'crypto' + +const generateSecureToken = (bytes: number = 32): Promise => + fromCallback(cb => randomBytes(bytes, cb)).then(base64url) + +export { generateSecureToken as default } diff --git a/packages/xo-server-rework/src/node_modules/mp-atch.js b/packages/xo-server-rework/src/node_modules/mp-atch.js new file mode 100644 index 000000000..c14f670f2 --- /dev/null +++ b/packages/xo-server-rework/src/node_modules/mp-atch.js @@ -0,0 +1,103 @@ +import { + every, + forEach, + isArray, + isPlainObject, + some, +} from 'lodash' + +// =================================================================== + +const { hasOwnProperty } = Object.prototype +const getSingleKey = obj => { + let prop + for (const key in obj) { + if (hasOwnProperty.call(obj, key)) { + if (prop !== undefined) { + return + } + prop = key + } + } + return prop +} + +const OPERATORS = { + __not: (pattern, value) => !match(pattern, value), + __or: (pattern, value) => some(pattern, subpattern => match(subpattern, value)), +} + +export const match = (pattern, value) => { + if (isPlainObject(pattern)) { + const key = getSingleKey(pattern) + let operator + if (key !== undefined && (operator = OPERATORS[key]) !== undefined) { + return operator(pattern[key], value) + } + + return isPlainObject(value) && every(pattern, (subpattern, key) => ( + value[key] !== undefined && match(subpattern, value[key]) + )) + } + + if (isArray(pattern)) { + return isArray(value) && every(pattern, subpattern => + some(value, subvalue => match(subpattern, subvalue)) + ) + } + + return pattern === value +} + +// ------------------------------------------------------------------- + +const createPredicate = pattern => pattern == null + ? () => false + : value => match(pattern, value) + +export const patch = (value, patchData) => { + if (isPlainObject(patchData)) { + if (isArray(value)) { + const toRemove = createPredicate(patchData['-']) + const tmp = [] + forEach(value, (v, i) => { + if (i in patchData) { + const p = patchData[i] + if (p === null) { + return + } + tmp.push(patch(v, p)) + } else if (!toRemove(v)) { + tmp.push(v) + } + }) + const toAdd = patchData['+'] + if (toAdd) { + tmp.push.apply(tmp, toAdd) + } + return tmp + } + + if (isPlainObject(value)) { + value = { ...value } + forEach(patchData, (v, k) => { + if (v === null) { + delete value[k] + } else { + value[k] = patch(value[k], v) + } + }) + return value + } + + value = {} + forEach(patchData, (v, k) => { + if (v !== null) { + value[k] = patch(null, v) + } + }) + return value + } + + return patchData +} diff --git a/packages/xo-server-rework/src/node_modules/mp-atch.spec.js b/packages/xo-server-rework/src/node_modules/mp-atch.spec.js new file mode 100644 index 000000000..b76c0cb0f --- /dev/null +++ b/packages/xo-server-rework/src/node_modules/mp-atch.spec.js @@ -0,0 +1,103 @@ +/* eslint-env jest */ + +import { forEach } from 'lodash' + +import { match, patch } from './mp-atch' + +// =================================================================== + +describe('match()', () => { + const data = { + 'matches object properties': { + pattern: { foo: 'bar' }, + nope: [ + null, + { }, + { foo: 'baz' }, + ], + yep: [ + { foo: 'bar' }, + { foo: 'bar', bar: 'baz' }, + ], + }, + 'matches set items': { + pattern: [ 'foo', 'bar' ], + nope: [ + [], + [ 'foo' ], + [ 'bar' ], + [ 'foo', 'baz' ], + ], + yep: [ + [ 'bar', 'foo' ], + [ 'bar', 'baz', 'foo' ], + ], + }, + 'supports a __or operator': { + pattern: { __or: [ + 'foo', + { }, + ] }, + nope: [ + 'bar', + [], + ], + yep: [ + 'foo', + { 'foo': 'bar' }, + ], + }, + } + + forEach(data, ({ pattern, nope, yep }, desc) => { + if (!pattern) { + it(desc) + } else { + it(desc, () => { + forEach(nope, value => { + expect(match(pattern, value)).toBe(false) + }) + forEach(yep, value => { + expect(match(pattern, value)).toBe(true) + }) + }) + } + }) + + it('supports a __not operator', () => { + forEach(data, ({ pattern, nope, yep }) => { + if (!pattern) { + return + } + + pattern = { __not: pattern } + + forEach(nope, value => { + expect(match(pattern, value)).toBe(true) + }) + forEach(yep, value => { + expect(match(pattern, value)).toBe(false) + }) + }) + }) +}) + +describe('patch', () => { + it('can patch arrays', () => { + expect(patch( + [ 'foo', 'bar', 'quuz' ], + { 0: null, '-': 'quuz', '+': [ 'baz' ] } + )).toEqual( + [ 'bar', 'baz' ] + ) + }) + + it('can patch objects', () => { + expect(patch( + { foo: 1, bar: 2 }, + { foo: null, bar: 3, baz: 4 } + )).toEqual( + { bar: 3, baz: 4 } + ) + }) +}) diff --git a/packages/xo-server-rework/src/node_modules/simple-mkdirp.js b/packages/xo-server-rework/src/node_modules/simple-mkdirp.js new file mode 100644 index 000000000..cdefc9945 --- /dev/null +++ b/packages/xo-server-rework/src/node_modules/simple-mkdirp.js @@ -0,0 +1,26 @@ +// @flow + +import { dirname } from 'path' +import { mkdir, stat } from 'fs' +import { promisify } from 'promise-toolbox' + +const simpleMkdirp = ( + path: string, + cb: (error: ?Error) => void +) => mkdir(path, undefined, error => { + if (error == null) { + return cb() + } + + if (error.code === 'ENOENT') { + return simpleMkdirp(dirname(path), error => + error != null ? cb(error) : simpleMkdirp(path, cb) + ) + } + + return stat(path, (_, stats) => + stats != null && stats.isDirectory() ? cb() : cb(error) + ) +}) + +export default promisify(simpleMkdirp) diff --git a/packages/xo-server-rework/src/task.js b/packages/xo-server-rework/src/task.js new file mode 100644 index 000000000..7e9aeacf5 --- /dev/null +++ b/packages/xo-server-rework/src/task.js @@ -0,0 +1,71 @@ +import toDecorator from './to-decorator' +import { EventEmitter } from 'events' +import { CancelToken } from 'promise-toolbox' + +class Task extends EventEmitter { + constructor (name, { cancelToken, parent, steps } = {}) { + super() + + this._cancelToken = cancelToken || (parent && parent.cancelToken) + this._name = name + this._step = 0 + this._steps = steps || 0 + } + + get cancelToken () { + return this._cancelToken + } + + plan (n) { + this._steps += n + } + + step (stepName) { + this.emit('progress', { + step: ++this._step, + stepName, + steps: this._steps, + }) + + const token = this._cancelToken + token && token.throwIfRequested() + } +} + +export default opts => + toDecorator( + fn => + function () { + const { name = fn.name, steps } = opts || {} + + const n = arguments.length + const i = 0 + let task + if (n !== 0) { + const arg = arguments[0] + if (arg instanceof Task) { + task = new Task(name, { parent: arg, steps }) + } else if (CancelToken.isCancelToken(arg)) { + task = new Task(name, { cancelToken: arg, steps }) + } + } + if (task === undefined) { + task = new Task(name, { steps }) + } + + const args = new Array(i + n) + args[0] = task + for (let j = 1; j < n; ++j) { + args[j] = arguments[j + i] + } + + const promise = new Promise(resolve => resolve(fn.apply(this, args))) + promise.onProgress = cb => { + task.on('progress', cb) + + return () => task.removeListener('progress', cb) + } + + return promise + } + ) diff --git a/packages/xo-server-rework/src/task.spec.js b/packages/xo-server-rework/src/task.spec.js new file mode 100644 index 000000000..ac1bd6aae --- /dev/null +++ b/packages/xo-server-rework/src/task.spec.js @@ -0,0 +1,54 @@ +/* eslint-env jest */ + +import { CancelToken } from 'promise-toolbox' + +import task from './task' + +// =================================================================== + +const rejectionOf = promise => + promise.then(result => { + throw result + }, reason => reason) + +// =================================================================== + +const sleep = () => new Promise(resolve => setTimeout(resolve, 0)) + +describe('@task', () => { + const fn = task()(async $task => { + await sleep() + $task.step('foo') + await sleep() + $task.step('bar') + await sleep() + $task.step('baz') + }) + + it('', () => { + const promise = fn() + promise.onProgress((...args) => console.log(args)) + + return promise + }) + + it('supports cancel tokens', async () => { + const { cancel, token } = CancelToken.source() + const promise = fn(token) + + cancel('foo') + expect((await rejectionOf(promise)).message).toBe('foo') + }) + + it('supports subtasks', async () => { + const fn2 = task()(async $task => { + await sleep() + await fn($task) + await sleep() + await fn($task) + }) + + const promise = fn2() + await promise + }) +}) diff --git a/packages/xo-server-rework/src/to-decorator.js b/packages/xo-server-rework/src/to-decorator.js new file mode 100644 index 000000000..289b1cf51 --- /dev/null +++ b/packages/xo-server-rework/src/to-decorator.js @@ -0,0 +1,23 @@ +// @flow + +type Descriptor = { + value: any +} + +const toDecorator = ( + wrapFunction: Function, + wrapMethod: Function = wrapFunction +) => ( + target: Function | any, + key?: string, + descriptor?: Descriptor +) => + descriptor === undefined + ? wrapFunction(target) + : { + ...descriptor, + value: (typeof target === 'function' ? wrapFunction : wrapMethod)( + descriptor.value + ), + } +export { toDecorator as default } diff --git a/packages/xo-server-rework/src/worker.js b/packages/xo-server-rework/src/worker.js new file mode 100644 index 000000000..122caa9fe --- /dev/null +++ b/packages/xo-server-rework/src/worker.js @@ -0,0 +1,23 @@ +const METHODS = { + add: ([ a, b ]) => a + b, + sleep: duration => new Promise(resolve => setTimeout(resolve, duration)), +} + +process.on('message', ({ method, arg }) => { + const fn = METHODS[method] + if (fn === undefined) { + return process.send(new Error('no such method')) + } + + new Promise(resolve => resolve(fn(arg))) + .then( + result => process.send({ result }), + error => { + console.error(error) + process.send({ error }) + } + ) + .catch(error => { + console.error('worker error', error) + }) +}) diff --git a/packages/xo-server/package.json b/packages/xo-server/package.json index 057fa952f..184ebabe2 100644 --- a/packages/xo-server/package.json +++ b/packages/xo-server/package.json @@ -31,7 +31,7 @@ "node": ">=6" }, "dependencies": { - "@babel/polyfill": "7.0.0-beta.44", + "@babel/polyfill": "7.0.0-beta.46", "@marsaud/smb2-promise": "^0.2.1", "@xen-orchestra/cron": "^1.0.3", "@xen-orchestra/fs": "^0.0.0", @@ -123,17 +123,17 @@ "yazl": "^2.4.3" }, "devDependencies": { - "@babel/cli": "7.0.0-beta.44", - "@babel/core": "7.0.0-beta.44", - "@babel/plugin-proposal-decorators": "7.0.0-beta.44", - "@babel/plugin-proposal-export-default-from": "7.0.0-beta.44", - "@babel/plugin-proposal-export-namespace-from": "7.0.0-beta.44", - "@babel/plugin-proposal-function-bind": "7.0.0-beta.44", - "@babel/plugin-proposal-optional-chaining": "^7.0.0-beta.44", - "@babel/plugin-proposal-pipeline-operator": "^7.0.0-beta.44", - "@babel/plugin-proposal-throw-expressions": "^7.0.0-beta.44", - "@babel/preset-env": "7.0.0-beta.44", - "@babel/preset-flow": "7.0.0-beta.44", + "@babel/cli": "7.0.0-beta.46", + "@babel/core": "7.0.0-beta.46", + "@babel/plugin-proposal-decorators": "7.0.0-beta.46", + "@babel/plugin-proposal-export-default-from": "7.0.0-beta.46", + "@babel/plugin-proposal-export-namespace-from": "7.0.0-beta.46", + "@babel/plugin-proposal-function-bind": "7.0.0-beta.46", + "@babel/plugin-proposal-optional-chaining": "^7.0.0-beta.46", + "@babel/plugin-proposal-pipeline-operator": "^7.0.0-beta.46", + "@babel/plugin-proposal-throw-expressions": "^7.0.0-beta.46", + "@babel/preset-env": "7.0.0-beta.46", + "@babel/preset-flow": "7.0.0-beta.46", "babel-plugin-lodash": "^3.3.2", "cross-env": "^5.1.3", "index-modules": "^0.3.0", diff --git a/yarn.lock b/yarn.lock index c231b26c9..f4a8f8cbd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17,12 +17,33 @@ optionalDependencies: chokidar "^1.6.1" +"@babel/cli@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/cli/-/cli-7.0.0-beta.46.tgz#4fcede56d20659bf063b2c30c444267aa23f1bd3" + dependencies: + commander "^2.8.1" + convert-source-map "^1.1.0" + fs-readdir-recursive "^1.0.0" + glob "^7.0.0" + lodash "^4.2.0" + output-file-sync "^2.0.0" + slash "^1.0.0" + source-map "^0.5.0" + optionalDependencies: + chokidar "^1.6.1" + "@babel/code-frame@7.0.0-beta.44", "@babel/code-frame@^7.0.0-beta.35", "@babel/code-frame@^7.0.0-beta.40": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.44.tgz#2a02643368de80916162be70865c97774f3adbd9" dependencies: "@babel/highlight" "7.0.0-beta.44" +"@babel/code-frame@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.46.tgz#e0d002100805daab1461c0fcb32a07e304f3a4f4" + dependencies: + "@babel/highlight" "7.0.0-beta.46" + "@babel/core@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.0.0-beta.44.tgz#90bb9e897427e7ebec2a1b857f458ff74ca28057" @@ -43,6 +64,26 @@ semver "^5.4.1" source-map "^0.5.0" +"@babel/core@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.0.0-beta.46.tgz#dbe2189bcdef9a2c84becb1ec624878d31a95689" + dependencies: + "@babel/code-frame" "7.0.0-beta.46" + "@babel/generator" "7.0.0-beta.46" + "@babel/helpers" "7.0.0-beta.46" + "@babel/template" "7.0.0-beta.46" + "@babel/traverse" "7.0.0-beta.46" + "@babel/types" "7.0.0-beta.46" + babylon "7.0.0-beta.46" + convert-source-map "^1.1.0" + debug "^3.1.0" + json5 "^0.5.0" + lodash "^4.2.0" + micromatch "^2.3.11" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.44.tgz#c7e67b9b5284afcf69b309b50d7d37f3e5033d42" @@ -53,12 +94,28 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.0.0-beta.46.tgz#6f57159bcc28bf8c3ed6b549789355cebfa3faa7" + dependencies: + "@babel/types" "7.0.0-beta.46" + jsesc "^2.5.1" + lodash "^4.2.0" + source-map "^0.5.0" + trim-right "^1.0.1" + "@babel/helper-annotate-as-pure@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.44.tgz#8ecf33cc5235295afcc7f160a63cab17ce7776f4" dependencies: "@babel/types" "7.0.0-beta.44" +"@babel/helper-annotate-as-pure@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0-beta.46.tgz#4cd76d5c93409ea01d31be66395a3b98a372792e" + dependencies: + "@babel/types" "7.0.0-beta.46" + "@babel/helper-builder-binary-assignment-operator-visitor@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0-beta.44.tgz#0e86d393c192bc846f871f3fcf4920b08a9cbb27" @@ -66,6 +123,13 @@ "@babel/helper-explode-assignable-expression" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" +"@babel/helper-builder-binary-assignment-operator-visitor@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.0.0-beta.46.tgz#b6c8de48693b66bf90239e99856be4c2257e43ba" + dependencies: + "@babel/helper-explode-assignable-expression" "7.0.0-beta.46" + "@babel/types" "7.0.0-beta.46" + "@babel/helper-call-delegate@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0-beta.44.tgz#e644536f8b3d2eabeecca000037cdced8e453d26" @@ -74,6 +138,14 @@ "@babel/traverse" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" +"@babel/helper-call-delegate@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.0.0-beta.46.tgz#a9e8b46cece47726308f015ce979293ef3d36ab7" + dependencies: + "@babel/helper-hoist-variables" "7.0.0-beta.46" + "@babel/traverse" "7.0.0-beta.46" + "@babel/types" "7.0.0-beta.46" + "@babel/helper-define-map@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.44.tgz#d63578a67c9654ff9f32e55bbf269c2d5f094c97" @@ -82,6 +154,14 @@ "@babel/types" "7.0.0-beta.44" lodash "^4.2.0" +"@babel/helper-define-map@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.0.0-beta.46.tgz#994219751ef48bf1ec32604b43935f2b24d617fa" + dependencies: + "@babel/helper-function-name" "7.0.0-beta.46" + "@babel/types" "7.0.0-beta.46" + lodash "^4.2.0" + "@babel/helper-explode-assignable-expression@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0-beta.44.tgz#1f06b9f76017deac2767ee09f3021d5b209bf5cd" @@ -89,6 +169,13 @@ "@babel/traverse" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" +"@babel/helper-explode-assignable-expression@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.0.0-beta.46.tgz#6a34a7533761b97ce4f7bf6fc586dcfb204ffa11" + dependencies: + "@babel/traverse" "7.0.0-beta.46" + "@babel/types" "7.0.0-beta.46" + "@babel/helper-function-name@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.44.tgz#e18552aaae2231100a6e485e03854bc3532d44dd" @@ -97,18 +184,44 @@ "@babel/template" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" +"@babel/helper-function-name@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.46.tgz#d0c4eed2e220e180f91b02e008dcc4594afe1d39" + dependencies: + "@babel/helper-get-function-arity" "7.0.0-beta.46" + "@babel/template" "7.0.0-beta.46" + "@babel/types" "7.0.0-beta.46" + "@babel/helper-get-function-arity@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.44.tgz#d03ca6dd2b9f7b0b1e6b32c56c72836140db3a15" dependencies: "@babel/types" "7.0.0-beta.44" +"@babel/helper-get-function-arity@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.46.tgz#7161bfe449b4183dbe25d1fe5579338b7429e5f2" + dependencies: + "@babel/types" "7.0.0-beta.46" + "@babel/helper-hoist-variables@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0-beta.44.tgz#a1bbb2c25f9b4058e041ecc1556f096eacdbd142" dependencies: "@babel/types" "7.0.0-beta.44" +"@babel/helper-hoist-variables@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0-beta.46.tgz#2d656215bea3f044ff1ee391fc51d55fce46ddf5" + dependencies: + "@babel/types" "7.0.0-beta.46" + +"@babel/helper-member-expression-to-functions@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0-beta.46.tgz#736344c1d68fb2c4b75cbe62370eb610c0578427" + dependencies: + "@babel/types" "7.0.0-beta.46" + "@babel/helper-module-imports@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.44.tgz#60edc68cdf17e13eaca5be813c96127303085133" @@ -116,6 +229,13 @@ "@babel/types" "7.0.0-beta.44" lodash "^4.2.0" +"@babel/helper-module-imports@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0-beta.46.tgz#8bd2e1fcfae883d28149a350e31ce606aa24eda6" + dependencies: + "@babel/types" "7.0.0-beta.46" + lodash "^4.2.0" + "@babel/helper-module-transforms@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.44.tgz#185dc17b37c4b9cc3daee0f0f44e74f000e21bb7" @@ -127,22 +247,53 @@ "@babel/types" "7.0.0-beta.44" lodash "^4.2.0" +"@babel/helper-module-transforms@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.0.0-beta.46.tgz#90ad981f3a0020d9a8e526296555a5dd7e87cf5e" + dependencies: + "@babel/helper-module-imports" "7.0.0-beta.46" + "@babel/helper-simple-access" "7.0.0-beta.46" + "@babel/helper-split-export-declaration" "7.0.0-beta.46" + "@babel/template" "7.0.0-beta.46" + "@babel/types" "7.0.0-beta.46" + lodash "^4.2.0" + "@babel/helper-optimise-call-expression@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.44.tgz#84ceabfb99afc1c185d15668114a697cdad7a5d0" dependencies: "@babel/types" "7.0.0-beta.44" +"@babel/helper-optimise-call-expression@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0-beta.46.tgz#50f060b4e4af01c73b40986fa593ae7958422e89" + dependencies: + "@babel/types" "7.0.0-beta.46" + "@babel/helper-plugin-utils@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.44.tgz#9f590bc3ae6daa8a10b853233baa3e25d263751d" +"@babel/helper-plugin-utils@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.46.tgz#f630adbd9d645d0ba2e43f4955b4ad61f44ccdf4" + +"@babel/helper-plugin-utils@7.0.0-beta.47": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0-beta.47.tgz#4f564117ec39f96cf60fafcde35c9ddce0e008fd" + "@babel/helper-regex@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0-beta.44.tgz#f5b6828c1e40f0b74ab6ed90abdd52be0c38a74e" dependencies: lodash "^4.2.0" +"@babel/helper-regex@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0-beta.46.tgz#df3675cec700e062d823225c52830e012f32308f" + dependencies: + lodash "^4.2.0" + "@babel/helper-remap-async-to-generator@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0-beta.44.tgz#8ad8c12a57444042ca281bdb16734841425938ad" @@ -153,6 +304,16 @@ "@babel/traverse" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" +"@babel/helper-remap-async-to-generator@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.0.0-beta.46.tgz#275d455dbced4c807543f001302a40303a3f0914" + dependencies: + "@babel/helper-annotate-as-pure" "7.0.0-beta.46" + "@babel/helper-wrap-function" "7.0.0-beta.46" + "@babel/template" "7.0.0-beta.46" + "@babel/traverse" "7.0.0-beta.46" + "@babel/types" "7.0.0-beta.46" + "@babel/helper-replace-supers@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.44.tgz#cf18697951431f533f9d8c201390b158d4a3ee04" @@ -162,6 +323,15 @@ "@babel/traverse" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" +"@babel/helper-replace-supers@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.0.0-beta.46.tgz#921c0f25d875026a8fb12feda1b72323595ea156" + dependencies: + "@babel/helper-member-expression-to-functions" "7.0.0-beta.46" + "@babel/helper-optimise-call-expression" "7.0.0-beta.46" + "@babel/traverse" "7.0.0-beta.46" + "@babel/types" "7.0.0-beta.46" + "@babel/helper-simple-access@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.0.0-beta.44.tgz#03fb6bfc91eb0a95f6c11499153f8c663654dce5" @@ -170,12 +340,26 @@ "@babel/types" "7.0.0-beta.44" lodash "^4.2.0" +"@babel/helper-simple-access@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.0.0-beta.46.tgz#8eb0edf978c85915d11b6a7aa8591434e158170d" + dependencies: + "@babel/template" "7.0.0-beta.46" + "@babel/types" "7.0.0-beta.46" + lodash "^4.2.0" + "@babel/helper-split-export-declaration@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.44.tgz#c0b351735e0fbcb3822c8ad8db4e583b05ebd9dc" dependencies: "@babel/types" "7.0.0-beta.44" +"@babel/helper-split-export-declaration@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0-beta.46.tgz#6903893c72bb2a3d54ed20b5ff2aa8a28e8d2ea1" + dependencies: + "@babel/types" "7.0.0-beta.46" + "@babel/helper-wrap-function@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0-beta.44.tgz#d128718a543f313264dff7cb386957e3e465c95d" @@ -185,6 +369,15 @@ "@babel/traverse" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" +"@babel/helper-wrap-function@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.0.0-beta.46.tgz#d0fb836516d8a38ab80df1b434e4b76015be9035" + dependencies: + "@babel/helper-function-name" "7.0.0-beta.46" + "@babel/template" "7.0.0-beta.46" + "@babel/traverse" "7.0.0-beta.46" + "@babel/types" "7.0.0-beta.46" + "@babel/helpers@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.0.0-beta.44.tgz#b1cc87fdc3b77351c0a4860bcd9d4ef457919bfd" @@ -193,6 +386,14 @@ "@babel/traverse" "7.0.0-beta.44" "@babel/types" "7.0.0-beta.44" +"@babel/helpers@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.0.0-beta.46.tgz#b5f988dfd77f4f713792cf7818b687050736ee52" + dependencies: + "@babel/template" "7.0.0-beta.46" + "@babel/traverse" "7.0.0-beta.46" + "@babel/types" "7.0.0-beta.46" + "@babel/highlight@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.44.tgz#18c94ce543916a80553edcdcf681890b200747d5" @@ -201,6 +402,14 @@ esutils "^2.0.2" js-tokens "^3.0.0" +"@babel/highlight@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0-beta.46.tgz#c553c51e65f572bdedd6eff66fc0bb563016645e" + dependencies: + chalk "^2.0.0" + esutils "^2.0.2" + js-tokens "^3.0.0" + "@babel/plugin-proposal-async-generator-functions@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0-beta.44.tgz#b08d90cd0f6a82e11cb5ae64eee4fba7d0d7999e" @@ -209,26 +418,34 @@ "@babel/helper-remap-async-to-generator" "7.0.0-beta.44" "@babel/plugin-syntax-async-generators" "7.0.0-beta.44" -"@babel/plugin-proposal-decorators@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.0.0-beta.44.tgz#287ba7d320f58b45e8fb7148b0d06fc6692c8c0d" +"@babel/plugin-proposal-async-generator-functions@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.0.0-beta.46.tgz#395330d1d5d7fb76c33b7bd99750adeafc37c68c" dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.44" - "@babel/plugin-syntax-decorators" "7.0.0-beta.44" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/helper-remap-async-to-generator" "7.0.0-beta.46" + "@babel/plugin-syntax-async-generators" "7.0.0-beta.46" -"@babel/plugin-proposal-export-default-from@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.0.0-beta.44.tgz#666745a42c9a5fc749a12a8f108134dff3056742" +"@babel/plugin-proposal-decorators@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.0.0-beta.46.tgz#48c89fc48dc461db03f1260675c73f98afeeddcc" dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.44" - "@babel/plugin-syntax-export-default-from" "7.0.0-beta.44" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-syntax-decorators" "7.0.0-beta.46" -"@babel/plugin-proposal-export-namespace-from@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.0.0-beta.44.tgz#00ac9d8a28addd88599d356f098894ae3d8ec1de" +"@babel/plugin-proposal-export-default-from@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.0.0-beta.46.tgz#950321f024846ea1d45847c77b695fb4dbc549b9" dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.44" - "@babel/plugin-syntax-export-namespace-from" "7.0.0-beta.44" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-syntax-export-default-from" "7.0.0-beta.46" + +"@babel/plugin-proposal-export-namespace-from@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.0.0-beta.46.tgz#81fa717faa390db694c2b2f241830a31d01f5170" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-syntax-export-namespace-from" "7.0.0-beta.46" "@babel/plugin-proposal-function-bind@7.0.0-beta.44": version "7.0.0-beta.44" @@ -237,6 +454,13 @@ "@babel/helper-plugin-utils" "7.0.0-beta.44" "@babel/plugin-syntax-function-bind" "7.0.0-beta.44" +"@babel/plugin-proposal-function-bind@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-function-bind/-/plugin-proposal-function-bind-7.0.0-beta.46.tgz#3f83ce96a43405cf34362a916be0f19519a3161d" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-syntax-function-bind" "7.0.0-beta.46" + "@babel/plugin-proposal-object-rest-spread@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.44.tgz#b7817770cb9cf72f2e73ca6fcb83d61a87305259" @@ -244,6 +468,13 @@ "@babel/helper-plugin-utils" "7.0.0-beta.44" "@babel/plugin-syntax-object-rest-spread" "7.0.0-beta.44" +"@babel/plugin-proposal-object-rest-spread@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.0.0-beta.46.tgz#fb3979488a52c1246cdced4a438ace0f47ac985b" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-syntax-object-rest-spread" "7.0.0-beta.46" + "@babel/plugin-proposal-optional-catch-binding@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0-beta.44.tgz#87928d30c9fab4803cdba29f9c1260c16bc5d30f" @@ -251,26 +482,54 @@ "@babel/helper-plugin-utils" "7.0.0-beta.44" "@babel/plugin-syntax-optional-catch-binding" "7.0.0-beta.44" -"@babel/plugin-proposal-optional-chaining@^7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.0.0-beta.44.tgz#f90682a4ced3eaf80c906a349ce9faa424c0b211" +"@babel/plugin-proposal-optional-catch-binding@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.0.0-beta.46.tgz#fda50deaab3272500a8a1c7088d7d55148f54048" dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.44" - "@babel/plugin-syntax-optional-chaining" "7.0.0-beta.44" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-syntax-optional-catch-binding" "7.0.0-beta.46" -"@babel/plugin-proposal-pipeline-operator@^7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.0.0-beta.44.tgz#233041e3cf11fd108044e3cf40ac6ae4645725b8" +"@babel/plugin-proposal-optional-chaining@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.0.0-beta.46.tgz#2c8926e6c8c70bbb3844bb2cce61dcd9287176ee" dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.44" - "@babel/plugin-syntax-pipeline-operator" "7.0.0-beta.44" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-syntax-optional-chaining" "7.0.0-beta.46" -"@babel/plugin-proposal-throw-expressions@^7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.0.0-beta.44.tgz#1e54689dddc733e4986371b6818adcea161531a3" +"@babel/plugin-proposal-optional-chaining@^7.0.0-beta.46": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.0.0-beta.47.tgz#099e5720121f91eb36544575f98d44cd57865ea5" dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.44" - "@babel/plugin-syntax-throw-expressions" "7.0.0-beta.44" + "@babel/helper-plugin-utils" "7.0.0-beta.47" + "@babel/plugin-syntax-optional-chaining" "7.0.0-beta.47" + +"@babel/plugin-proposal-pipeline-operator@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.0.0-beta.46.tgz#0804b24052d83d6ff45b5020f8b47c1bedd410eb" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-syntax-pipeline-operator" "7.0.0-beta.46" + +"@babel/plugin-proposal-pipeline-operator@^7.0.0-beta.46": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.0.0-beta.47.tgz#75497b1a8787209f493134db062ccd765f974101" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.47" + "@babel/plugin-syntax-pipeline-operator" "7.0.0-beta.47" + +"@babel/plugin-proposal-throw-expressions@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.0.0-beta.46.tgz#eb259c73043050a51e40b53e74342763aa9b77b4" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-syntax-throw-expressions" "7.0.0-beta.46" + +"@babel/plugin-proposal-throw-expressions@^7.0.0-beta.46": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.0.0-beta.47.tgz#9a67f8b0852b4b0b255eff5d6d25fa436928424f" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.47" + "@babel/plugin-syntax-throw-expressions" "7.0.0-beta.47" "@babel/plugin-proposal-unicode-property-regex@7.0.0-beta.44": version "7.0.0-beta.44" @@ -280,29 +539,43 @@ "@babel/helper-regex" "7.0.0-beta.44" regexpu-core "^4.1.3" +"@babel/plugin-proposal-unicode-property-regex@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.0.0-beta.46.tgz#b422a602094d7feeea4a7b81e7e32d1687337123" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/helper-regex" "7.0.0-beta.46" + regexpu-core "^4.1.3" + "@babel/plugin-syntax-async-generators@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0-beta.44.tgz#5cf7ec4256ddd7df62654171059188bee2b3addc" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" -"@babel/plugin-syntax-decorators@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.0.0-beta.44.tgz#f56e4ce94d67e0189532305af32b9d2ac2902e65" +"@babel/plugin-syntax-async-generators@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.0.0-beta.46.tgz#b35149e02748922d8e39506b0ac001a27bf449ed" dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.44" + "@babel/helper-plugin-utils" "7.0.0-beta.46" -"@babel/plugin-syntax-export-default-from@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.0.0-beta.44.tgz#108c34c48d325417d15b9005aceaffa310adf92a" +"@babel/plugin-syntax-decorators@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.0.0-beta.46.tgz#e60903d38dc5aaeab07eb3aaf8582055570300fe" dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.44" + "@babel/helper-plugin-utils" "7.0.0-beta.46" -"@babel/plugin-syntax-export-namespace-from@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.0.0-beta.44.tgz#c75a1607a453b74fe83d3bccf442931a7021209b" +"@babel/plugin-syntax-export-default-from@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.0.0-beta.46.tgz#88e0043c680d4ca881adeac11246ebfc6257dda4" dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.44" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + +"@babel/plugin-syntax-export-namespace-from@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.0.0-beta.46.tgz#aba4fcb34a0afec4f5b3c526ff693708b72a2fd0" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" "@babel/plugin-syntax-flow@7.0.0-beta.44": version "7.0.0-beta.44" @@ -310,41 +583,89 @@ dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-syntax-flow@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.0.0-beta.46.tgz#f9940274770945cc758a947944949e70ea530e7f" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + +"@babel/plugin-syntax-flow@7.0.0-beta.47": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.0.0-beta.47.tgz#9d0b09b9af6fec87a7b22e406bf948089d58c188" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.47" + "@babel/plugin-syntax-function-bind@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.0.0-beta.44.tgz#5f0ebca8144fc89ff3c8442f94a5af33ca9139f0" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-syntax-function-bind@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-function-bind/-/plugin-syntax-function-bind-7.0.0-beta.46.tgz#e44281aba4c02be1213aa4a9b338114fc8b8c052" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-syntax-object-rest-spread@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.44.tgz#c37d271e4edf8a1b5d4623fb2917ba0f5a9da3b3" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-syntax-object-rest-spread@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.0.0-beta.46.tgz#03d46637f549757b2d6877b6449901698059d7d8" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-syntax-optional-catch-binding@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0-beta.44.tgz#c79ee93c371831b104bb0a1cc9c85ac5373af4f3" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" -"@babel/plugin-syntax-optional-chaining@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.0.0-beta.44.tgz#3e41156dc1cc94b1b6cc21cfb96e50dda4ad9986" +"@babel/plugin-syntax-optional-catch-binding@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.0.0-beta.46.tgz#701ba500cc154dd87c4d16a41fa858e9ffc6db89" dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.44" + "@babel/helper-plugin-utils" "7.0.0-beta.46" -"@babel/plugin-syntax-pipeline-operator@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.0.0-beta.44.tgz#ab5af2743b05a542abab74d1d52a0fbd76889770" +"@babel/plugin-syntax-optional-chaining@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.0.0-beta.46.tgz#77c51b180a9895d701b398441d94815c56946a75" dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.44" + "@babel/helper-plugin-utils" "7.0.0-beta.46" -"@babel/plugin-syntax-throw-expressions@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.0.0-beta.44.tgz#e2d1c33690e62f82d61e5d0b07af3267732159bf" +"@babel/plugin-syntax-optional-chaining@7.0.0-beta.47": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.0.0-beta.47.tgz#f1febe859d9dde26f2b2e1f20cf679925d1fab23" dependencies: - "@babel/helper-plugin-utils" "7.0.0-beta.44" + "@babel/helper-plugin-utils" "7.0.0-beta.47" + +"@babel/plugin-syntax-pipeline-operator@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.0.0-beta.46.tgz#d34ce265f1800131e7e8dbf1404ad6a8a829214b" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + +"@babel/plugin-syntax-pipeline-operator@7.0.0-beta.47": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-pipeline-operator/-/plugin-syntax-pipeline-operator-7.0.0-beta.47.tgz#14c44a962e154e91d8c93f774a1867399810a8d7" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.47" + +"@babel/plugin-syntax-throw-expressions@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.0.0-beta.46.tgz#f0b759c3122ded926b884c6c30e32192da048388" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + +"@babel/plugin-syntax-throw-expressions@7.0.0-beta.47": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-throw-expressions/-/plugin-syntax-throw-expressions-7.0.0-beta.47.tgz#8ca197bab3534f443eecd7eb79da47e199dafaf7" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.47" "@babel/plugin-transform-arrow-functions@7.0.0-beta.44": version "7.0.0-beta.44" @@ -352,6 +673,12 @@ dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-arrow-functions@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.0.0-beta.46.tgz#130e79b1d4508767c47e5febb809f8dca80c05f5" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-async-to-generator@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0-beta.44.tgz#b91881aa6e1a6bd330be31df43a936feeb145c29" @@ -360,12 +687,26 @@ "@babel/helper-plugin-utils" "7.0.0-beta.44" "@babel/helper-remap-async-to-generator" "7.0.0-beta.44" +"@babel/plugin-transform-async-to-generator@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.0.0-beta.46.tgz#29fd5967f5056ca80f3a97db4d2ffa38a0dc2dce" + dependencies: + "@babel/helper-module-imports" "7.0.0-beta.46" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/helper-remap-async-to-generator" "7.0.0-beta.46" + "@babel/plugin-transform-block-scoped-functions@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0-beta.44.tgz#d31bb2231ae861fa4ea6f9974b8b8f5641a3460a" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-block-scoped-functions@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.0.0-beta.46.tgz#0925a549931f61b45880618b0b42da4790b7c0b3" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-block-scoping@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0-beta.44.tgz#a7b640e112743634b9226996e58ab92cdebb4ff0" @@ -373,6 +714,13 @@ "@babel/helper-plugin-utils" "7.0.0-beta.44" lodash "^4.2.0" +"@babel/plugin-transform-block-scoping@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.0.0-beta.46.tgz#da42dd17fbed675c72233988dbad9ace5ab9e4a7" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + lodash "^4.2.0" + "@babel/plugin-transform-classes@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0-beta.44.tgz#5410fcf6a9eeba3cc8e25bf0f72b43358336b534" @@ -386,18 +734,43 @@ "@babel/helper-split-export-declaration" "7.0.0-beta.44" globals "^11.1.0" +"@babel/plugin-transform-classes@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.0.0-beta.46.tgz#00c856feda2ee756c4cc6ef8c97d17d070acebf7" + dependencies: + "@babel/helper-annotate-as-pure" "7.0.0-beta.46" + "@babel/helper-define-map" "7.0.0-beta.46" + "@babel/helper-function-name" "7.0.0-beta.46" + "@babel/helper-optimise-call-expression" "7.0.0-beta.46" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/helper-replace-supers" "7.0.0-beta.46" + "@babel/helper-split-export-declaration" "7.0.0-beta.46" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0-beta.44.tgz#1421b4e1a18dc3bd276d8648a12a4f8ea088c6a1" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-computed-properties@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.0.0-beta.46.tgz#ca1ece27615f7324345713fb6a93dd288788e891" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-destructuring@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0-beta.44.tgz#57c8b40d56db45eaa39b44696818b24004306752" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-destructuring@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.0.0-beta.46.tgz#6e6a097da31063f545f7818afe48ef09165ce5ff" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-dotall-regex@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0-beta.44.tgz#414bd71f39199e45a8ddaa8053cb5bd9690707f4" @@ -406,12 +779,26 @@ "@babel/helper-regex" "7.0.0-beta.44" regexpu-core "^4.1.3" +"@babel/plugin-transform-dotall-regex@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.0.0-beta.46.tgz#e5bbd78c1a94455e6d5dd1c77f32357b84355e06" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/helper-regex" "7.0.0-beta.46" + regexpu-core "^4.1.3" + "@babel/plugin-transform-duplicate-keys@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0-beta.44.tgz#e945a7990d9adca4f9b58a7af46cdb1515b925b1" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-duplicate-keys@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.0.0-beta.46.tgz#7e94e42099b099742617838237b0d6e1a9b2690f" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-exponentiation-operator@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0-beta.44.tgz#e6a9699b5036a7a75274e1546c23414ba945a135" @@ -419,6 +806,13 @@ "@babel/helper-builder-binary-assignment-operator-visitor" "7.0.0-beta.44" "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-exponentiation-operator@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.0.0-beta.46.tgz#95ae2e03456e417d2f5eace6d05a8fccb7af1bcc" + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "7.0.0-beta.46" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-flow-strip-types@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.0.0-beta.44.tgz#e7f5028f886f6410d9e5488a4f2fde4a28afe9d8" @@ -426,12 +820,32 @@ "@babel/helper-plugin-utils" "7.0.0-beta.44" "@babel/plugin-syntax-flow" "7.0.0-beta.44" +"@babel/plugin-transform-flow-strip-types@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.0.0-beta.46.tgz#3c26def3c4027d5c0c3f98c3b6f161c715ab7fff" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-syntax-flow" "7.0.0-beta.46" + +"@babel/plugin-transform-flow-strip-types@7.0.0-beta.47": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.0.0-beta.47.tgz#fa45811094c10d70c84efdd0eac62ebd2a634bf7" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.47" + "@babel/plugin-syntax-flow" "7.0.0-beta.47" + "@babel/plugin-transform-for-of@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0-beta.44.tgz#b157e38e74c07beacbac01c1946b8ad11dbea32c" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-for-of@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.0.0-beta.46.tgz#ce643487384c96d1bd1f57a112b2ccba6c34da5c" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-function-name@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0-beta.44.tgz#8cd5986dac8a0fd0df21b79e9a20de9b2c37b4c4" @@ -439,12 +853,25 @@ "@babel/helper-function-name" "7.0.0-beta.44" "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-function-name@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.0.0-beta.46.tgz#2479f5188de9ab1f99396bce83b3b9d39bc13bdb" + dependencies: + "@babel/helper-function-name" "7.0.0-beta.46" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-literals@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.44.tgz#8c85631ea6fd8a6eecefdb81177ed6ae3d34b195" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-literals@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.0.0-beta.46.tgz#84f5bcfe914b9fd4385c0ddf469f9ed403ee68bd" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-modules-amd@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0-beta.44.tgz#4d2df3f507f00bbbea3bc3ee07505ed97df1f22e" @@ -452,6 +879,13 @@ "@babel/helper-module-transforms" "7.0.0-beta.44" "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-modules-amd@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.0.0-beta.46.tgz#01aeb4887c7df7059cefe4a206eefdf190c79f48" + dependencies: + "@babel/helper-module-transforms" "7.0.0-beta.46" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-modules-commonjs@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0-beta.44.tgz#864a1fef64091bd5241b0aa7d4b235fb29f60580" @@ -460,6 +894,14 @@ "@babel/helper-plugin-utils" "7.0.0-beta.44" "@babel/helper-simple-access" "7.0.0-beta.44" +"@babel/plugin-transform-modules-commonjs@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.0.0-beta.46.tgz#9dcb42e1282b281c1a2075f98b4a850533acfd9c" + dependencies: + "@babel/helper-module-transforms" "7.0.0-beta.46" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/helper-simple-access" "7.0.0-beta.46" + "@babel/plugin-transform-modules-systemjs@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0-beta.44.tgz#f27e97e592dd9739c8c5df478f1729bb4b63b386" @@ -467,6 +909,13 @@ "@babel/helper-hoist-variables" "7.0.0-beta.44" "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-modules-systemjs@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.0.0-beta.46.tgz#313e13e8edccaae6c645e3798a043521cf73df04" + dependencies: + "@babel/helper-hoist-variables" "7.0.0-beta.46" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-modules-umd@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.0.0-beta.44.tgz#66ca82476b72bfd1ce2d410ceaf2e85c1639a616" @@ -474,12 +923,25 @@ "@babel/helper-module-transforms" "7.0.0-beta.44" "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-modules-umd@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.0.0-beta.46.tgz#ad0ef488a123f479825c1ffe75c5bba9954a449c" + dependencies: + "@babel/helper-module-transforms" "7.0.0-beta.46" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-new-target@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0-beta.44.tgz#7f3a2c46e01b5433093430892fbce287583cb1b8" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-new-target@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0-beta.46.tgz#e3219c15a2175a29afa33b9b2f4c18dc1ae3c8cc" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-object-super@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0-beta.44.tgz#3c1688a7b38c4de8af269ff5c618cfd602864a39" @@ -487,6 +949,13 @@ "@babel/helper-plugin-utils" "7.0.0-beta.44" "@babel/helper-replace-supers" "7.0.0-beta.44" +"@babel/plugin-transform-object-super@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.0.0-beta.46.tgz#b5376fe93f5e154b765468f1a58a717717f95827" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/helper-replace-supers" "7.0.0-beta.46" + "@babel/plugin-transform-parameters@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0-beta.44.tgz#19eaf0b852d58168097435e33e754a00c3507fb9" @@ -495,12 +964,26 @@ "@babel/helper-get-function-arity" "7.0.0-beta.44" "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-parameters@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.0.0-beta.46.tgz#33bbd2e3bd499d99016034dcaf8c6b72c2a69ec3" + dependencies: + "@babel/helper-call-delegate" "7.0.0-beta.46" + "@babel/helper-get-function-arity" "7.0.0-beta.46" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-regenerator@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0-beta.44.tgz#e9a21db8fbedfd99b9e5d04ac405f7440d36b290" dependencies: regenerator-transform "^0.12.3" +"@babel/plugin-transform-regenerator@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0-beta.46.tgz#875ceb5b37ec0e898c23b60af760715d9d462b4f" + dependencies: + regenerator-transform "^0.12.3" + "@babel/plugin-transform-runtime@^7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.0.0-beta.44.tgz#13c7289c393425cc3bc99c9a0e836ca45f014c1f" @@ -514,12 +997,24 @@ dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-shorthand-properties@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.0.0-beta.46.tgz#aa21512b0fef7b916fc5cbc87df717465c25515c" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-spread@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0-beta.44.tgz#94cacc3317cb8e2227b543c25b8046d7635d4114" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-spread@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.0.0-beta.46.tgz#48eabb219f1e0c16e9b0a6166072ae9d4c7cd397" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-sticky-regex@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0-beta.44.tgz#512597cd7535f313aa29f31d0b60572a0374db00" @@ -527,6 +1022,13 @@ "@babel/helper-plugin-utils" "7.0.0-beta.44" "@babel/helper-regex" "7.0.0-beta.44" +"@babel/plugin-transform-sticky-regex@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.0.0-beta.46.tgz#c96c41f31272ec1cdc47dd91a22c6d75c4db70d2" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/helper-regex" "7.0.0-beta.46" + "@babel/plugin-transform-template-literals@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0-beta.44.tgz#88d4605e63a21a4354837af06371e8c51cd76d08" @@ -534,12 +1036,25 @@ "@babel/helper-annotate-as-pure" "7.0.0-beta.44" "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-template-literals@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.0.0-beta.46.tgz#e8bcc798dece29807893e8ee27ccf3176f658c62" + dependencies: + "@babel/helper-annotate-as-pure" "7.0.0-beta.46" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-typeof-symbol@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0-beta.44.tgz#ba0ded29aea2a51700e0730a054faa64a22ff38a" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" +"@babel/plugin-transform-typeof-symbol@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.0.0-beta.46.tgz#643529184cbb07199237c94537c89ea9a721fa0a" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-unicode-regex@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0-beta.44.tgz#d7cf607948da5e997e277eba1caed30e80beaf76" @@ -548,9 +1063,17 @@ "@babel/helper-regex" "7.0.0-beta.44" regexpu-core "^4.1.3" -"@babel/polyfill@7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.0.0-beta.44.tgz#6bbcddebd8f28f1040b9a78fdac7dc515356e5dc" +"@babel/plugin-transform-unicode-regex@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.0.0-beta.46.tgz#10e6edcc8eb0db71ff2f0e3fc87ed88337d24fb9" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/helper-regex" "7.0.0-beta.46" + regexpu-core "^4.1.3" + +"@babel/polyfill@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/polyfill/-/polyfill-7.0.0-beta.46.tgz#5a4203a3abee8ddfb80afd3cf6f5ff1391750695" dependencies: core-js "^2.5.3" regenerator-runtime "^0.11.1" @@ -599,21 +1122,79 @@ invariant "^2.2.2" semver "^5.3.0" -"@babel/preset-flow@7.0.0-beta.44", "@babel/preset-flow@^7.0.0-beta.44": +"@babel/preset-env@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.0.0-beta.46.tgz#ae1b731ef71c2bb50c47e0cda4b6359ea2c61f09" + dependencies: + "@babel/helper-module-imports" "7.0.0-beta.46" + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-proposal-async-generator-functions" "7.0.0-beta.46" + "@babel/plugin-proposal-object-rest-spread" "7.0.0-beta.46" + "@babel/plugin-proposal-optional-catch-binding" "7.0.0-beta.46" + "@babel/plugin-proposal-unicode-property-regex" "7.0.0-beta.46" + "@babel/plugin-syntax-async-generators" "7.0.0-beta.46" + "@babel/plugin-syntax-object-rest-spread" "7.0.0-beta.46" + "@babel/plugin-syntax-optional-catch-binding" "7.0.0-beta.46" + "@babel/plugin-transform-arrow-functions" "7.0.0-beta.46" + "@babel/plugin-transform-async-to-generator" "7.0.0-beta.46" + "@babel/plugin-transform-block-scoped-functions" "7.0.0-beta.46" + "@babel/plugin-transform-block-scoping" "7.0.0-beta.46" + "@babel/plugin-transform-classes" "7.0.0-beta.46" + "@babel/plugin-transform-computed-properties" "7.0.0-beta.46" + "@babel/plugin-transform-destructuring" "7.0.0-beta.46" + "@babel/plugin-transform-dotall-regex" "7.0.0-beta.46" + "@babel/plugin-transform-duplicate-keys" "7.0.0-beta.46" + "@babel/plugin-transform-exponentiation-operator" "7.0.0-beta.46" + "@babel/plugin-transform-for-of" "7.0.0-beta.46" + "@babel/plugin-transform-function-name" "7.0.0-beta.46" + "@babel/plugin-transform-literals" "7.0.0-beta.46" + "@babel/plugin-transform-modules-amd" "7.0.0-beta.46" + "@babel/plugin-transform-modules-commonjs" "7.0.0-beta.46" + "@babel/plugin-transform-modules-systemjs" "7.0.0-beta.46" + "@babel/plugin-transform-modules-umd" "7.0.0-beta.46" + "@babel/plugin-transform-new-target" "7.0.0-beta.46" + "@babel/plugin-transform-object-super" "7.0.0-beta.46" + "@babel/plugin-transform-parameters" "7.0.0-beta.46" + "@babel/plugin-transform-regenerator" "7.0.0-beta.46" + "@babel/plugin-transform-shorthand-properties" "7.0.0-beta.46" + "@babel/plugin-transform-spread" "7.0.0-beta.46" + "@babel/plugin-transform-sticky-regex" "7.0.0-beta.46" + "@babel/plugin-transform-template-literals" "7.0.0-beta.46" + "@babel/plugin-transform-typeof-symbol" "7.0.0-beta.46" + "@babel/plugin-transform-unicode-regex" "7.0.0-beta.46" + browserslist "^3.0.0" + invariant "^2.2.2" + semver "^5.3.0" + +"@babel/preset-flow@7.0.0-beta.44": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.0.0-beta.44.tgz#0adc4674743a29e6f303dc542d2d35eaec095673" dependencies: "@babel/helper-plugin-utils" "7.0.0-beta.44" "@babel/plugin-transform-flow-strip-types" "7.0.0-beta.44" -"@babel/register@^7.0.0-beta.44": - version "7.0.0-beta.44" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.0.0-beta.44.tgz#89cce279f1444aa560f10597073d0e448482d960" +"@babel/preset-flow@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.0.0-beta.46.tgz#1491a70eb254c5bf3221af42edf04bcf0df95435" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.46" + "@babel/plugin-transform-flow-strip-types" "7.0.0-beta.46" + +"@babel/preset-flow@^7.0.0-beta.46": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.0.0-beta.47.tgz#ad74dc20429718f70ffaf91f280790474f55060a" + dependencies: + "@babel/helper-plugin-utils" "7.0.0-beta.47" + "@babel/plugin-transform-flow-strip-types" "7.0.0-beta.47" + +"@babel/register@^7.0.0-beta.46": + version "7.0.0-beta.47" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.0.0-beta.47.tgz#ac53bc357ca59979db0e306aa5d3121aa612a7a2" dependencies: core-js "^2.5.3" find-cache-dir "^1.0.0" home-or-tmp "^3.0.0" - lodash "^4.2.0" + lodash "^4.17.5" mkdirp "^0.5.1" pirates "^3.0.1" source-map-support "^0.4.2" @@ -634,6 +1215,15 @@ babylon "7.0.0-beta.44" lodash "^4.2.0" +"@babel/template@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.46.tgz#8b23982411d5b5dbfa479437bfe414adb1411bb9" + dependencies: + "@babel/code-frame" "7.0.0-beta.46" + "@babel/types" "7.0.0-beta.46" + babylon "7.0.0-beta.46" + lodash "^4.2.0" + "@babel/traverse@7.0.0-beta.44", "@babel/traverse@^7.0.0-beta.40": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.44.tgz#a970a2c45477ad18017e2e465a0606feee0d2966" @@ -649,6 +1239,21 @@ invariant "^2.2.0" lodash "^4.2.0" +"@babel/traverse@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.46.tgz#29a0c0395b3642f0297e6f8e475bde89f9343755" + dependencies: + "@babel/code-frame" "7.0.0-beta.46" + "@babel/generator" "7.0.0-beta.46" + "@babel/helper-function-name" "7.0.0-beta.46" + "@babel/helper-split-export-declaration" "7.0.0-beta.46" + "@babel/types" "7.0.0-beta.46" + babylon "7.0.0-beta.46" + debug "^3.1.0" + globals "^11.1.0" + invariant "^2.2.0" + lodash "^4.2.0" + "@babel/types@7.0.0-beta.44", "@babel/types@^7.0.0-beta.40": version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.44.tgz#6b1b164591f77dec0a0342aca995f2d046b3a757" @@ -657,6 +1262,14 @@ lodash "^4.2.0" to-fast-properties "^2.0.0" +"@babel/types@7.0.0-beta.46": + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.46.tgz#eb84399a699af9fcb244440cce78e1acbeb40e0c" + dependencies: + esutils "^2.0.2" + lodash "^4.2.0" + to-fast-properties "^2.0.0" + "@gulp-sourcemaps/identity-map@1.X": version "1.0.1" resolved "https://registry.yarnpkg.com/@gulp-sourcemaps/identity-map/-/identity-map-1.0.1.tgz#cfa23bc5840f9104ce32a65e74db7e7a974bbee1" @@ -2156,6 +2769,10 @@ babylon@7.0.0-beta.44, babylon@^7.0.0-beta.40: version "7.0.0-beta.44" resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.44.tgz#89159e15e6e30c5096e22d738d8c0af8a0e8ca1d" +babylon@7.0.0-beta.46: + version "7.0.0-beta.46" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.46.tgz#b6ddaba81bbb130313932757ff9c195d527088b6" + babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -2566,6 +3183,10 @@ buffer-crc32@^0.2.1, buffer-crc32@^0.2.13, buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" +buffer-equal-constant-time@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819" + buffer-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" @@ -3349,6 +3970,10 @@ cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": dependencies: cssom "0.3.x" +cuid@^2.0.2: + version "2.1.1" + resolved "https://registry.yarnpkg.com/cuid/-/cuid-2.1.1.tgz#3b0fccbda1089ff123a127320c860b975200d62b" + cuint@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/cuint/-/cuint-0.2.2.tgz#408086d409550c2631155619e9fa7bcadc3b991b" @@ -3603,6 +4228,10 @@ data-urls@^1.0.0: whatwg-mimetype "^2.0.0" whatwg-url "^6.4.0" +dataloader@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.4.0.tgz#bca11d867f5d3f1b9ed9f737bd15970c65dff5c8" + date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" @@ -3819,6 +4448,10 @@ detect-newline@2.X, detect-newline@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" +detect-node@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" + detective@^5.0.2: version "5.1.0" resolved "https://registry.yarnpkg.com/detective/-/detective-5.1.0.tgz#7a20d89236d7b331ccea65832e7123b5551bb7cb" @@ -3999,6 +4632,12 @@ ecc-jsbn@~0.1.1: dependencies: jsbn "~0.1.0" +ecdsa-sig-formatter@1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.10.tgz#1c595000f04a8897dfb85000892a0f4c33af86c3" + dependencies: + safe-buffer "^5.0.1" + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -5217,6 +5856,12 @@ graceful-fs@~3.0.2: dependencies: natives "^1.1.0" +graphql@^0.13.0: + version "0.13.2" + resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.13.2.tgz#4c740ae3c222823e7004096f832e7b93b2108270" + dependencies: + iterall "^1.2.1" + growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -5394,6 +6039,10 @@ gulplog@^1.0.0: dependencies: glogg "^1.0.0" +handle-thing@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + handlebars@^4.0.3, handlebars@^4.0.6: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" @@ -5653,6 +6302,15 @@ hosted-git-info@^2.1.4: version "2.6.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + hpkp@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/hpkp/-/hpkp-2.0.0.tgz#10e142264e76215a5d30c44ec43de64dee6d1672" @@ -5698,6 +6356,10 @@ http-cache-semantics@3.8.1: version "3.8.1" resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + http-errors@1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" @@ -5757,6 +6419,13 @@ http-server-plus@^0.10.0: event-to-promise "^0.8.0" lodash "^4.16.0" +http-server-plus@^0.9.0: + version "0.9.0" + resolved "https://registry.yarnpkg.com/http-server-plus/-/http-server-plus-0.9.0.tgz#3b0b38415aa18a479327e6781b23a1a26de71819" + dependencies: + event-to-promise "^0.8.0" + lodash "^4.16.0" + http-signature@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" @@ -5827,6 +6496,10 @@ immutable@^3.8.2: version "3.8.2" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" +immutable@^4.0.0-rc.4: + version "4.0.0-rc.9" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.9.tgz#1e6e0094e649013ec3742d2b5aeeca5eeda4f0bf" + import-local@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" @@ -6462,6 +7135,10 @@ iterable-backoff@^0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/iterable-backoff/-/iterable-backoff-0.0.0.tgz#e49660be7e1727fc52ee5c86c67cc3a427b4e109" +iterall@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.2.2.tgz#92d70deb8028e0c39ff3164fdbf4d8b088130cd7" + jest-changed-files@^22.4.3: version "22.4.3" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.4.3.tgz#8882181e022c38bd46a2e4d18d44d19d90a90fb2" @@ -6903,6 +7580,21 @@ jsonrpc-websocket-client@^0.3.0: promise-toolbox "^0.9.5" ws "^4.0.0" +jsonwebtoken@^8.1.0: + version "8.2.1" + resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-8.2.1.tgz#333ee39aa8f238f32fa41693e7a2fb7e42f82b31" + dependencies: + jws "^3.1.4" + lodash.includes "^4.3.0" + lodash.isboolean "^3.0.3" + lodash.isinteger "^4.0.4" + lodash.isnumber "^3.0.3" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.once "^4.0.0" + ms "^2.1.1" + xtend "^4.0.1" + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -6951,6 +7643,21 @@ just-reduce-object@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/just-reduce-object/-/just-reduce-object-1.0.3.tgz#08b69499dba3504f7a46b73937b4cdf7a5a05a2e" +jwa@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/jwa/-/jwa-1.1.6.tgz#87240e76c9808dbde18783cf2264ef4929ee50e6" + dependencies: + buffer-equal-constant-time "1.0.1" + ecdsa-sig-formatter "1.0.10" + safe-buffer "^5.0.1" + +jws@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/jws/-/jws-3.1.5.tgz#80d12d05b293d1e841e7cb8b4e69e561adcf834f" + dependencies: + jwa "^1.1.5" + safe-buffer "^5.0.1" + keycode@^2.1.0: version "2.2.0" resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.0.tgz#3d0af56dc7b8b8e5cba8d0a97f107204eec22b04" @@ -7370,6 +8077,10 @@ lodash.get@^4.4.2: version "4.4.2" resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" +lodash.includes@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f" + lodash.invert@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/lodash.invert/-/lodash.invert-4.3.0.tgz#8ffe20d4b616f56bea8f1aa0c6ebd80dcf742aee" @@ -7382,10 +8093,30 @@ lodash.isarray@^3.0.0: version "3.0.4" resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" +lodash.isboolean@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6" + lodash.isfunction@^3.0.6: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" +lodash.isinteger@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343" + +lodash.isnumber@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc" + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" @@ -7406,6 +8137,10 @@ lodash.mergewith@^4.6.0: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" +lodash.once@^4.0.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac" + lodash.reduce@4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b" @@ -7777,6 +8512,12 @@ mkdirp@0.5, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@~0.5.1: dependencies: minimist "0.0.8" +mnemonist@^0.21.0: + version "0.21.0" + resolved "https://registry.yarnpkg.com/mnemonist/-/mnemonist-0.21.0.tgz#919a844f94a7ac4f8ce93b19cd8cb28d31ed389b" + dependencies: + obliterator "^1.2.1" + modular-css-core@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/modular-css-core/-/modular-css-core-8.1.0.tgz#4a920ba3d762cbd53a911a4ec2b8f40c90f8e8be" @@ -8366,6 +9107,14 @@ object.values@^1.0.4: function-bind "^1.1.0" has "^1.0.1" +obliterator@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/obliterator/-/obliterator-1.3.0.tgz#54cbf790f2403b5c23bf562fbe5606f19b2721c8" + +obuf@^1.0.0, obuf@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -10201,6 +10950,10 @@ scss-tokenizer@^0.2.3: js-base64 "^2.1.8" source-map "^0.4.2" +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + semver-greatest-satisfied-range@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz#13e8c2658ab9691cb0cd71093240280d36f77a5b" @@ -10540,6 +11293,29 @@ spdx-license-ids@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" +spdy-transport@^2.0.18: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1" + dependencies: + debug "^2.6.8" + detect-node "^2.0.3" + hpack.js "^2.1.6" + obuf "^1.1.1" + readable-stream "^2.2.9" + safe-buffer "^5.0.1" + wbuf "^1.7.2" + +spdy@^3.4.7: + version "3.4.7" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + dependencies: + debug "^2.6.8" + handle-thing "^1.2.5" + http-deceiver "^1.2.7" + safe-buffer "^5.0.1" + select-hose "^2.0.0" + spdy-transport "^2.0.18" + speedometer@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/speedometer/-/speedometer-1.0.0.tgz#cd671cb06752c22bca3370e2f334440be4fc62e2" @@ -11569,6 +12345,12 @@ watchify@^3.7.0: through2 "^2.0.0" xtend "^4.0.0" +wbuf@^1.1.0, wbuf@^1.7.2: + version "1.7.3" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" + dependencies: + minimalistic-assert "^1.0.0" + webidl-conversions@^4.0.1, webidl-conversions@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" @@ -11899,6 +12681,10 @@ yazl@^2.4.3: dependencies: buffer-crc32 "~0.2.3" +zen-observable@^0.8.6: + version "0.8.8" + resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.8.tgz#1ea93995bf098754a58215a1e0a7309e5749ec42" + zip-stream@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04"