diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 00000000..0abea89a --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,8 @@ +codecov: + notify: + require_ci_to_pass: yes + +coverage: + precision: 2 + round: down + range: "99...100" diff --git a/.gitignore b/.gitignore index c4b41bc4..8ee09aa1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,8 +6,9 @@ coverage *.log .env .nyc_output +.stats.json .DS_Store # VS Code .vscode -!.vscode/tasks.js \ No newline at end of file +!.vscode/tasks.js diff --git a/.npmignore b/.npmignore index 56aedebc..9503fba5 100644 --- a/.npmignore +++ b/.npmignore @@ -5,6 +5,8 @@ tsconfig.json tslint.json .travis.yml .github +.codecov.yml +.stats.json build/temp build/docs diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..4cab2033 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "trailingComma": "all", + "tabWidth": 2, + "semi": true, + "singleQuote": true, + "printWidth" : 180, + "parser": "typescript", + "useTabs": false, + "bracketSpacing": true, + "arrowParens": "avoid" +} diff --git a/.travis.yml b/.travis.yml index f3c177a3..31fff974 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,14 +3,12 @@ git: submodules: false depth: 1 -addons: - firefox: latest - chrome: stable - before_install: - npm i -g npm@latest +after_success: +- npm run test:codecov + env: global: - - secure: uveWmRaiGKxKAYEP86LTSGmTmUvIXqBi0uNai087MDKvzdPuMQZSay3DSN9MLxAskbch1OjKoRCpkKy+z6tJsQL5z8tptpEcI5mD7LJU8U2akskEXANgqH8nPjqC0YPMPU2y8gWSLd/y22VaIKsF8WxXmVpjc57EXrXQtSqCUI9PI3cnyw9eqcv6Pf+3iXLEL4nr+ORvq+bQgEYk8U6ME+49KULRz+R4VhltZxy5F7T0vFEpAyRfsVYyKBwPss1NXE/M+EMqECRgTyXe1+roDO+DFHP+L0qrOrNEbjJSY5iYDfYOIfdtNYz6rvSbTl9jmsLYphb/BJy4eEB1DV38/K3WJ510gi0n3lWgFPlZB9Wh3S7LXQh4yieHbB2ddWYtX6IP9LNeNpdn/vgJwmuNyiAYsEdeqYdPSUynJ50RlwDVCLd4GkB5qpMBjMgtfXiY4NkqDECjc0BykjKqBZR4iWlDKygFVmBHAgzWrylNAhhiHcClRBLXaRoLa4/lJrpfefVShs5G+y5vxfptDFIbeQs6R2k6Xy5JTx36qMUZoVvdLyg+FqAjaadUGzVNadGw8Sk2DrVODigGB9Zbrmvay8yOYJL2/3JVD2SJua7wEaJnltIItG2F1smR4EcyxDKcOOUhPeat+vm2bXCCYf1MEgw+46iNIxIS05BD+B2aumk= - - secure: tuCHqcmWvzE5diSBB7jcgAbkzvEbUktR7eCn6wx2A/ntJmmEm2PRuoYQjIX99hF5d16QwgbxunjWihvLYskL7+t+Cwx4K9pyGFUojFQFK7X72py3ZGWrTRL0b1YdtZJ4tZjOK5C4IRy5FmMYV4OP3QHL7aeamFJikCdLHXiT3zfHjlsAwS4pHN8yfmcYgf5+xOrZ9FqVQu6M/HSJIOq/wpEKdFv7dZCxHcsPhjIAO4yCyfUw7pvk0RzOv7owf9LDIGpH5X8wI9GxzuREXSyzX3KBa2a1FdX8ctrxNTAjUepY4AjxAk6ZCcNUHcTeeOfVtZIfztGvryQddhvdWIveMUiGeiLS26L8sEo1xVcVLXpff3LB3vKHIoaDAiGAfp1ZAjRhMAI08yqE61E0h3n+5/fwgcni6p9gdp0eyfRv+QImxUFM+5caI7U6KkP5pjfRWi6zpLu1txCLKXeeh5IiKgnEHBtPu9LeM1UvOIqObOElXuRuPGuJAOH75mtferiWQL2kjjZlZSNGq0/ra+mn6HccuhDq7aIacOkrrz0q0oLSjGCknlCWmgfeP4P3zgm60+vbnOxM6PMm1avDibPyY2zdewGuvVg1p1CmUOoapbttzbptwOfFde/8U/AaSvMTehSTakSnMTj9JBiUa8mQZwRy64euuL2WZaX+D7DGwz4= + - secure: mIxTbk9QmMvSJ2BJL3rD/TBJppH4JIaMatoBBLsQzJYPtPzhvoEdgsPySh2jf3DAx7IUiQGbQEGsEyLfARanwZIkh5DggHWdMvYsP0ypCiNR7KV7BHCPfQd9v4OW7WF/KQCXzN3TIH+07KvF2swaNuEhKwnI+joVWMMgmEsCWQlTFiEbnieb2xxTMNrzl1WsrtANC9aQTeWVsNcW8xtDA/aQYefaQykOjHPJyyWaiLeBZ9Te0nMD7SeCSQUVywLT77saQJfsnHiCIKvv4lk+rvi6hQypAjBSznFwBa+Zkgk6y5DjT0SDhYXUVY3Kb8AJDFhgIwRlz74/ST9lGuEGnOjHZcQfqarbhcgbg8/HrsPP+spZwa4h0eRPNHfSDmrxTFDZXYDkULeLFPheMkvKKSqq0O+QdMmaL7hPuNWmEQINQg+quxHTjj/ldolL9Vb5db2zMu/jAYGmPDqQOk3GCilUcT4Eh64NmwEShfPY3VMuO/Weg37MJaFNX2efcKxCRWthpwEApqg/4GSk2Qeev7TY/mKkxNFXiXjMwjrXpobEtbQf4Kdy/vpyNE1YtxGiXBsSMMheMeDcVG2ryxaMNcKEyB2uncKqMH3jCU2lDJ/xoJfLmx2+FgxlrTtISl424lshQitWPU9co+FzBnXfyyZILxjsJZSzzZXe3ppWqAg= diff --git a/LICENSE b/LICENSE index e6d28548..98a48567 100644 --- a/LICENSE +++ b/LICENSE @@ -1,17 +1,15 @@ -/* - * Copyright (c) ${year} by Filestack. - * Some rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ \ No newline at end of file +Copyright (c) ${year} by Filestack. +Some rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + diff --git a/README.md b/README.md index 9fa1a529..6b9cc34d 100644 --- a/README.md +++ b/README.md @@ -4,71 +4,129 @@

Javascript SDK for the Filestack API and content management system.

+

+ + + + + + + +

- - + +


+**Table of Contents** + + +- [What's in the box?](#whats-in-the-box) +- [Installation](#installation) +- [API Documentation](#api-documentation) +- [Usage](#usage) + - [Browsers](#browsers) + - [ES module](#es-module) + - [UMD module](#umd-module) + - [GZIP support](#gzip-support) + - [SRI](#sri) + - [Node](#node) + - [CommonJS module](#commonjs-module) +- [Module Overview](#module-overview) +- [Releases Info](#releases-info) +- [Live examples (JSFiddle)](#live-examples-jsfiddle) +- [Picker Quick Start](#picker-quick-start) +- [Promises](#promises) +- [Development](#development) +- [Debugging](#debugging) + - [Node](#node-1) + - [Browser](#browser) +- [Versioning](#versioning) +- [Contributing](#contributing) + + ## What's in the box? * A multi-part uploader powered on the backend by the [Filestack CIN](https://www.filestack.com/products/content-ingestion-network). * An interface to the [Filestack Processing Engine](https://www.filestack.com/docs/image-transformations) for transforming assets via URLs. * The Filestack Picker - an upload widget for the web that integrates over a dozen cloud providers and provides pre-upload image editing. + ## Installation ```sh npm install filestack-js ``` + +## API Documentation + +[https://filestack.github.io/filestack-js/](https://filestack.github.io/filestack-js/) + ## Usage ### Browsers -**ES module**: +#### ES module ```js import * as filestack from 'filestack-js'; const client = filestack.init('apikey'); ``` -**UMD module**: +#### UMD module ```HTML - + ``` -where VERSION is one of the MAJOR versions of the filestack-js ie: +where ```{MAJOR_VERSION}``` is one of the MAJOR versions of the filestack-js ie: ```HTML - + ``` -**GZIP support** +#### GZIP support +To speed up library loading you can use gzipped file available after adding gz to file extension ```HTML -To speed up library loading you can use gzipped file available after adding gz before the file extension - - + ``` +#### SRI +Subresource Integrity (SRI) is a security feature that enables browsers to verify that files they fetch (for example, from a CDN) are delivered without unexpected manipulation. It works by allowing you to provide a cryptographic hash that a fetched file must match + +To obtain sri hashes for filestack-js library check manifest.json file on CDN: + +``` +https://static.filestackapi.com/filestack-js/{LIBRARY_VERSION}/manifest.json +``` + +```HTML + +``` + +Where ```{LIBRARY_VERSION}``` is currently used library version and ```{FILE_HASH}``` is one of the hashes from integrity field in manifest.json file + + ### Node -**CommonJS module**: +#### CommonJS module ```js const client = require('filestack-js').init('apikey'); ``` -### Module Overview + +## Module Overview The `package.json` specifies two separate modules: @@ -79,8 +137,13 @@ Node projects which depend on filestack-js will follow the `main` field in `pack The pre-bundled browser module is also available in UMD format. This is useful if you are using script tags on a web page instead of bundling your application. It can be retrieved from both the Filestack CDN and the unpkg CDN: -* [Filestack CDN](https://static.filestackapi.com/filestack-js/1.x.x/filestack.min.js) -* [unpkg](https://unpkg.com/filestack-js@1.x.x) +* [Filestack CDN](https://static.filestackapi.com/filestack-js/3.x.x/filestack.min.js) +* [unpkg](https://unpkg.com/filestack-js@3.x.x) + +## Releases Info + +Major releases will bo listed (with detailed examples) in releases folder starting from version 3.0.0 + ## Live examples (JSFiddle) @@ -114,29 +177,24 @@ The picker instance returned from `client.picker` can be controlled with a few m Please see our examples above to learn more about customizing the picker for your use case. -## API Documentation - -[https://filestack.github.io/filestack-js/](https://filestack.github.io/filestack-js/) - -### Promises +## Promises This library requires an environment that implements the [`Promise`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise) object spec. -If you target IE11 or iOS before 8.0 you will need to add a `Promise` polyfill to your page or application. +If you target IE11 or iOS before 8.0 you will need to add a `Promise` and `Symbol` polyfill to your page or application. -**Polyfills we recommend:** +Polyfills we recommend:** Module (for bundling): -* https://github.com/taylorhakes/promise-polyfill +* https://babeljs.io/docs/en/babel-polyfill Script (for script tag): -* https://cdn.polyfill.io/v2/polyfill.min.js?features=Promise +* https://polyfill.io/v3/polyfill.min.js?features=Promise%2CPromise.prototype.finally%2CSymbol ## Development -Most tests in this library are expected to interface with actual backend services. Because we like to run tests during development, these services are mocked -during unit testing. +Most tests in this library are expected to interface with actual backend services. Because we like to run tests during development, these services are mocked during unit testing. -All tests are using Mocha. Browser tests are run with Karma. +All tests are using Jest. To run units: @@ -144,28 +202,27 @@ To run units: npm test ``` -To run integration tests: +## Debugging -``` -npm run test:integration +Filestack-js uses [`debug`](https://github.com/visionmedia/debug), so just run with environmental variable `DEBUG` set to `fs.*`. + +### Node +```js +DEBUG=fs.* node example_upload.js ``` -Integration tests require a `.env` file in the root of your project with the following fields: +### Browser +Debug's enable state is persisted by localStorage +```js +localStorage.debug = 'fs:*' ``` -BROWSERSTACK_USERNAME= -BROWSERSTACK_ACCESS_KEY= -TEST_APIKEY= -TEST_CLOUD_APIKEY= -TEST_INTELLIGENT_APIKEY= -TEST_SECURE_APIKEY= -TEST_SIGNATURE= -TEST_POLICY= -TEST_FILELINK= -TEST_SECURE_FILELINK= -``` -You will need to acquire this data from a Filestack developer if you plan on running the integration suite. +And then refresh the page. + +## Versioning + +We use [SemVer](http://semver.org/) for versioning. For the versions available, see the [tags](https://github.com/filestack/filestack-js/tags) on this repository. ## Contributing diff --git a/examples/transform/demo.js b/examples/transform/demo.js index 526d8a31..cedc904f 100644 --- a/examples/transform/demo.js +++ b/examples/transform/demo.js @@ -9,7 +9,6 @@ window.addEventListener('DOMContentLoaded', function () { } ); - const img = document.createElement('img'); img.src = src.toString(); diff --git a/jest.config.js b/jest.config.js new file mode 100644 index 00000000..35969cfb --- /dev/null +++ b/jest.config.js @@ -0,0 +1,36 @@ +module.exports = { + name: 'filestack-js', + collectCoverage: true, + clearMocks: true, + projects: [{ + displayName: 'Common', + clearMocks: true, + testMatch: ['/src/**/*.spec.ts'], + testEnvironment: 'node', + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + transform: { + '^.+\\.tsx?$': 'ts-jest' + }, + }, { + displayName: 'Node', + clearMocks: true, + testMatch: ['/src/**/*.spec.ts'], + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + testMatch: ['/src/**/*.spec.node.ts'], + testEnvironment: 'node', + transform: { + '^.+\\.tsx?$': 'ts-jest' + }, + }, { + displayName: 'Browser', + testMatch: ['/src/**/*.browser.spec.ts'], + clearMocks: true, + testEnvironment: 'jsdom', + setupFiles: ['jest-localstorage-mock'], + testMatch: ['/src/**/*.spec.browser.ts'], + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], + transform: { + '^.+\\.tsx?$': 'ts-jest' + }, + }] +}; diff --git a/karma.conf.js b/karma.conf.js deleted file mode 100644 index 81060917..00000000 --- a/karma.conf.js +++ /dev/null @@ -1,111 +0,0 @@ -require('dotenv').config(); -const rollupConfig = require('./rollup.config.js'); - -module.exports = function karmaConfig(config) { - config.set({ - singleRun: true, - concurrency: 2, - failOnEmptyTestSuite: false, - frameworks: ['browserify', 'mocha'], - reporters: ['progress'], - browserify: { - debug: true, - transform: [ - 'envify', - ], - }, - rollupPreprocessor: Object.assign({}, rollupConfig, { - output: { - format: 'umd', - sourcemap: false, - }, - }), - browserStack: { - username: process.env.BROWSERSTACK_USERNAME, - accessKey: process.env.BROWSERSTACK_ACCESS_KEY, - timeout: 1800, - forcelocal: true, - }, - customLaunchers: { - bs_edge_windows_latest: { - base: 'BrowserStack', - os: 'Windows', - os_version: '10', - browser: 'Edge', - browser_version: 'latest', - }, - bs_safari_osx_latest: { - base: 'BrowserStack', - os: 'OS X', - os_version: null, - browser: 'Safari', - browser_version: 'latest', - }, - bs_iphone6: { - base: 'BrowserStack', - device: 'iPhone 6', - os: 'ios', - os_version: '8.3', - }, - bs_ie11: { - base: 'BrowserStack', - os: 'Windows', - os_version: '10', - browser: 'ie', - browser_version: '11', - debug: true - }, - electron: { - base: 'Electron', - // flags: ['--show'], - }, - firefox_headless: { - base: 'FirefoxHeadless', - }, - chrome_headless: { - base: 'Chrome', - flags: [ - '--headless', - '--disable-gpu', - // Without a remote debugging port, Google Chrome exits immediately. - '--remote-debugging-port=9222' - ], - debug: true - } - }, - browsers: process.env.CI ? [ - 'bs_ie11', - 'chrome_headless', - 'bs_edge_windows_latest', - 'firefox_headless', - ] : [ - // 'electron', - 'firefox_headless', - 'chrome_headless', - // 'bs_ie11', - // 'bs_edge_windows_latest', - ], - browserNoActivityTimeout: 2 * 600000, - browserConsoleLogOptions: { - level: 'log', - terminal: true - }, - files: [ - 'https://cdn.polyfill.io/v2/polyfill.js', - 'test/setup.js', - 'build/module/**/*.spec.js', - ], - - preprocessors: { - 'test/setup.js': ['browserify'], - 'build/module/**/*.spec.js': ['rollup'], - }, - - client: { - mocha: { - // change Karma's debug.html to the mocha web reporter - reporter: 'html', - }, - }, - }); -}; diff --git a/manual_tests/upload.js b/manual_tests/upload.js new file mode 100644 index 00000000..39a766e7 --- /dev/null +++ b/manual_tests/upload.js @@ -0,0 +1,15 @@ +const filestack = require('../'); +const client = filestack.init(process.env.API_KEY); +const path = require('path'); + +client.upload(Buffer.from('testtest')).then((res) => { + console.log('File uploaded', res); +}).catch((err) => { + console.log('File upload error', err); +}); + +// client.upload(path.resolve(__dirname, './test.jpg')).then((res) => { +// console.log('File uploaded', res); +// }).catch((err) => { +// console.log('File upload error', err); +// }); diff --git a/manual_tests/upload_new.ts b/manual_tests/upload_new.ts new file mode 100644 index 00000000..37a0d9df --- /dev/null +++ b/manual_tests/upload_new.ts @@ -0,0 +1,72 @@ + +/* + * Copyright (c) 2018 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Client } from './../src/lib/client'; +import * as Path from 'path'; +import { S3Uploader } from './../src/lib/api/upload/uploaders/s3'; +import { getFile } from '../src/lib/api/upload'; + +const createFile = (size = 44320) => Buffer.alloc(size); + +const fs = new Client('AbHASoTdORfqk8APJB72Wz', { + cname: 'rc.filepickerapp.com', +}); + +// fs.multiupload( +// [ +// { +// file: Path.resolve(__dirname, './manual_10mb.mp4'), +// name: 'test.mp4', +// }, +// ], +// {}, +// { +// filename: () => 'test2.mp4', +// } +// ).then(res => { +// console.dir(res, { depth: null }); +// }); + +try { + fs.upload(createFile(), {}, { + filename: 'HR-mary-oo', + sanitizer: { + exclude: ['m'], + replacement: 'hrr', + }, + workflows: ['9887b80c-962e-42e0-aa98-11706957df96'] + }).then((res) => { + console.info('Upload done!', res); + }); +} catch (e) { + console.log(e.details); +} + +// (async () => { +// const file = await getFile(createFile()); +// const u = new S3Uploader({}); +// u.setUrl('https://upload.rc.filepickerapp.com'); +// u.setApikey('AbHASoTdORfqk8APJB72Wz'); +// u.addFile(file); + +// const res = await u.execute().catch((e) => { +// console.log('ERROR', e); +// }); + +// console.log(res); +// })(); diff --git a/package-lock.json b/package-lock.json index de1ae53c..229478fe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,24 +8,23 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", - "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/core": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.3.4.tgz", - "integrity": "sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.4.tgz", + "integrity": "sha512-lQgGX3FPRgbz2SKmhMtYgJvVzGZrmjaF4apZ2bLwofAKiSjxU0drPh4S/VasyYXwaTs+A1gvQ45BN8SQJzHsQQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.3.4", - "@babel/helpers": "^7.2.0", - "@babel/parser": "^7.3.4", - "@babel/template": "^7.2.2", - "@babel/traverse": "^7.3.4", - "@babel/types": "^7.3.4", + "@babel/generator": "^7.4.4", + "@babel/helpers": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4", "convert-source-map": "^1.1.0", "debug": "^4.1.0", "json5": "^2.1.0", @@ -33,60 +32,19 @@ "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", - "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - } } }, "@babel/generator": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz", - "integrity": "sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz", + "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==", "dev": true, "requires": { - "@babel/types": "^7.3.4", + "@babel/types": "^7.4.4", "jsesc": "^2.5.1", "lodash": "^4.17.11", "source-map": "^0.5.0", "trim-right": "^1.0.1" - }, - "dependencies": { - "@babel/types": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", - "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-annotate-as-pure": { @@ -109,25 +67,25 @@ } }, "@babel/helper-call-delegate": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz", - "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.4.tgz", + "integrity": "sha512-l79boDFJ8S1c5hvQvG+rc+wHw6IuH7YldmRKsYtpbawsxURu/paVy57FZMomGK22/JckepaikOkY0MoAmdyOlQ==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.0.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-hoist-variables": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" } }, "@babel/helper-define-map": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", - "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.4.tgz", + "integrity": "sha512-IX3Ln8gLhZpSuqHJSnTNBWGDE9kdkTEWl21A/K7PQ00tseBwbqCHTvNLHSBd9M0R5rER4h5Rsvj9vw0R5SieBg==", "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.0.0", - "lodash": "^4.17.10" + "@babel/types": "^7.4.4", + "lodash": "^4.17.11" } }, "@babel/helper-explode-assignable-expression": { @@ -161,12 +119,12 @@ } }, "@babel/helper-hoist-variables": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", - "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz", + "integrity": "sha512-VYk2/H/BnYbZDDg39hr3t2kKyifAm1W6zHRfhx8jGjIHpQEBv9dry7oQ2f3+J703TLu69nYdxsovl0XYfcnK4w==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.4.4" } }, "@babel/helper-member-expression-to-functions": { @@ -188,30 +146,17 @@ } }, "@babel/helper-module-transforms": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz", - "integrity": "sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.4.4.tgz", + "integrity": "sha512-3Z1yp8TVQf+B4ynN7WoHPKS8EkdTbgAEy0nU0rs/1Kw4pDgmvYH3rz3aI11KgxKCba2cn7N+tqzV1mY2HMN96w==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-simple-access": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/template": "^7.2.2", - "@babel/types": "^7.2.2", - "lodash": "^4.17.10" - }, - "dependencies": { - "@babel/types": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", - "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - } + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/template": "^7.4.4", + "@babel/types": "^7.4.4", + "lodash": "^4.17.11" } }, "@babel/helper-optimise-call-expression": { @@ -230,12 +175,12 @@ "dev": true }, "@babel/helper-regex": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.0.0.tgz", - "integrity": "sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.4.4.tgz", + "integrity": "sha512-Y5nuB/kESmR3tKjU8Nkn1wMGEx1tjJX076HBMeL3XLQCu6vA/YRzuTW0bbb+qRnXvQGn+d6Rx953yffl8vEy7Q==", "dev": true, "requires": { - "lodash": "^4.17.10" + "lodash": "^4.17.11" } }, "@babel/helper-remap-async-to-generator": { @@ -252,28 +197,15 @@ } }, "@babel/helper-replace-supers": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.3.4.tgz", - "integrity": "sha512-pvObL9WVf2ADs+ePg0jrqlhHoxRXlOa+SHRHzAXIz2xkYuOHfGl+fKxPMaS4Fq+uje8JQPobnertBBvyrWnQ1A==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.4.tgz", + "integrity": "sha512-04xGEnd+s01nY1l15EuMS1rfKktNF+1CkKmHoErDppjAAZL+IUBZpzT748x262HF7fibaQPhbvWUl5HeSt1EXg==", "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.0.0", "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.3.4", - "@babel/types": "^7.3.4" - }, - "dependencies": { - "@babel/types": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", - "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - } + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" } }, "@babel/helper-simple-access": { @@ -287,12 +219,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz", + "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.4.4" } }, "@babel/helper-wrap-function": { @@ -305,50 +237,23 @@ "@babel/template": "^7.1.0", "@babel/traverse": "^7.1.0", "@babel/types": "^7.2.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", - "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helpers": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.3.1.tgz", - "integrity": "sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.4.tgz", + "integrity": "sha512-igczbR/0SeuPR8RFfC7tGrbdTbFL3QTvH6D+Z6zNxnTe//GyqmtHmDkzrqDmyZ3eSwPqB/LhyKoU5DXsp+Vp2A==", "dev": true, "requires": { - "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.5", - "@babel/types": "^7.3.0" - }, - "dependencies": { - "@babel/types": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", - "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - } + "@babel/template": "^7.4.4", + "@babel/traverse": "^7.4.4", + "@babel/types": "^7.4.4" } }, "@babel/highlight": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", - "dev": true, "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", @@ -358,15 +263,14 @@ "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" } } }, "@babel/parser": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz", - "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz", + "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -391,9 +295,9 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.4.tgz", - "integrity": "sha512-j7VQmbbkA+qrzNqbKHrBsW3ddFnOeva6wzSe/zB7T+xaxGc+RCpwo44wCmRixAIGRoIpmVgvzFzNJqQcO3/9RA==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz", + "integrity": "sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -411,14 +315,14 @@ } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz", - "integrity": "sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.4.tgz", + "integrity": "sha512-j1NwnOqMG9mFUOH58JTFsA/+ZYzQLUZ/drqWUqxCYLGeu2JFZL8YrNC9hBxKmWtAuOCHPcRpgv7fhap09Fb4kA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0", - "regexpu-core": "^4.2.0" + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" } }, "@babel/plugin-syntax-async-generators": { @@ -467,9 +371,9 @@ } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.3.4.tgz", - "integrity": "sha512-Y7nCzv2fw/jEZ9f678MuKdMo99MFDJMT/PvD9LisrR5JDFcJH6vYeH6RnjVt3p5tceyGRvTtEN0VOlU+rgHZjA==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.4.tgz", + "integrity": "sha512-YiqW2Li8TXmzgbXw+STsSqPBPFnGviiaSp6CYOq55X8GQ2SGVLrXB6pNid8HkqkZAzOH6knbai3snhP7v0fNwA==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -487,9 +391,9 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.3.4.tgz", - "integrity": "sha512-blRr2O8IOZLAOJklXLV4WhcEzpYafYQKSGT3+R26lWG41u/FODJuBggehtOwilVAcFu393v3OFj+HmaE6tVjhA==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.4.tgz", + "integrity": "sha512-jkTUyWZcTrwxu5DD4rWz6rDB5Cjdmgz6z7M7RLXOJyCUkFBawssDGcGh8M/0FTSB87avyJI1HsTwUXp9nKA1PA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -497,18 +401,18 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.3.4.tgz", - "integrity": "sha512-J9fAvCFBkXEvBimgYxCjvaVDzL6thk0j0dBvCeZmIUDBwyt+nv6HfbImsSrWsYXfDNDivyANgJlFXDUWRTZBuA==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.4.tgz", + "integrity": "sha512-/e44eFLImEGIpL9qPxSRat13I5QNRgBLu2hOQJCF7VLy/otSM/sypV1+XaIw5+502RX/+6YaSAPmldk+nhHDPw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.1.0", + "@babel/helper-define-map": "^7.4.4", "@babel/helper-function-name": "^7.1.0", "@babel/helper-optimise-call-expression": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.3.4", - "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/helper-replace-supers": "^7.4.4", + "@babel/helper-split-export-declaration": "^7.4.4", "globals": "^11.1.0" } }, @@ -522,23 +426,23 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.3.2.tgz", - "integrity": "sha512-Lrj/u53Ufqxl/sGxyjsJ2XNtNuEjDyjpqdhMNh5aZ+XFOdThL46KBj27Uem4ggoezSYBxKWAil6Hu8HtwqesYw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.4.tgz", + "integrity": "sha512-/aOx+nW0w8eHiEHm+BTERB2oJn5D127iye/SUQl7NjHy0lf+j7h4MKMMSOwdazGq9OxgiNADncE+SRJkCxjZpQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz", - "integrity": "sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.4.4.tgz", + "integrity": "sha512-P05YEhRc2h53lZDjRPk/OektxCVevFzZs2Gfjd545Wde3k+yFDbXORgl2e0xpbq8mLcKJ7Idss4fAg0zORN/zg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0", - "regexpu-core": "^4.1.3" + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" } }, "@babel/plugin-transform-duplicate-keys": { @@ -561,18 +465,18 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz", - "integrity": "sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.4.tgz", + "integrity": "sha512-9T/5Dlr14Z9TIEXLXkt8T1DU7F24cbhwhMNUziN3hB1AXoZcdzPcTiKGRn/6iOymDqtTKWnr/BtRKN9JwbKtdQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" } }, "@babel/plugin-transform-function-name": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz", - "integrity": "sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.4.4.tgz", + "integrity": "sha512-iU9pv7U+2jC9ANQkKeNF6DrPy4GBa4NWQtl6dHB4Pb3izX2JOEvDTFarlNsBj/63ZEzNNIAMs3Qw4fNCcSOXJA==", "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", @@ -588,6 +492,15 @@ "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.2.0.tgz", + "integrity": "sha512-HiU3zKkSU6scTidmnFJ0bMX8hz5ixC93b4MHMiYebmk2lUVNGOboPsqQvx5LzooihijUoLR/v7Nc1rbBtnc7FA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-transform-modules-amd": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz", @@ -599,23 +512,23 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz", - "integrity": "sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz", + "integrity": "sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.1.0", + "@babel/helper-module-transforms": "^7.4.4", "@babel/helper-plugin-utils": "^7.0.0", "@babel/helper-simple-access": "^7.1.0" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.3.4.tgz", - "integrity": "sha512-VZ4+jlGOF36S7TjKs8g4ojp4MEI+ebCQZdswWb/T9I4X84j8OtFAyjXjt/M16iIm5RIZn0UMQgg/VgIwo/87vw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.4.tgz", + "integrity": "sha512-MSiModfILQc3/oqnG7NrP1jHaSPryO6tA2kOMmAQApz5dayPxWiHqmq4sWH2xF5LcQK56LlbKByCd8Aah/OIkQ==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.0.0", + "@babel/helper-hoist-variables": "^7.4.4", "@babel/helper-plugin-utils": "^7.0.0" } }, @@ -630,18 +543,18 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz", - "integrity": "sha512-NxIoNVhk9ZxS+9lSoAQ/LM0V2UEvARLttEHUrRDGKFaAxOYQcrkN/nLRE+BbbicCAvZPl7wMP0X60HsHE5DtQw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.4.tgz", + "integrity": "sha512-Ki+Y9nXBlKfhD+LXaRS7v95TtTGYRAf9Y1rTDiE75zf8YQz4GDaWRXosMfJBXxnk88mGFjWdCRIeqDbon7spYA==", "dev": true, "requires": { "regexp-tree": "^0.1.0" } }, "@babel/plugin-transform-new-target": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", - "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.4.tgz", + "integrity": "sha512-r1z3T2DNGQwwe2vPGZMBNjioT2scgWzK9BCnDEh+46z8EEwXBq24uRzd65I7pjtugzPSj921aM15RpESgzsSuA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" @@ -658,25 +571,43 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.3.3.tgz", - "integrity": "sha512-IrIP25VvXWu/VlBWTpsjGptpomtIkYrN/3aDp4UKm7xK6UxZY88kcJ1UwETbzHAlwN21MnNfwlar0u8y3KpiXw==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.4.tgz", + "integrity": "sha512-oMh5DUO1V63nZcu/ZVLQFqiihBGo4OpxJxR1otF50GMeCLiRx5nUdtokd+u9SuVJrvvuIh9OosRFPP4pIPnwmw==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.1.0", + "@babel/helper-call-delegate": "^7.4.4", "@babel/helper-get-function-arity": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0" } }, + "@babel/plugin-transform-property-literals": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.2.0.tgz", + "integrity": "sha512-9q7Dbk4RhgcLp8ebduOpCbtjh7C0itoLYHXd9ueASKAG/is5PQtMR5VJGka9NKqGhYEGn5ITahd4h9QeBMylWQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-transform-regenerator": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.3.4.tgz", - "integrity": "sha512-hvJg8EReQvXT6G9H2MvNPXkv9zK36Vxa1+csAVTpE1J3j0zlHplw76uudEbJxgvqZzAq9Yh45FLD4pk5mKRFQA==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.4.tgz", + "integrity": "sha512-Zz3w+pX1SI0KMIiqshFZkwnVGUhDZzpX2vtPzfJBKQQq8WsP/Xy9DNdELWivxcKOCX/Pywge4SiEaPaLtoDT4g==", "dev": true, "requires": { "regenerator-transform": "^0.13.4" } }, + "@babel/plugin-transform-reserved-words": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.2.0.tgz", + "integrity": "sha512-fz43fqW8E1tAB3DKF19/vxbpib1fuyCwSPE418ge5ZxILnBhWyhtPgz8eh1RCGGJlwvksHkyxMxh0eenFi+kFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0" + } + }, "@babel/plugin-transform-shorthand-properties": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz", @@ -706,9 +637,9 @@ } }, "@babel/plugin-transform-template-literals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz", - "integrity": "sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.4.4.tgz", + "integrity": "sha512-mQrEC4TWkhLN0z8ygIvEL9ZEToPhG5K7KDW3pzGqOfIGZ28Jb0POUkeWcoz8HnHvhFy6dwAT1j8OzqN8s804+g==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", @@ -725,160 +656,355 @@ } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz", - "integrity": "sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.4.4.tgz", + "integrity": "sha512-il+/XdNw01i93+M9J9u4T7/e/Ue/vWfNZE4IRUQjplu2Mqb/AFTDimkw2tdEdSH50wuQXZAbXSql0UphQke+vA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-regex": "^7.0.0", - "regexpu-core": "^4.1.3" + "@babel/helper-regex": "^7.4.4", + "regexpu-core": "^4.5.4" } }, "@babel/preset-env": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.4.tgz", - "integrity": "sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.4.4.tgz", + "integrity": "sha512-FU1H+ACWqZZqfw1x2G1tgtSSYSfxJLkpaUQL37CenULFARDo+h4xJoVHzRoHbK+85ViLciuI7ME4WTIhFRBBlw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-async-generator-functions": "^7.2.0", "@babel/plugin-proposal-json-strings": "^7.2.0", - "@babel/plugin-proposal-object-rest-spread": "^7.3.4", + "@babel/plugin-proposal-object-rest-spread": "^7.4.4", "@babel/plugin-proposal-optional-catch-binding": "^7.2.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.2.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", "@babel/plugin-syntax-async-generators": "^7.2.0", "@babel/plugin-syntax-json-strings": "^7.2.0", "@babel/plugin-syntax-object-rest-spread": "^7.2.0", "@babel/plugin-syntax-optional-catch-binding": "^7.2.0", "@babel/plugin-transform-arrow-functions": "^7.2.0", - "@babel/plugin-transform-async-to-generator": "^7.3.4", + "@babel/plugin-transform-async-to-generator": "^7.4.4", "@babel/plugin-transform-block-scoped-functions": "^7.2.0", - "@babel/plugin-transform-block-scoping": "^7.3.4", - "@babel/plugin-transform-classes": "^7.3.4", + "@babel/plugin-transform-block-scoping": "^7.4.4", + "@babel/plugin-transform-classes": "^7.4.4", "@babel/plugin-transform-computed-properties": "^7.2.0", - "@babel/plugin-transform-destructuring": "^7.2.0", - "@babel/plugin-transform-dotall-regex": "^7.2.0", + "@babel/plugin-transform-destructuring": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/plugin-transform-duplicate-keys": "^7.2.0", "@babel/plugin-transform-exponentiation-operator": "^7.2.0", - "@babel/plugin-transform-for-of": "^7.2.0", - "@babel/plugin-transform-function-name": "^7.2.0", + "@babel/plugin-transform-for-of": "^7.4.4", + "@babel/plugin-transform-function-name": "^7.4.4", "@babel/plugin-transform-literals": "^7.2.0", + "@babel/plugin-transform-member-expression-literals": "^7.2.0", "@babel/plugin-transform-modules-amd": "^7.2.0", - "@babel/plugin-transform-modules-commonjs": "^7.2.0", - "@babel/plugin-transform-modules-systemjs": "^7.3.4", + "@babel/plugin-transform-modules-commonjs": "^7.4.4", + "@babel/plugin-transform-modules-systemjs": "^7.4.4", "@babel/plugin-transform-modules-umd": "^7.2.0", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.3.0", - "@babel/plugin-transform-new-target": "^7.0.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.4.4", + "@babel/plugin-transform-new-target": "^7.4.4", "@babel/plugin-transform-object-super": "^7.2.0", - "@babel/plugin-transform-parameters": "^7.2.0", - "@babel/plugin-transform-regenerator": "^7.3.4", + "@babel/plugin-transform-parameters": "^7.4.4", + "@babel/plugin-transform-property-literals": "^7.2.0", + "@babel/plugin-transform-regenerator": "^7.4.4", + "@babel/plugin-transform-reserved-words": "^7.2.0", "@babel/plugin-transform-shorthand-properties": "^7.2.0", "@babel/plugin-transform-spread": "^7.2.0", "@babel/plugin-transform-sticky-regex": "^7.2.0", - "@babel/plugin-transform-template-literals": "^7.2.0", + "@babel/plugin-transform-template-literals": "^7.4.4", "@babel/plugin-transform-typeof-symbol": "^7.2.0", - "@babel/plugin-transform-unicode-regex": "^7.2.0", - "browserslist": "^4.3.4", + "@babel/plugin-transform-unicode-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "browserslist": "^4.5.2", + "core-js-compat": "^3.0.0", "invariant": "^2.2.2", "js-levenshtein": "^1.1.3", - "semver": "^5.3.0" + "semver": "^5.5.0" } }, "@babel/template": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", - "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", + "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.2.2", - "@babel/types": "^7.2.2" - }, - "dependencies": { - "@babel/types": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", - "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } - } + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4" } }, "@babel/traverse": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz", - "integrity": "sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz", + "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.3.4", + "@babel/generator": "^7.4.4", "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.3.4", - "@babel/types": "^7.3.4", + "@babel/helper-split-export-declaration": "^7.4.4", + "@babel/parser": "^7.4.4", + "@babel/types": "^7.4.4", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz", + "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, + "@cnakazawa/watch": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@cnakazawa/watch/-/watch-1.0.3.tgz", + "integrity": "sha512-r5160ogAvGyHsal38Kux7YYtodEKOj89RGb28ht1jh3SJb08VwRwAKKJL0bGb04Zd/3r9FL3BFIc3bBidYffCA==", + "dev": true, + "requires": { + "exec-sh": "^0.3.2", + "minimist": "^1.2.0" }, "dependencies": { - "@babel/types": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", - "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.11", - "to-fast-properties": "^2.0.0" - } + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } + } + }, + "@jest/console": { + "version": "24.7.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-24.7.1.tgz", + "integrity": "sha512-iNhtIy2M8bXlAOULWVTUxmnelTLFneTNEkHCgPmgd+zNwy9zVddJ6oS5rZ9iwoscNdT5mMwUd0C51v/fSlzItg==", + "dev": true, + "requires": { + "@jest/source-map": "^24.3.0", + "chalk": "^2.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "@jest/core": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-24.8.0.tgz", + "integrity": "sha512-R9rhAJwCBQzaRnrRgAdVfnglUuATXdwTRsYqs6NMdVcAl5euG8LtWDe+fVkN27YfKVBW61IojVsXKaOmSnqd/A==", + "dev": true, + "requires": { + "@jest/console": "^24.7.1", + "@jest/reporters": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-changed-files": "^24.8.0", + "jest-config": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve-dependencies": "^24.8.0", + "jest-runner": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "jest-watcher": "^24.8.0", + "micromatch": "^3.1.10", + "p-each-series": "^1.0.0", + "pirates": "^4.0.1", + "realpath-native": "^1.1.0", + "rimraf": "^2.5.4", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true }, - "debug": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", - "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { - "ms": "^2.1.1" + "ansi-regex": "^4.1.0" } + } + } + }, + "@jest/environment": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-24.8.0.tgz", + "integrity": "sha512-vlGt2HLg7qM+vtBrSkjDxk9K0YtRBi7HfRFaDxoRtyi+DyVChzhF20duvpdAnKVBV6W5tym8jm0U9EfXbDk1tw==", + "dev": true, + "requires": { + "@jest/fake-timers": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0" + } + }, + "@jest/fake-timers": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-24.8.0.tgz", + "integrity": "sha512-2M4d5MufVXwi6VzZhJ9f5S/wU4ud2ck0kxPof1Iz3zWx6Y+V2eJrES9jEktB6O3o/oEyk+il/uNu9PvASjWXQw==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-mock": "^24.8.0" + } + }, + "@jest/reporters": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-24.8.0.tgz", + "integrity": "sha512-eZ9TyUYpyIIXfYCrw0UHUWUvE35vx5I92HGMgS93Pv7du+GHIzl+/vh8Qj9MCWFK/4TqyttVBPakWMOfZRIfxw==", + "dev": true, + "requires": { + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.2", + "istanbul-lib-coverage": "^2.0.2", + "istanbul-lib-instrument": "^3.0.1", + "istanbul-lib-report": "^2.0.4", + "istanbul-lib-source-maps": "^3.0.1", + "istanbul-reports": "^2.1.1", + "jest-haste-map": "^24.8.0", + "jest-resolve": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "node-notifier": "^5.2.1", + "slash": "^2.0.0", + "source-map": "^0.6.0", + "string-length": "^2.0.0" + }, + "dependencies": { + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, - "@babel/types": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.1.3.tgz", - "integrity": "sha512-RpPOVfK+yatXyn8n4PB1NW6k9qjinrXrRR8ugBN8fD6hCy5RXI6PSbVqpOJBO9oSaY7Nom4ohj35feb0UR9hSA==", + "@jest/source-map": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-24.3.0.tgz", + "integrity": "sha512-zALZt1t2ou8le/crCeeiRYzvdnTzaIlpOWaet45lNSqNJUnXbppUUFR4ZUAlzgDmKee4Q5P/tKXypI1RiHwgag==", "dev": true, "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.10", - "to-fast-properties": "^2.0.0" + "callsites": "^3.0.0", + "graceful-fs": "^4.1.15", + "source-map": "^0.6.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "@gulp-sourcemaps/identity-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", - "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", + "@jest/test-result": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-24.8.0.tgz", + "integrity": "sha512-+YdLlxwizlfqkFDh7Mc7ONPQAhA4YylU1s529vVM1rsf67vGZH/2GGm5uO8QzPeVyaVMobCQ7FTxl38QrKRlng==", "dev": true, "requires": { - "acorn": "^5.0.3", - "css": "^2.2.1", - "normalize-path": "^2.1.1", - "source-map": "^0.6.0", - "through2": "^2.0.3" + "@jest/console": "^24.7.1", + "@jest/types": "^24.8.0", + "@types/istanbul-lib-coverage": "^2.0.0" + } + }, + "@jest/test-sequencer": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-24.8.0.tgz", + "integrity": "sha512-OzL/2yHyPdCHXEzhoBuq37CE99nkme15eHkAzXRVqthreWZamEMA0WoetwstsQBCXABhczpK03JNbc4L01vvLg==", + "dev": true, + "requires": { + "@jest/test-result": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-runner": "^24.8.0", + "jest-runtime": "^24.8.0" + } + }, + "@jest/transform": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-24.8.0.tgz", + "integrity": "sha512-xBMfFUP7TortCs0O+Xtez2W7Zu1PLH9bvJgtraN1CDST6LBM/eTOZ9SfwS/lvV8yOfcDpFmwf9bq5cYbXvqsvA==", + "dev": true, + "requires": { + "@babel/core": "^7.1.0", + "@jest/types": "^24.8.0", + "babel-plugin-istanbul": "^5.1.0", + "chalk": "^2.0.1", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.1.15", + "jest-haste-map": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-util": "^24.8.0", + "micromatch": "^3.1.10", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "2.4.1" }, "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -887,16 +1013,37 @@ } } }, - "@gulp-sourcemaps/map-sources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", - "integrity": "sha1-iQrnxdjId/bThIYCFazp1+yUW9o=", + "@jest/types": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-24.8.0.tgz", + "integrity": "sha512-g17UxVr2YfBtaMUxn9u/4+siG1ptg9IGYAYwvpwn61nBg779RXnjE/m7CxYcIzEt0AbHZZAHSEZNhkE2WxURVg==", "dev": true, "requires": { - "normalize-path": "^2.0.1", - "through2": "^2.0.3" + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^1.1.1", + "@types/yargs": "^12.0.9" + } + }, + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", + "requires": { + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" } }, + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==" + }, + "@purtuga/esm-webpack-plugin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@purtuga/esm-webpack-plugin/-/esm-webpack-plugin-1.0.1.tgz", + "integrity": "sha512-0fXoDHrV4WxuXzsCvD+DW/xOCSmN3khEJ1vsiDARofmgYRcqY3Sc7zfGoSFVIHcVKzcnZEFLPeybNG1GXke5GA==", + "dev": true + }, "@sindresorhus/df": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@sindresorhus/df/-/df-2.1.0.tgz", @@ -936,67 +1083,46 @@ } } }, - "@sinonjs/commons": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.3.0.tgz", - "integrity": "sha512-j4ZwhaHmwsCb4DlDOIWnI5YyKDNMoNThsmwEpfHx6a1EpsGZ9qYLxP++LMlmBRjtGptGHFsGItJ768snllFWpA==", + "@types/babel__core": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.1.tgz", + "integrity": "sha512-+hjBtgcFPYyCTo0A15+nxrCVJL7aC6Acg87TXd5OW3QhHswdrOLoles+ldL2Uk8q++7yIfl4tURtztccdeeyOw==", "dev": true, "requires": { - "type-detect": "4.0.8" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" } }, - "@sinonjs/formatio": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.0.0.tgz", - "integrity": "sha512-vdjoYLDptCgvtJs57ULshak3iJe4NW3sJ3g36xVDGff5AE8P30S6A093EIEPjdi2noGhfuNOEkbxt3J3awFW1w==", + "@types/babel__generator": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.0.2.tgz", + "integrity": "sha512-NHcOfab3Zw4q5sEE2COkpfXjoE7o+PmqD9DQW4koUT3roNxwziUdXGnRndMat/LJNUtePwn1TlP4do3uoe3KZQ==", "dev": true, "requires": { - "@sinonjs/samsam": "2.1.0" - }, - "dependencies": { - "@sinonjs/samsam": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.1.0.tgz", - "integrity": "sha512-5x2kFgJYupaF1ns/RmharQ90lQkd2ELS8A9X0ymkAAdemYHGtI2KiUHG8nX2WU0T1qgnOU5YMqnBM2V7NUanNw==", - "dev": true, - "requires": { - "array-from": "^2.1.1" - } - } + "@babel/types": "^7.0.0" } }, - "@sinonjs/samsam": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.1.2.tgz", - "integrity": "sha512-ZwTHAlC9akprWDinwEPD4kOuwaYZlyMwVJIANsKNC3QVp0AHB04m7RnB4eqeWfgmxw8MGTzS9uMaw93Z3QcZbw==", - "dev": true - }, - "@sinonjs/text-encoding": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", - "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", - "dev": true - }, - "@types/acorn": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.4.tgz", - "integrity": "sha512-/qLQgGw/hzbpWpEiSrnNDqiVtw7J/wBEfWMWN8HPhOHUMINkL7ggOtj8VSyjfzXlNkoUbStomzKsLEATXcMSzg==", + "@types/babel__template": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.0.2.tgz", + "integrity": "sha512-/K6zCpeW7Imzgab2bLkLEbz0+1JlFSrUMdw7KoIIu+IUdu51GWaBZpd3y1VXGVXzynvGa4DaIaxNZHiON3GXUg==", "dev": true, "requires": { - "@types/estree": "*" + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" } }, - "@types/cookiejar": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.0.tgz", - "integrity": "sha512-EIjmpvnHj+T4nMcKwHwxZKUfDmphIKJc2qnEMhSoOvr1lYEQpuRKRz8orWr//krYIIArS/KGGLfL2YGVUYXmIA==", - "dev": true - }, - "@types/estree": { - "version": "0.0.39", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", - "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", - "dev": true + "@types/babel__traverse": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.6.tgz", + "integrity": "sha512-XYVgHF2sQ0YblLRMLNPB3CkFMewzFmlDsH/TneZFHUXDlABQgh88uOxuez7ZcXxayLFrqLwtDH1t+FmlFwNZxw==", + "dev": true, + "requires": { + "@babel/types": "^7.3.0" + } }, "@types/events": { "version": "3.0.0", @@ -1039,22 +1165,62 @@ "integrity": "sha512-pGF/zvYOACZ/gLGWdQH8zSwteQS1epp68yRcVLJMgUck/MjEn/FBYmPub9pXT8C1e4a8YZfHo1CKyV8q1vKUnQ==", "dev": true }, - "@types/lodash": { - "version": "4.14.123", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz", - "integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==", - "dev": true - }, - "@types/marked": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.4.2.tgz", - "integrity": "sha512-cDB930/7MbzaGF6U3IwSQp6XBru8xWajF5PV2YZZeV8DyiliTuld11afVztGI9+yJZ29il5E+NpGA6ooV/Cjkg==", + "@types/istanbul-lib-coverage": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz", + "integrity": "sha512-hRJD2ahnnpLgsj6KWMYSrmXkM3rm2Dl1qkx6IOFD5FnuNPXJIG5L0dhgKXCYTRMGzU4n0wImQ/xfmRc4POUFlg==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha512-3BUTyMzbZa2DtDI2BkERNC6jJw2Mr2Y0oGI7mRxYNBPxppbtEK1F66u3bKwU2g+wxwWI7PAoRpJnOY1grJqzHg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-1.1.1.tgz", + "integrity": "sha512-UpYjBi8xefVChsCoBpKShdxTllC9pwISirfoZsUa2AAdQg/Jd2KQGtSbw+ya7GPo7x/wAPlH6JBhKhAsXUEZNA==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*", + "@types/istanbul-lib-report": "*" + } + }, + "@types/jest": { + "version": "24.0.12", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-24.0.12.tgz", + "integrity": "sha512-60sjqMhat7i7XntZckcSGV8iREJyXXI6yFHZkSZvCPUeOnEJ/VP1rU/WpEWQ56mvoh8NhC+sfKAuJRTyGtCOow==", + "dev": true, + "requires": { + "@types/jest-diff": "*" + } + }, + "@types/jest-diff": { + "version": "20.0.1", + "resolved": "https://registry.npmjs.org/@types/jest-diff/-/jest-diff-20.0.1.tgz", + "integrity": "sha512-yALhelO3i0hqZwhjtcr6dYyaLoCHbAMshwtj6cGxTvHZAKXHsYGdff6E8EPw3xLKY0ELUTQ69Q1rQiJENnccMA==", + "dev": true + }, + "@types/lodash": { + "version": "4.14.123", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.123.tgz", + "integrity": "sha512-pQvPkc4Nltyx7G1Ww45OjVqUsJP4UsZm+GWJpigXgkikZqJgRm4c48g027o6tdgubWHwFRF15iFd+Y4Pmqv6+Q==", + "dev": true + }, + "@types/marked": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.4.2.tgz", + "integrity": "sha512-cDB930/7MbzaGF6U3IwSQp6XBru8xWajF5PV2YZZeV8DyiliTuld11afVztGI9+yJZ29il5E+NpGA6ooV/Cjkg==", "dev": true }, "@types/mime": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.0.tgz", - "integrity": "sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.1.tgz", + "integrity": "sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==", "dev": true }, "@types/minimatch": { @@ -1063,16 +1229,10 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", "dev": true }, - "@types/mocha": { - "version": "2.2.48", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz", - "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==", - "dev": true - }, "@types/node": { - "version": "10.12.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.20.tgz", - "integrity": "sha512-9spv6SklidqxevvZyOUGjZVz4QRXGu2dNaLyXIFzFYZW0AGDykzPRIUFJXTlQXyfzAucddwTcGtJNim8zqSOPA==", + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.0.0.tgz", + "integrity": "sha512-Jrb/x3HT4PTJp6a4avhmJCDEVrPdqLfl3e8GGMbpkGGdwAV5UGlIs4vVEfsHHfylZVOKZWpOqmqFH8CbfOZ6kg==", "dev": true }, "@types/shelljs": { @@ -1085,32 +1245,225 @@ "@types/node": "*" } }, - "@types/sinon": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-5.0.1.tgz", - "integrity": "sha512-yxzBCIjE3lp9lYjfBbIK/LRCoXgCLLbIIBIje7eNCcUIIR2CZZtyX5uto2hVoMSMqLrsRrT6mwwUEd0yFgOwpA==", + "@types/spark-md5": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/spark-md5/-/spark-md5-3.0.1.tgz", + "integrity": "sha512-sjiWYRmuuFZMo/DdysQe/yX6x40Q0WZXsNgvbUIg7gUaQYNoXx4CqWq27rDikQyc+0JKkqsoNiIBAA0GUxbUXw==", "dev": true }, - "@types/spark-md5": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/spark-md5/-/spark-md5-3.0.0.tgz", - "integrity": "sha512-cxuDu5vabKALmIoFCMVDdWp9nC+IaG66+hdC3rSjw8zCSct3AnJXvMH/ZA0hahyDXcU1WA777ikMBd3LXc528g==", + "@types/stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha512-l42BggppR6zLmpfU6fq9HEa2oGPEI8yrSPL3GITjfRInppYFahObbIQOQK3UGxEnyQpltZLaPe75046NOZQikw==", "dev": true }, - "@types/superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-Mge1Msz48U09kJYYNZWmCsTCI8tmTAkZhsKx2Neapd9PqzEm7caM4wQ3uiGpAvT6vTIzaq1apOoa/TipMeZkow==", + "@types/uuid": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.4.tgz", + "integrity": "sha512-tPIgT0GUmdJQNSHxp0X2jnpQfBSTfGxUMc/2CXBU2mnyTFVYVa2ojpoQ74w0U2yn2vw3jnC640+77lkFFpdVDw==", "dev": true, "requires": { - "@types/cookiejar": "*", "@types/node": "*" } }, + "@types/yargs": { + "version": "12.0.12", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.12.tgz", + "integrity": "sha512-SOhuU4wNBxhhTHxYaiG5NY4HBhDIDnJF60GU+2LqHAdKKer86//e4yg69aENCtQ04n0ovz+tq2YPME5t5yp4pw==", + "dev": true + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, "JSONStream": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.3.tgz", - "integrity": "sha512-3Sp6WZZ/lXl+nTDoGpGWHEpTnnC6X5fnkolYZR6nwIfzbxxvA8utPWe1gCt7i0m9uVGsSz2IS8K8mJ7HmlduMg==", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "dev": true, "requires": { "jsonparse": "^1.2.0", @@ -1122,23 +1475,6 @@ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" }, - "abstract-leveldown": { - "version": "0.12.4", - "resolved": "https://registry.npmjs.org/abstract-leveldown/-/abstract-leveldown-0.12.4.tgz", - "integrity": "sha1-KeGOYy5g5OIh1YECR4UqY9ey5BA=", - "dev": true, - "requires": { - "xtend": "~3.0.0" - }, - "dependencies": { - "xtend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", - "dev": true - } - } - }, "accepts": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", @@ -1150,59 +1486,31 @@ } }, "acorn": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz", - "integrity": "sha512-d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", "dev": true }, "acorn-dynamic-import": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz", - "integrity": "sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==", - "dev": true, - "requires": { - "acorn": "^5.0.0" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", + "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "dev": true }, "acorn-globals": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.0.tgz", - "integrity": "sha512-hMtHj3s5RnuhvHPowpBYvJVj3rAar82JiDQHvGs1zO0l10ocX/xEdBShNHTJaboucJUsScghp74pH3s7EnHHQw==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.1.tgz", + "integrity": "sha512-gJSiKY8dBIjV/0jagZIFBdVMtfQyA5QHCvAT48H2q8REQoW8Fs5AOjqBql1LgSXgrMWdevcE+8cdZ33NtVbIBA==", "dev": true, "requires": { "acorn": "^6.0.1", "acorn-walk": "^6.0.1" - }, - "dependencies": { - "acorn": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", - "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", - "dev": true - } - } - }, - "acorn-node": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.5.2.tgz", - "integrity": "sha512-krFKvw/d1F17AN3XZbybIUzEY4YEPNiGo05AfP3dBlfVKrMHETKpgjpuZkSF8qDNt9UkQcqj7am8yJLseklCMg==", - "dev": true, - "requires": { - "acorn": "^5.7.1", - "acorn-dynamic-import": "^3.0.0", - "xtend": "^4.0.1" } }, "acorn-walk": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.0.tgz", - "integrity": "sha512-ugTb7Lq7u4GfWSqqpwE0bGyoBZNMTok/zDBXxfEG0QM50jNlGhIWjRC1pPN7bvV1anhF+bs+/gNcRw+o55Evbg==", - "dev": true - }, - "after": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", - "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.1.tgz", + "integrity": "sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==", "dev": true }, "agent-base": { @@ -1215,9 +1523,9 @@ } }, "ajv": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.5.5.tgz", - "integrity": "sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", + "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -1226,41 +1534,25 @@ "uri-js": "^4.2.2" } }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "^3.0.2", - "longest": "^1.0.1", - "repeat-string": "^1.5.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "amdefine": { + "ajv-errors": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", + "dev": true + }, + "ajv-keywords": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", "dev": true }, "ansi-align": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz", - "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "dev": true, "requires": { - "string-width": "^1.0.1" + "string-width": "^2.0.0" } }, "ansi-colors": { @@ -1272,14 +1564,11 @@ "ansi-wrap": "^0.1.0" } }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true }, "ansi-gray": { "version": "0.1.1", @@ -1290,26 +1579,15 @@ "ansi-wrap": "0.1.0" } }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -1345,26 +1623,41 @@ "buffer-equal": "^1.0.0" } }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, "archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", "dev": true }, + "arg": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", + "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==" + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, + "argv": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/argv/-/argv-0.0.2.tgz", + "integrity": "sha1-7L0W+JSbFXGDcRsb2jNPN4QBhas=", + "dev": true + }, "arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=" }, "arr-filter": { "version": "1.1.2", @@ -1378,8 +1671,7 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" }, "arr-map": { "version": "2.0.2", @@ -1393,8 +1685,7 @@ "arr-union": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=" }, "array-each": { "version": "1.0.1", @@ -1408,12 +1699,6 @@ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", "dev": true }, - "array-filter": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true - }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -1426,12 +1711,6 @@ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", "dev": true }, - "array-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", - "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", - "dev": true - }, "array-ify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", @@ -1473,18 +1752,6 @@ } } }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", - "dev": true - }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", - "dev": true - }, "array-slice": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", @@ -1514,7 +1781,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, "requires": { "array-uniq": "^1.0.1" } @@ -1522,32 +1788,26 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" }, "array-unique": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "arraybuffer.slice": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", - "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", - "dev": true + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=" }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } }, "asn1.js": { "version": "4.10.1", @@ -1592,18 +1852,32 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=" }, - "async": { + "astral-regex": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", - "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, + "async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, "async-done": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.1.tgz", @@ -1625,9 +1899,9 @@ } }, "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", "dev": true }, "async-limiter": { @@ -1648,18 +1922,18 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "atob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.1.tgz", - "integrity": "sha1-ri1acpR38onWDdf5amMUoi3Wwio=", - "dev": true + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, "aws-sdk": { - "version": "2.291.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.291.0.tgz", - "integrity": "sha512-al/oJuKN2mokw4nafloptGrmdzm4UZ8AeLuM2bFtPmb0nvwajOr/vSa/XhQTw+T07Vm9T8iJyWyqygq74E/YMQ==", + "version": "2.451.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.451.0.tgz", + "integrity": "sha512-ruVK/fnUFHumSgcqVkJTHLS9eWXc8lf14ZW2G6RVR0baj2MMNDS5gxInuy8GM24Exe0GfnDFk6PnPiSuQs4AVQ==", "dev": true, "requires": { "buffer": "4.9.1", @@ -1669,20 +1943,8 @@ "querystring": "0.2.0", "sax": "1.2.1", "url": "0.10.3", - "uuid": "3.1.0", + "uuid": "3.3.2", "xml2js": "0.4.19" - }, - "dependencies": { - "url": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", - "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - } } }, "aws-sign2": { @@ -1692,56 +1954,137 @@ "dev": true }, "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "axios": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", + "integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=", + "requires": { + "follow-redirects": "^1.3.0", + "is-buffer": "^1.1.5" + } + }, + "babel-jest": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-24.8.0.tgz", + "integrity": "sha512-+5/kaZt4I9efoXzPlZASyK/lN9qdRKmmUav9smVc0ruPQD7IsfucQ87gpOE8mn2jbDuS6M/YOW6n3v9ZoIfgnw==", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/babel__core": "^7.1.0", + "babel-plugin-istanbul": "^5.1.0", + "babel-preset-jest": "^24.6.0", + "chalk": "^2.4.2", + "slash": "^2.0.0" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { + "slash": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true } } }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "babel-loader": { + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.5.tgz", + "integrity": "sha512-NTnHnVRd2JnRqPC0vW+iOQWU5pchDbYXsG2E6DMXEpMfUcQKclF9gmf3G3ZMhzG7IG9ji4coL0cm+FxeWxDpnw==", "dev": true, "requires": { - "arr-filter": "^1.1.1", + "find-cache-dir": "^2.0.0", + "loader-utils": "^1.0.2", + "mkdirp": "^0.5.1", + "util.promisify": "^1.0.0" + } + }, + "babel-plugin-istanbul": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.1.4.tgz", + "integrity": "sha512-dySz4VJMH+dpndj0wjJ8JPs/7i1TdSPb1nRrn56/92pKOF9VKC1FMFJmMXjzlGGusnCAqujP6PBCiKq0sVA+YQ==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + } + } + }, + "babel-plugin-jest-hoist": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-24.6.0.tgz", + "integrity": "sha512-3pKNH6hMt9SbOv0F3WVmy5CWQ4uogS3k0GY5XLyQHJ9EGpAT9XWkFd2ZiXXtkwFHdAHa5j7w7kfxSP5lAIwu7w==", + "dev": true, + "requires": { + "@types/babel__traverse": "^7.0.6" + } + }, + "babel-preset-jest": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-24.6.0.tgz", + "integrity": "sha512-pdZqLEdmy1ZK5kyRUfvBb2IfTPb2BUvIJczlPspS8fWmBQslNNDBqVfh7BW5leOVJMDZKzjD8XEyABTk6gQ5yw==", + "dev": true, + "requires": { + "@babel/plugin-syntax-object-rest-spread": "^7.0.0", + "babel-plugin-jest-hoist": "^24.6.0" + } + }, + "bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha1-Szzpa/JxNPeaG0FKUcFONMO9mIA=", + "dev": true, + "requires": { + "arr-filter": "^1.1.1", "arr-flatten": "^1.0.1", "arr-map": "^2.0.0", "array-each": "^1.0.0", @@ -1752,23 +2095,15 @@ "now-and-later": "^2.0.0" } }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", - "dev": true - }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, "requires": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -1783,7 +2118,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -1792,7 +2126,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -1801,7 +2134,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -1810,7 +2142,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -1819,75 +2150,49 @@ } } }, - "base64-arraybuffer": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", - "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", - "dev": true - }, "base64-js": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", "dev": true }, - "base64id": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", - "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=", - "dev": true - }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, - "optional": true, "requires": { "tweetnacl": "^0.14.3" } }, - "better-assert": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", - "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "bfj": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", + "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", "dev": true, "requires": { - "callsite": "1.0.0" + "bluebird": "^3.5.1", + "check-types": "^7.3.0", + "hoopy": "^0.1.2", + "tryer": "^1.0.0" } }, - "big-integer": { - "version": "1.6.41", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.41.tgz", - "integrity": "sha512-d5AT9lMTYJ/ZE/4gzxb+5ttPcRWljVsvv7lF1w9KzkPhVUhBtHrjDo1J8swfZKepfLsliDhYa31zRYwcD0Yg9w==", + "big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "dev": true, - "requires": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - } - }, "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, "binaryextensions": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.1.tgz", - "integrity": "sha512-XBaoWE9RW8pPdPQNibZsW2zh8TW6gcarXp1FZPwT8Uop8ScSNldJEWf2k9l3HeTqdrEwsOsFcq74RiJECW34yA==", - "dev": true - }, - "blob": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", - "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/binaryextensions/-/binaryextensions-2.1.2.tgz", + "integrity": "sha512-xVNN69YGDghOqCCtA6FI7avYrr02mTJjOgB0/f1VPD3pJC8QEvjTKWc4epDx8AqxxA75NI0QpVM2gPJXUbE4Tg==", "dev": true }, "bluebird": { @@ -1920,6 +2225,12 @@ "type-is": "~1.6.16" }, "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1928,58 +2239,43 @@ "requires": { "ms": "2.0.0" } - } - } - }, - "boxen": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-0.6.0.tgz", - "integrity": "sha1-g2TUJIrDT/DvGy8r9JpsYM4NgbY=", - "dev": true, - "requires": { - "ansi-align": "^1.1.0", - "camelcase": "^2.1.0", - "chalk": "^1.1.1", - "cli-boxes": "^1.0.0", - "filled-array": "^1.0.0", - "object-assign": "^4.0.1", - "repeating": "^2.0.0", - "string-width": "^1.0.1", - "widest-line": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "safer-buffer": ">= 2.1.2 < 3" } }, - "supports-color": { + "ms": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, + "boxen": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.3.0.tgz", + "integrity": "sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==", + "dev": true, + "requires": { + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^2.0.0" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1989,7 +2285,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, "requires": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -2007,7 +2302,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -2020,20 +2314,6 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - } - }, "browser-process-hrtime": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", @@ -2057,98 +2337,6 @@ } } }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify": { - "version": "14.5.0", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-14.5.0.tgz", - "integrity": "sha512-gKfOsNQv/toWz+60nSPfYzuwSEdzvV2WdxrVPUbPD/qui44rAkB3t3muNtmmGYHqrG56FGwX9SUEQmzNLAeS7g==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "^5.0.2", - "cached-path-relative": "^1.0.0", - "concat-stream": "~1.5.1", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "~1.1.0", - "duplexer2": "~0.1.2", - "events": "~1.1.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "labeled-stream-splicer": "^2.0.0", - "module-deps": "^4.0.8", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^2.0.0", - "string_decoder": "~1.0.0", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "~0.0.0", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "~0.0.1", - "xtend": "^4.0.0" - }, - "dependencies": { - "buffer": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.1.0.tgz", - "integrity": "sha512-YkIRgwsZwJWTnyQrsBTWefizHh+8GYj3kbL1BTiAQ/9pwpino0G7B2gp5tx/FUBqUlvtxV85KNR3mwfAtv15Yw==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - } - } - }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -2186,17 +2374,6 @@ "safe-buffer": "^5.1.2" } }, - "browserify-fs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-fs/-/browserify-fs-1.0.0.tgz", - "integrity": "sha1-8HWqinKdTRcW0GZiDjhvzBMRqW8=", - "dev": true, - "requires": { - "level-filesystem": "^1.0.1", - "level-js": "^2.1.3", - "levelup": "^0.18.2" - } - }, "browserify-rsa": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", @@ -2232,33 +2409,32 @@ } }, "browserslist": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.4.2.tgz", - "integrity": "sha512-ISS/AIAiHERJ3d45Fz0AVYKkgcy+F/eJHzKEvv1j0wwKGKD9T3BrwKr/5g45L+Y4XIK5PlTqefHciRFcfE1Jxg==", + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.6.tgz", + "integrity": "sha512-o/hPOtbU9oX507lIqon+UvPYqpx3mHc8cV3QemSBTXwkG8gSQSK6UKvXcE/DcleU3+A59XTUHyCvZ5qGy8xVAg==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000939", - "electron-to-chromium": "^1.3.113", - "node-releases": "^1.1.8" + "caniuse-lite": "^1.0.30000963", + "electron-to-chromium": "^1.3.127", + "node-releases": "^1.1.17" } }, - "browserstack": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.5.2.tgz", - "integrity": "sha512-+6AFt9HzhKykcPF79W6yjEUJcdvZOV0lIXdkORXMJftGrDl0OKWqRF4GHqpDNkxiceDT/uB7Fb/aDwktvXX7dg==", + "bs-logger": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", + "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", "dev": true, "requires": { - "https-proxy-agent": "^2.2.1" + "fast-json-stable-stringify": "2.x" } }, - "browserstacktunnel-wrapper": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/browserstacktunnel-wrapper/-/browserstacktunnel-wrapper-2.0.4.tgz", - "integrity": "sha512-GCV599FUUxNOCFl3WgPnfc5dcqq9XTmMXoxWpqkvmk0R9TOIoqmjENNU6LY6DtgIL6WfBVbg/jmWtnM5K6UYSg==", + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", "dev": true, "requires": { - "https-proxy-agent": "^2.2.1", - "unzipper": "^0.9.3" + "node-int64": "^0.4.0" } }, "buffer": { @@ -2272,51 +2448,16 @@ "isarray": "^1.0.0" } }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, "buffer-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", "dev": true }, - "buffer-es6": { - "version": "4.9.3", - "resolved": "https://registry.npmjs.org/buffer-es6/-/buffer-es6-4.9.3.tgz", - "integrity": "sha1-8mNHuC33b9N+GLy1KIxJcM/VxAQ=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", - "dev": true - }, - "buffer-indexof-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.1.tgz", - "integrity": "sha1-qfuAbOgUXVQoUQznLyeLs2OmOL8=", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "buffer-xor": { "version": "1.0.3", @@ -2324,17 +2465,10 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=", - "dev": true - }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" }, "builtin-status-codes": { "version": "3.0.0", @@ -2343,16 +2477,66 @@ "dev": true }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", "dev": true }, + "cacache": { + "version": "11.3.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.2.tgz", + "integrity": "sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.2", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", + "dev": true + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true + } + } + }, "cache-base": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, "requires": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -2365,23 +2549,21 @@ "unset-value": "^1.0.0" } }, - "cached-path-relative": { + "call-me-maybe": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz", - "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc=", - "dev": true + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=" }, - "callsite": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", - "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" }, "camelcase-keys": { "version": "2.1.0", @@ -2391,18 +2573,35 @@ "requires": { "camelcase": "^2.0.0", "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + } } }, "caniuse-lite": { - "version": "1.0.30000948", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000948.tgz", - "integrity": "sha512-Lw4y7oz1X5MOMZm+2IFaSISqVVQvUuD+ZUSfeYK/SlYiMjkHN/eJ2PDfJehW5NA6JjrxYSSnIWfwjeObQMEjFQ==", + "version": "1.0.30000967", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000967.tgz", + "integrity": "sha512-rUBIbap+VJfxTzrM4akJ00lkvVb5/n5v3EGXfWzSH5zT8aJmGzjA8HWhJ4U6kCpzxozUSnB+yvAYDRPY6mRpgQ==", "dev": true }, + "capture-exit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-2.0.0.tgz", + "integrity": "sha512-PiT/hQmTonHhl/HFGN+Lx3JJUznrVYJ3+AQsnthneZbvW7x+f08Tk7yLJTLEOUvBTbduLeeBkxEaYXUOUrRq6g==", + "dev": true, + "requires": { + "rsvp": "^4.8.4" + } + }, "capture-stack-trace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", - "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz", + "integrity": "sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw==", "dev": true }, "caseless": { @@ -2411,80 +2610,91 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "^0.1.3", - "lazy-cache": "^1.0.3" - } - }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", "dev": true, "requires": { - "traverse": ">=0.3.0 <0.4" + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" } }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", - "dev": true, + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" - }, - "dependencies": { - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "check-types": { + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", + "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==", + "dev": true + }, "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", + "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", "dev": true, "requires": { "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", "glob-parent": "^3.1.0", - "inherits": "^2.0.1", + "inherits": "^2.0.3", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", + "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" + "readdirp": "^2.2.1", + "upath": "^1.1.1" }, "dependencies": { - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true } } }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", + "dev": true + }, + "chrome-trace-event": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz", + "integrity": "sha512-xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "dev": true + }, "cipher-base": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", @@ -2495,17 +2705,10 @@ "safe-buffer": "^5.0.1" } }, - "circular-json": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.5.9.tgz", - "integrity": "sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==", - "dev": true - }, "class-utils": { "version": "0.3.6", "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, "requires": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -2517,13 +2720,21 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } } } }, + "clean-webpack-plugin": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-2.0.2.tgz", + "integrity": "sha512-pi1111o4OBd9qvacbgs+NRqClfVPKVIc66B4d8kx6Ho/L+i9entQ/NpK600CsTYTPu3kWvKwwyKarsYMvC2xeA==", + "dev": true, + "requires": { + "del": "^4.0.0" + } + }, "cli-boxes": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", @@ -2531,23 +2742,27 @@ "dev": true }, "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "requires": { - "center-align": "^0.1.1", - "right-align": "^0.1.1", - "wordwrap": "0.0.2" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" }, "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } } } }, @@ -2589,8 +2804,20 @@ "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "codecov": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/codecov/-/codecov-3.3.0.tgz", + "integrity": "sha512-S70c3Eg9SixumOvxaKE/yKUxb9ihu/uebD9iPO2IR73IdP4i6ZzjXEULj3d0HeyWPr0DqBfDkjNBWxURjVO5hw==", + "dev": true, + "requires": { + "argv": "^0.0.2", + "ignore-walk": "^3.0.1", + "js-yaml": "^3.12.0", + "teeny-request": "^3.7.0", + "urlgrey": "^0.4.4" + } }, "collection-map": { "version": "1.0.0", @@ -2607,26 +2834,23 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, "requires": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" } }, "color-convert": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.2.tgz", - "integrity": "sha512-3NUJZdhMhcdPn8vJ9v2UQJoH0qqoGUkYTgFEPZaPjEtwmmKUfNV46zZmgB2M5M4DCEQHMaCfWHCxiBflLm04Tg==", - "dev": true, + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "requires": { - "color-name": "1.1.1" + "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.1.tgz", - "integrity": "sha1-SxQVMEz1ACjqgWQ2Q72C6gWANok=", - "dev": true + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-support": { "version": "1.1.3", @@ -2635,44 +2859,29 @@ "dev": true }, "colors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=", + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", "dev": true }, - "combine-lists": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/combine-lists/-/combine-lists-1.0.1.tgz", - "integrity": "sha1-RYwH4J4NkA/Ci3Cj/sLazR0st/Y=", - "dev": true, - "requires": { - "lodash": "^4.5.0" - } - }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=", - "dev": true, - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - } - }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.17.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", - "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "compare-func": { @@ -2685,28 +2894,29 @@ "dot-prop": "^3.0.0" } }, - "component-bind": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", - "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", - "dev": true - }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" }, - "component-inherit": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", - "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", - "dev": true + "compression-webpack-plugin": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-2.0.0.tgz", + "integrity": "sha512-bDgd7oTUZC8EkRx8j0sjyCfeiO+e5sFcfgaFcjVhfQf5lLya7oY2BczxcJ7IUuVjz5m6fy8IECFmVFew3xLk8Q==", + "dev": true, + "requires": { + "cacache": "^11.2.0", + "find-cache-dir": "^2.0.0", + "neo-async": "^2.5.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "webpack-sources": "^1.0.1" + } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.5.2", @@ -2748,68 +2958,36 @@ } }, "configstore": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-2.1.0.tgz", - "integrity": "sha1-c3o6cDbpiGECqmCZ5HuzOrGroaE=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.2.tgz", + "integrity": "sha512-vtv5HtGjcYUgFrXc6Kx747B83MRRVS5R1VTEQoXvuP+kMI+if6uywV0nDGoiydJRy4yk7h9od5Og0kxx4zUXmw==", "dev": true, "requires": { - "dot-prop": "^3.0.0", + "dot-prop": "^4.1.0", "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.1", - "os-tmpdir": "^1.0.0", - "osenv": "^0.1.0", - "uuid": "^2.0.1", - "write-file-atomic": "^1.1.2", - "xdg-basedir": "^2.0.0" - }, - "dependencies": { - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", - "dev": true - } - } - }, - "connect": { - "version": "3.6.6", - "resolved": "https://registry.npmjs.org/connect/-/connect-3.6.6.tgz", - "integrity": "sha1-Ce/2xVr3I24TcTWnJXSFi2eG9SQ=", - "dev": true, - "requires": { - "debug": "2.6.9", - "finalhandler": "1.1.0", - "parseurl": "~1.3.2", - "utils-merge": "1.0.1" + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" }, "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dot-prop": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", + "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { - "ms": "2.0.0" + "is-obj": "^1.0.0" } + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true } } }, - "connect-prism": { - "version": "1.0.20", - "resolved": "https://registry.npmjs.org/connect-prism/-/connect-prism-1.0.20.tgz", - "integrity": "sha512-L1culdk+V/n6uKYRXodpPjcuwlggqwQO+DKvn+ZjayWTvn3OEcjumX3RWpR8ih1JWN9v8NW6u0yBim7j2dAapg==", - "dev": true, - "requires": { - "body-parser": "^1.18.2", - "director": "^1.2.8", - "forwarded-for": "^1.0.0", - "http-proxy": "^1.13.1", - "lodash": "^4.3.0", - "q": "^1.4.1", - "winston": "^2.1.1" - } - }, "console-browserify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", @@ -2838,28 +3016,28 @@ "dev": true }, "conventional-changelog": { - "version": "1.1.24", - "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.24.tgz", - "integrity": "sha512-2WcSUst4Y3Z4hHvoMTWXMJr/DmgVdLiMOVY1Kak2LfFz+GIz2KDp5naqbFesYbfXPmaZ5p491dO0FWZIJoJw1Q==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-3.1.8.tgz", + "integrity": "sha512-fb3/DOLLrQdNqN0yYn/lT6HcNsAa9A+VTDBqlZBMQcEPPIeJIMI+DBs3yu+eiYOLi22w9oShq3nn/zN6qm1Hmw==", "dev": true, "requires": { - "conventional-changelog-angular": "^1.6.6", - "conventional-changelog-atom": "^0.2.8", - "conventional-changelog-codemirror": "^0.3.8", - "conventional-changelog-core": "^2.0.11", - "conventional-changelog-ember": "^0.3.12", - "conventional-changelog-eslint": "^1.0.9", - "conventional-changelog-express": "^0.3.6", - "conventional-changelog-jquery": "^0.1.0", - "conventional-changelog-jscs": "^0.1.0", - "conventional-changelog-jshint": "^0.3.8", - "conventional-changelog-preset-loader": "^1.1.8" + "conventional-changelog-angular": "^5.0.3", + "conventional-changelog-atom": "^2.0.1", + "conventional-changelog-codemirror": "^2.0.1", + "conventional-changelog-conventionalcommits": "^3.0.2", + "conventional-changelog-core": "^3.2.2", + "conventional-changelog-ember": "^2.0.2", + "conventional-changelog-eslint": "^3.0.2", + "conventional-changelog-express": "^2.0.1", + "conventional-changelog-jquery": "^3.0.4", + "conventional-changelog-jshint": "^2.0.1", + "conventional-changelog-preset-loader": "^2.1.1" } }, "conventional-changelog-angular": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.6.tgz", - "integrity": "sha512-suQnFSqCxRwyBxY68pYTsFkG0taIdinHLNEAX5ivtw8bCRnIgnpvcHmlR/yjUyZIrNPYAoXlY1WiEKWgSE4BNg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-5.0.3.tgz", + "integrity": "sha512-YD1xzH7r9yXQte/HF9JBuEDfvjxxwDGGwZU1+ndanbY0oFgA+Po1T9JDSpPLdP0pZT6MhCAsdvFKC4TJ4MTJTA==", "dev": true, "requires": { "compare-func": "^1.3.1", @@ -2867,160 +3045,160 @@ } }, "conventional-changelog-atom": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.8.tgz", - "integrity": "sha512-8pPZqhMbrnltNBizjoDCb/Sz85KyUXNDQxuAEYAU5V/eHn0okMBVjqc8aHWYpHrytyZWvMGbayOlDv7i8kEf6g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-2.0.1.tgz", + "integrity": "sha512-9BniJa4gLwL20Sm7HWSNXd0gd9c5qo49gCi8nylLFpqAHhkFTj7NQfROq3f1VpffRtzfTQp4VKU5nxbe2v+eZQ==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-codemirror": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.8.tgz", - "integrity": "sha512-3HFZKtBXTaUCHvz7ai6nk2+psRIkldDoNzCsom0egDtVmPsvvHZkzjynhdQyULfacRSsBTaiQ0ol6nBOL4dDiQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-2.0.1.tgz", + "integrity": "sha512-23kT5IZWa+oNoUaDUzVXMYn60MCdOygTA2I+UjnOMiYVhZgmVwNd6ri/yDlmQGXHqbKhNR5NoXdBzSOSGxsgIQ==", + "dev": true, + "requires": { + "q": "^1.5.1" + } + }, + "conventional-changelog-config-spec": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-config-spec/-/conventional-changelog-config-spec-1.0.0.tgz", + "integrity": "sha512-RR3479x5Qw7XWkmNDYx/kOnsQJW+FZBIakURG/Dg7FkTaCrGjAkgfH96pQs9SyOEZI07USEXy7FjUDWYP8bt3Q==", + "dev": true + }, + "conventional-changelog-conventionalcommits": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-3.0.2.tgz", + "integrity": "sha512-w1+fQSDnm/7+sPKIYC5nfRVYDszt+6HdWizrigSqWFVIiiBVzkHGeqDLMSHc+Qq9qssHVAxAak5206epZyK87A==", "dev": true, "requires": { + "compare-func": "^1.3.1", "q": "^1.5.1" } }, "conventional-changelog-core": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.11.tgz", - "integrity": "sha512-HvTE6RlqeEZ/NFPtQeFLsIDOLrGP3bXYr7lFLMhCVsbduF1MXIe8OODkwMFyo1i9ku9NWBwVnVn0jDmIFXjDRg==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-3.2.2.tgz", + "integrity": "sha512-cssjAKajxaOX5LNAJLB+UOcoWjAIBvXtDMedv/58G+YEmAXMNfC16mmPl0JDOuVJVfIqM0nqQiZ8UCm8IXbE0g==", "dev": true, "requires": { - "conventional-changelog-writer": "^3.0.9", - "conventional-commits-parser": "^2.1.7", + "conventional-changelog-writer": "^4.0.5", + "conventional-commits-parser": "^3.0.2", "dateformat": "^3.0.0", "get-pkg-repo": "^1.0.0", - "git-raw-commits": "^1.3.6", + "git-raw-commits": "2.0.0", "git-remote-origin-url": "^2.0.0", - "git-semver-tags": "^1.3.6", + "git-semver-tags": "^2.0.2", "lodash": "^4.2.1", "normalize-package-data": "^2.3.5", "q": "^1.5.1", - "read-pkg": "^1.1.0", - "read-pkg-up": "^1.0.1", - "through2": "^2.0.0" + "read-pkg": "^3.0.0", + "read-pkg-up": "^3.0.0", + "through2": "^3.0.0" }, "dependencies": { - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "^1.2.0" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" } }, "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "readable-stream": "2 || 3" } } } }, "conventional-changelog-ember": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.12.tgz", - "integrity": "sha512-mmJzA7uzbrOqeF89dMMi6z17O07ORTXlTMArnLG9ZTX4oLaKNolUlxFUFlFm9JUoVWajVpaHQWjxH1EOQ+ARoQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-2.0.2.tgz", + "integrity": "sha512-qtZbA3XefO/n6DDmkYywDYi6wDKNNc98MMl2F9PKSaheJ25Trpi3336W8fDlBhq0X+EJRuseceAdKLEMmuX2tg==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-eslint": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.9.tgz", - "integrity": "sha512-h87nfVh2fdk9fJIvz26wCBsbDC/KxqCc5wSlNMZbXcARtbgNbNDIF7Y7ctokFdnxkzVdaHsbINkh548T9eBA7Q==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-3.0.2.tgz", + "integrity": "sha512-Yi7tOnxjZLXlCYBHArbIAm8vZ68QUSygFS7PgumPRiEk+9NPUeucy5Wg9AAyKoBprSV3o6P7Oghh4IZSLtKCvQ==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-express": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.6.tgz", - "integrity": "sha512-3iWVtBJZ9RnRnZveNDzOD8QRn6g6vUif0qVTWWyi5nUIAbuN1FfPVyKdAlJJfp5Im+dE8Kiy/d2SpaX/0X678Q==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-2.0.1.tgz", + "integrity": "sha512-G6uCuCaQhLxdb4eEfAIHpcfcJ2+ao3hJkbLrw/jSK/eROeNfnxCJasaWdDAfFkxsbpzvQT4W01iSynU3OoPLIw==", "dev": true, "requires": { "q": "^1.5.1" } }, "conventional-changelog-jquery": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz", - "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", - "dev": true, - "requires": { - "q": "^1.4.1" - } - }, - "conventional-changelog-jscs": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz", - "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-3.0.4.tgz", + "integrity": "sha512-IVJGI3MseYoY6eybknnTf9WzeQIKZv7aNTm2KQsiFVJH21bfP2q7XVjfoMibdCg95GmgeFlaygMdeoDDa+ZbEQ==", "dev": true, "requires": { - "q": "^1.4.1" + "q": "^1.5.1" } }, "conventional-changelog-jshint": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.8.tgz", - "integrity": "sha512-hn9QU4ZI/5V50wKPJNPGT4gEWgiBFpV6adieILW4MaUFynuDYOvQ71EMSj3EznJyKi/KzuXpc9dGmX8njZMjig==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-2.0.1.tgz", + "integrity": "sha512-kRFJsCOZzPFm2tzRHULWP4tauGMvccOlXYf3zGeuSW4U0mZhk5NsjnRZ7xFWrTFPlCLV+PNmHMuXp5atdoZmEg==", "dev": true, "requires": { "compare-func": "^1.3.1", @@ -3028,35 +3206,29 @@ } }, "conventional-changelog-preset-loader": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.8.tgz", - "integrity": "sha512-MkksM4G4YdrMlT2MbTsV2F6LXu/hZR0Tc/yenRrDIKRwBl/SP7ER4ZDlglqJsCzLJi4UonBc52Bkm5hzrOVCcw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-2.1.1.tgz", + "integrity": "sha512-K4avzGMLm5Xw0Ek/6eE3vdOXkqnpf9ydb68XYmCc16cJ99XMMbc2oaNMuPwAsxVK6CC1yA4/I90EhmWNj0Q6HA==", "dev": true }, "conventional-changelog-writer": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.9.tgz", - "integrity": "sha512-n9KbsxlJxRQsUnK6wIBRnARacvNnN4C/nxnxCkH+B/R1JS2Fa+DiP1dU4I59mEDEjgnFaN2+9wr1P1s7GYB5/Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-4.0.5.tgz", + "integrity": "sha512-g/Myp4MaJ1A+f7Ai+SnVhkcWtaHk6flw0SYN7A+vQ+MTu0+gSovQWs4Pg4NtcNUcIztYQ9YHsoxHP+GGQplI7Q==", "dev": true, "requires": { "compare-func": "^1.3.1", - "conventional-commits-filter": "^1.1.6", + "conventional-commits-filter": "^2.0.2", "dateformat": "^3.0.0", - "handlebars": "^4.0.2", + "handlebars": "^4.1.0", "json-stringify-safe": "^5.0.1", "lodash": "^4.2.1", "meow": "^4.0.0", "semver": "^5.5.0", "split": "^1.0.0", - "through2": "^2.0.0" + "through2": "^3.0.0" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, "camelcase-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", @@ -3068,27 +3240,24 @@ "quick-lru": "^1.0.0" } }, - "dateformat": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", - "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", - "dev": true - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", "dev": true }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", @@ -3112,6 +3281,33 @@ "trim-newlines": "^2.0.0" } }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, "read-pkg-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", @@ -3132,15 +3328,30 @@ "strip-indent": "^2.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", "dev": true }, - "trim-newlines": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", "dev": true } @@ -3153,19 +3364,19 @@ "dev": true }, "conventional-commits-filter": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.6.tgz", - "integrity": "sha512-KcDgtCRKJCQhyk6VLT7zR+ZOyCnerfemE/CsR3iQpzRRFbLEs0Y6rwk3mpDvtOh04X223z+1xyJ582Stfct/0Q==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-2.0.2.tgz", + "integrity": "sha512-WpGKsMeXfs21m1zIw4s9H5sys2+9JccTzpN6toXtxhpw2VNF2JUXwIakthKBy+LN4DvJm+TzWhxOMWOs1OFCFQ==", "dev": true, "requires": { - "is-subset": "^0.1.1", + "lodash.ismatch": "^4.4.0", "modify-values": "^1.0.0" } }, "conventional-commits-parser": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.7.tgz", - "integrity": "sha512-BoMaddIEJ6B4QVMSDu9IkVImlGOSGA1I2BQyOZHeLQ6qVOJLcLKn97+fL6dGbzWEiqDzfH4OkcveULmeq2MHFQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-3.0.2.tgz", + "integrity": "sha512-y5eqgaKR0F6xsBNVSQ/5cI5qIF3MojddSUi1vKIggRkqUTbkqFKH9P5YX/AT1BVZp9DtSzBTIkvjyVLotLsVog==", "dev": true, "requires": { "JSONStream": "^1.0.4", @@ -3173,16 +3384,154 @@ "lodash": "^4.2.1", "meow": "^4.0.0", "split2": "^2.0.0", - "through2": "^2.0.0", + "through2": "^3.0.0", "trim-off-newlines": "^1.0.0" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-4.0.1.tgz", + "integrity": "sha512-xcSBHD5Z86zaOc+781KrupuHAzeGXSLtiAOmBsiLDiPSaYSB6hdew2ng9EBAnZ62jagG9MHAOdxpDi/lWBFJ/A==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist": "^1.1.3", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", "dev": true }, + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", + "dev": true, + "requires": { + "readable-stream": "2 || 3" + } + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + } + } + }, + "conventional-recommended-bump": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-5.0.0.tgz", + "integrity": "sha512-CsfdICpbUe0pmM4MTG90GPUqnFgB1SWIR2HAh+vS+JhhJdPWvc0brs8oadWoYGhFOQpQwe57JnvzWEWU0m2OSg==", + "dev": true, + "requires": { + "concat-stream": "^2.0.0", + "conventional-changelog-preset-loader": "^2.1.1", + "conventional-commits-filter": "^2.0.2", + "conventional-commits-parser": "^3.0.2", + "git-raw-commits": "2.0.0", + "git-semver-tags": "^2.0.2", + "meow": "^4.0.0", + "q": "^1.5.1" + }, + "dependencies": { "camelcase-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", @@ -3194,13 +3543,16 @@ "quick-lru": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" } }, "indent-string": { @@ -3209,6 +3561,18 @@ "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", "dev": true }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", @@ -3232,6 +3596,33 @@ "trim-newlines": "^2.0.0" } }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, "read-pkg-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", @@ -3242,6 +3633,17 @@ "read-pkg": "^3.0.0" } }, + "readable-stream": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.3.0.tgz", + "integrity": "sha512-EsI+s3k3XsW+fU8fQACLN59ky34AZ14LoeVZpYwmZvldCFo0r0gnelwF2TcMjLor/BTL5aDJVBMkss0dthToPw==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, "redent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", @@ -3252,6 +3654,12 @@ "strip-indent": "^2.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", @@ -3266,27 +3674,15 @@ } } }, - "conventional-recommended-bump": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-1.2.1.tgz", - "integrity": "sha512-oJjG6DkRgtnr/t/VrPdzmf4XZv8c4xKVJrVT4zrSHd92KEL+EYxSbYoKq8lQ7U5yLMw7130wrcQTLRjM/T+d4w==", + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", "dev": true, "requires": { - "concat-stream": "^1.4.10", - "conventional-commits-filter": "^1.1.1", - "conventional-commits-parser": "^2.1.1", - "git-raw-commits": "^1.3.0", - "git-semver-tags": "^1.3.0", - "meow": "^3.3.0", - "object-assign": "^4.0.1" + "safe-buffer": "~5.1.1" } }, - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA=", - "dev": true - }, "cookie": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", @@ -3299,16 +3695,24 @@ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", "dev": true }, - "cookiejar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz", - "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==" + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + } }, "copy-descriptor": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=" }, "copy-props": { "version": "2.0.4", @@ -3321,24 +3725,72 @@ } }, "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.0.1.tgz", + "integrity": "sha512-sco40rF+2KlE0ROMvydjkrVMMG1vYilP2ALoRXcYR4obqbYIuV3Bg+51GEDW+HF8n7NRA+iaA4qD0nD9lo9mew==", + "dev": true + }, + "core-js-compat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.0.1.tgz", + "integrity": "sha512-2pC3e+Ht/1/gD7Sim/sqzvRplMiRnFQVlPpDVaHtY9l7zZP7knamr3VRD6NyGfHd84MrDC0tAM9ulNxYMW0T3g==", + "dev": true, + "requires": { + "browserslist": "^4.5.4", + "core-js": "3.0.1", + "core-js-pure": "3.0.1", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + } + } + }, + "core-js-pure": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.0.1.tgz", + "integrity": "sha512-mSxeQ6IghKW3MoyF4cz19GJ1cMm7761ON+WObSyLfTu/Jn3x7w4NwNFnrZxgl4MTSvYYepVLNuRtlB4loMwJ5g==", "dev": true }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, - "cors": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", - "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", + "cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", "dev": true, "requires": { - "object-assign": "^4", - "vary": "^1" + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } } }, "create-ecdh": { @@ -3391,23 +3843,10 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, "requires": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", "which": "^1.2.9" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - } } }, "cross-spawn-async": { @@ -3418,18 +3857,6 @@ "requires": { "lru-cache": "^4.0.0", "which": "^1.2.8" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", - "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - } } }, "crypto-browserify": { @@ -3451,39 +3878,22 @@ "randomfill": "^1.0.3" } }, - "css": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.3.tgz", - "integrity": "sha512-0W171WccAjQGGTKLhw4m2nnl0zPHUlTO/I8td4XzJgIB8Hg3ZZx71qT4G4eX8OVsSiaAKiUMy73E3nsbPlg2DQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "source-map": "^0.1.38", - "source-map-resolve": "^0.5.1", - "urix": "^0.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.1.43", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", - "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - } - } - }, - "cssom": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", - "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", - "dev": true - }, - "cssstyle": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", - "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "cssom": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.6.tgz", + "integrity": "sha512-DtUeseGk9/GBW0hl0vVPpU22iHL6YB5BUX7ml1hB+GMpo0NX5G4voX3kdWiMSEguFtcW3Vh3djqNF4aIe6ne0A==", + "dev": true + }, + "cssstyle": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.2.2.tgz", + "integrity": "sha512-43wY3kl1CVQSvL7wUY1qXkxVGkStjpkDmVjiIKX8R97uhajy8Bybay78uOtqvh7Q5GK75dNPfW0geWjE6qQQow==", "dev": true, "requires": { "cssom": "0.3.x" @@ -3498,16 +3908,10 @@ "array-find-index": "^1.0.1" } }, - "custom-event": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", - "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", - "dev": true - }, - "cycle": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", - "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=", + "cyclist": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", + "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", "dev": true }, "d": { @@ -3546,61 +3950,32 @@ "abab": "^2.0.0", "whatwg-mimetype": "^2.2.0", "whatwg-url": "^7.0.0" - }, - "dependencies": { - "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", - "dev": true - } } }, - "date-format": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-1.2.0.tgz", - "integrity": "sha1-YV6CjiM90aubua4JUODOzPpuytg=", - "dev": true - }, "date-now": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", "dev": true }, - "date-time": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-2.1.0.tgz", - "integrity": "sha512-/9+C44X7lot0IeiyfgJmETtRMhBidBYM2QFFIkGa0U1k+hSyY87Nw7PY3eDqpvCBm7I3WCSfPeZskW/YYq6m4g==", - "dev": true, - "requires": { - "time-zone": "^1.0.0" - } + "dateformat": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", + "integrity": "sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==", + "dev": true }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "debug-fabulous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", - "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", - "dev": true, + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "debug": "3.X", - "memoizee": "0.4.X", - "object-assign": "4.X" + "ms": "^2.1.1" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, "decamelize-keys": { "version": "1.1.0", @@ -3615,7 +3990,21 @@ "decode-uri-component": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "^4.0.0" + } + }, + "deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", "dev": true }, "deep-extend": { @@ -3653,38 +4042,19 @@ "integrity": "sha1-vLgrqnKtebQmp2cy8aga1t8m1oQ=", "dev": true }, - "deferred-leveldown": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/deferred-leveldown/-/deferred-leveldown-0.2.0.tgz", - "integrity": "sha1-LO8fER4cV4cNi7uK8mUOWHzS9bQ=", - "dev": true, - "requires": { - "abstract-leveldown": "~0.12.1" - } - }, "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { - "foreach": "^2.0.5", - "object-keys": "^1.0.8" - }, - "dependencies": { - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true - } + "object-keys": "^1.0.12" } }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, "requires": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -3694,7 +4064,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -3703,7 +4072,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -3712,7 +4080,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -3721,30 +4088,55 @@ } } }, - "defined": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz", - "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM=", - "dev": true - }, "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "dev": true, "requires": { + "@types/glob": "^7.1.1", "globby": "^6.1.0", - "is-path-cwd": "^1.0.0", - "is-path-in-cwd": "^1.0.0", - "p-map": "^1.1.1", - "pify": "^3.0.0", - "rimraf": "^2.2.8" + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + }, + "dependencies": { + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, "depd": { "version": "1.1.2", @@ -3752,18 +4144,6 @@ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", "dev": true }, - "deps-sort": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz", - "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "shasum": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - } - }, "des.js": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", @@ -3786,32 +4166,27 @@ "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", "dev": true }, + "detect-indent": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.0.0.tgz", + "integrity": "sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA==", + "dev": true + }, "detect-newline": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", "dev": true }, - "detective": { - "version": "4.7.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-4.7.1.tgz", - "integrity": "sha512-H6PmeeUcZloWtdt4DAkFyzFL94arpHr3NOwwmVILFiy+9Qd4JTxxXrzfyGk/lmct2qVGBwTSwSXagqu2BxmWig==", - "dev": true, - "requires": { - "acorn": "^5.2.1", - "defined": "^1.0.0" - } - }, - "di": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", - "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", - "dev": true - }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", - "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" + }, + "diff-sequences": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-24.3.0.tgz", + "integrity": "sha512-xLqpez+Zj9GKSnPWS0WZw1igGocZ+uua8+y+5dDNTT934N3QuY1sp2LkHzwiaYQGz60hMq0pjAshdeXm5VUOEw==", "dev": true }, "diffie-hellman": { @@ -3829,18 +4204,11 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", - "dev": true, "requires": { "arrify": "^1.0.1", "path-type": "^3.0.0" } }, - "director": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/director/-/director-1.2.8.tgz", - "integrity": "sha1-xtm03YkOmv9TZRg/6cyOc5lM8tU=", - "dev": true - }, "doctrine": { "version": "0.7.2", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", @@ -3865,22 +4233,10 @@ } } }, - "dom-serialize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", - "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", - "dev": true, - "requires": { - "custom-event": "~1.0.0", - "ent": "~2.2.0", - "extend": "^3.0.0", - "void-elements": "^2.0.0" - } - }, "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, "domexception": { @@ -3902,62 +4258,88 @@ } }, "dotenv": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", - "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.0.0.tgz", + "integrity": "sha512-30xVGqjLjiUOArT4+M5q9sYdvuR4riM6yK9wMcas9Vbp6zZa+ocC9dp6QoftuhTPhFAiLK/0C5Ni2nou/Bk8lg==", "dev": true }, "dotgitignore": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-1.0.3.tgz", - "integrity": "sha512-eu5XjSstm0WXQsARgo6kPjkINYZlOUW+z/KtAAIBjHa5mUpMPrxJytbPIndWz6GubBuuuH5ljtVcXKnVnH5q8w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-2.1.0.tgz", + "integrity": "sha512-sCm11ak2oY6DglEPpCB8TixLjWAxd3kJTs6UIcSasNYxXdFPV+YKlye92c8H4kKFqV5qYMIh7d+cYecEg0dIkA==", "dev": true, "requires": { - "find-up": "^2.1.0", + "find-up": "^3.0.0", "minimatch": "^3.0.4" }, "dependencies": { "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { - "locate-path": "^2.0.0" + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true } } }, - "duplexer2": { + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer3": { "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true }, "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", "readable-stream": "^2.0.0", "stream-shift": "^1.0.0" - }, - "dependencies": { - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - } } }, "each-props": { @@ -3971,13 +4353,13 @@ } }, "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, - "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "editions": { @@ -3992,80 +4374,22 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, - "electron": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/electron/-/electron-3.0.6.tgz", - "integrity": "sha512-MqwvA6IM0IDvUgPo/zHasmLMn3eYhMJ2I0qTNfQtxwqdoo762UlFS+upmMgcnCXPcGMGDWi3wtZhNir9nEw1kA==", - "dev": true, - "requires": { - "@types/node": "^8.0.24", - "electron-download": "^4.1.0", - "extract-zip": "^1.0.3" - }, - "dependencies": { - "@types/node": { - "version": "8.10.36", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.36.tgz", - "integrity": "sha512-SL6KhfM7PTqiFmbCW3eVNwVBZ+88Mrzbuvn9olPsfv43mbiWaFY+nRcz/TGGku0/lc2FepdMbImdMY1JrQ+zbw==", - "dev": true - } - } - }, - "electron-download": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/electron-download/-/electron-download-4.1.1.tgz", - "integrity": "sha512-FjEWG9Jb/ppK/2zToP+U5dds114fM1ZOJqMAR4aXXL5CvyPE9fiqBK/9YcwC9poIFQTEJk/EM/zyRwziziRZrg==", - "dev": true, - "requires": { - "debug": "^3.0.0", - "env-paths": "^1.0.0", - "fs-extra": "^4.0.1", - "minimist": "^1.2.0", - "nugget": "^2.0.1", - "path-exists": "^3.0.0", - "rc": "^1.2.1", - "semver": "^5.4.1", - "sumchecker": "^2.0.2" - }, - "dependencies": { - "fs-extra": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz", - "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } + "ejs": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==", + "dev": true }, "electron-to-chromium": { - "version": "1.3.116", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz", - "integrity": "sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA==", + "version": "1.3.133", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.133.tgz", + "integrity": "sha512-lyoC8aoqbbDqsprb6aPdt9n3DpOZZzdz/T4IZKsR0/dkZIxnJVUjjcpOSwA66jPRIOyDAamCTAUqweU05kKNSg==", "dev": true }, "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz", + "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==", "dev": true, "requires": { "bn.js": "^4.4.0", @@ -4077,6 +4401,24 @@ "minimalistic-crypto-utils": "^1.0.0" } }, + "email-addresses": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/email-addresses/-/email-addresses-3.0.3.tgz", + "integrity": "sha512-kUlSC06PVvvjlMRpNIl3kR1NRXLEe86VQ7N0bQeaCZb2g+InShCeHQp/JvyYNTugMnRN2NvJhHlc3q12MWbbpg==", + "dev": true + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", @@ -4092,90 +4434,17 @@ "once": "^1.4.0" } }, - "engine.io": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.1.tgz", - "integrity": "sha512-+VlKzHzMhaU+GsCIg4AoXF1UdDFjHHwMmMKqMJNDNLlUlejz58FCy4LBqB2YVJskHGYl06BatYWKP2TVdVXE5w==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "1.0.0", - "cookie": "0.3.1", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.0", - "ws": "~3.3.1" - }, - "dependencies": { - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - } - } - }, - "engine.io-client": { - "version": "3.2.1", - "resolved": "http://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", - "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "component-inherit": "0.0.3", - "debug": "~3.1.0", - "engine.io-parser": "~2.1.1", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "ws": "~3.3.1", - "xmlhttprequest-ssl": "~1.5.4", - "yeast": "0.1.2" - }, - "dependencies": { - "ws": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", - "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0", - "safe-buffer": "~5.1.0", - "ultron": "~1.1.0" - } - } - } - }, - "engine.io-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.3.tgz", - "integrity": "sha512-6HXPre2O4Houl7c4g7Ic/XzPnHBvaEmN90vtRO9uLmwtRqQmTOw0QMevL1TOfL2Cpu1VzsaTmMotQgMdkzGkVA==", + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", "dev": true, "requires": { - "after": "0.8.2", - "arraybuffer.slice": "~0.0.7", - "base64-arraybuffer": "0.1.5", - "blob": "0.0.5", - "has-binary2": "~1.0.2" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" } }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", - "dev": true - }, - "env-paths": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-1.0.0.tgz", - "integrity": "sha1-QWgTO0K7BcOKNbGuQ5fIKYqzaeA=", - "dev": true - }, "envify": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/envify/-/envify-4.1.0.tgz", @@ -4205,16 +4474,17 @@ } }, "es-abstract": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", - "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", + "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", "dev": true, "requires": { - "es-to-primitive": "^1.1.1", + "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", - "has": "^1.0.1", - "is-callable": "^1.1.3", - "is-regex": "^1.0.4" + "has": "^1.0.3", + "is-callable": "^1.1.4", + "is-regex": "^1.0.4", + "object-keys": "^1.0.12" } }, "es-to-primitive": { @@ -4229,14 +4499,14 @@ } }, "es5-ext": { - "version": "0.10.45", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.45.tgz", - "integrity": "sha512-FkfM6Vxxfmztilbxxz5UKSD4ICMf5tSpRFtDNtkAhOxZ0EKtX6qwmXNyH/sFyIbX2P/nU5AMiA9jilWsUGJzCQ==", + "version": "0.10.50", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz", + "integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==", "dev": true, "requires": { "es6-iterator": "~2.0.3", "es6-symbol": "~3.1.1", - "next-tick": "1" + "next-tick": "^1.0.0" } }, "es6-iterator": { @@ -4251,9 +4521,9 @@ } }, "es6-promise": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz", - "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.6.tgz", + "integrity": "sha512-aRVgGdnmW2OiySVPUC9e6m+plolMAJKjZnQlCwNSuK5yQ0JN61DZSO1X1Ufd1foqWRAlig0rhduTCHe7sVtK5Q==", "dev": true }, "es6-promisify": { @@ -4302,13 +4572,12 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", - "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.1.tgz", + "integrity": "sha512-JwiqFD9KdGVVpeuRa68yU3zZnBEOcPs0nKW7wZzXky8Z7tffdYUHbe11bPCV5jYlK6DVdKLWLm0f5I/QlL0Kmw==", "dev": true, "requires": { "esprima": "^3.1.3", @@ -4333,11 +4602,29 @@ } } }, - "esprima": { - "version": "4.0.1", + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "esrecurse": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", + "dev": true, + "requires": { + "estraverse": "^4.1.0" + } }, "estraverse": { "version": "4.2.0", @@ -4345,17 +4632,10 @@ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", "dev": true }, - "estree-walker": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.5.2.tgz", - "integrity": "sha512-XpCnW/AE10ws/kDAs37cngSkvgIR8aN3G0MS85m7dUpuK2EREo9VJ00uvw6Dg/hXEpfsE1I1TvJOJr+Z+TL+ig==", - "dev": true - }, "esutils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" }, "etag": { "version": "1.8.1", @@ -4363,21 +4643,10 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", - "dev": true + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.2.tgz", + "integrity": "sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==" }, "events": { "version": "1.1.1", @@ -4395,11 +4664,16 @@ "safe-buffer": "^5.1.1" } }, + "exec-sh": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.3.2.tgz", + "integrity": "sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg==", + "dev": true + }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, "requires": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", @@ -4410,45 +4684,16 @@ "strip-eof": "^1.0.0" } }, - "expand-braces": { + "exit": { "version": "0.1.2", - "resolved": "https://registry.npmjs.org/expand-braces/-/expand-braces-0.1.2.tgz", - "integrity": "sha1-SIsdHSRRyz06axks/AMPRMWFX+o=", - "dev": true, - "requires": { - "array-slice": "^0.2.3", - "array-unique": "^0.2.1", - "braces": "^0.1.2" - }, - "dependencies": { - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-0.1.5.tgz", - "integrity": "sha1-wIVxEIUpHYt1/ddOqw+FlygHEeY=", - "dev": true, - "requires": { - "expand-range": "^0.1.0" - } - } - } + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, "requires": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -4463,7 +4708,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -4472,7 +4716,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -4481,34 +4724,14 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } - } - } - }, - "expand-range": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-0.1.1.tgz", - "integrity": "sha1-TLjtoJk8pW+k9B/ELzy7TMrf8EQ=", - "dev": true, - "requires": { - "is-number": "^0.1.1", - "repeat-string": "^0.2.2" - }, - "dependencies": { - "is-number": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-0.1.1.tgz", - "integrity": "sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY=", - "dev": true }, - "repeat-string": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-0.2.2.tgz", - "integrity": "sha1-x6jTI2BoNiBZp+RlH8aITosftK4=", - "dev": true + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -4521,6 +4744,20 @@ "homedir-polyfill": "^1.0.1" } }, + "expect": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-24.8.0.tgz", + "integrity": "sha512-/zYvP8iMDrzaaxHVa724eJBCKqSHmO0FA7EDkBiRHxg6OipmMn1fN+C8T9L9K8yr7UONkOifu6+LLH+z76CnaA==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "ansi-styles": "^3.2.0", + "jest-get-type": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-regex-util": "^24.3.0" + } + }, "express": { "version": "4.16.4", "resolved": "https://registry.npmjs.org/express/-/express-4.16.4.tgz", @@ -4568,39 +4805,24 @@ "ms": "2.0.0" } }, - "finalhandler": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", - "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.2", - "statuses": "~1.4.0", - "unpipe": "~1.0.0" - } - }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "extend-shallow": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, "requires": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -4610,7 +4832,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, "requires": { "is-plain-object": "^2.0.4" } @@ -4621,7 +4842,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, "requires": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -4637,7 +4857,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -4646,7 +4865,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -4655,7 +4873,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -4664,7 +4881,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -4673,7 +4889,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -4682,53 +4897,12 @@ } } }, - "extract-zip": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz", - "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=", - "dev": true, - "requires": { - "concat-stream": "1.6.2", - "debug": "2.6.9", - "mkdirp": "0.5.1", - "yauzl": "2.4.1" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", "dev": true }, - "eyes": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", - "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=", - "dev": true - }, "fancy-log": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", @@ -4747,6 +4921,19 @@ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, + "fast-glob": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.6.tgz", + "integrity": "sha512-0BvMaZc1k9F+MeWWMe8pL6YltFzZYcJsYU7D4JyDA6PAczaXvxqQQ/z+mDF7/4Mw01DeUc+i3CTKajnkANkV4w==", + "requires": { + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + } + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -4759,35 +4946,34 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, - "fd-slicer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", - "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", "dev": true, "requires": { - "pend": "~1.2.0" + "bser": "^2.0.0" } }, + "figgy-pudding": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.1.tgz", + "integrity": "sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w==", + "dev": true + }, "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.0.0.tgz", + "integrity": "sha512-HKri+WoWoUgr83pehn/SIgLOMZ9nAWC6dcGj26RY2R4F50u4+RTUz0RCrUlOV3nKRAICW1UGzyb+kcX2qK1S/g==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" + "escape-string-regexp": "^1.0.5" } }, "file-type": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", - "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==" - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true + "version": "10.11.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-10.11.0.tgz", + "integrity": "sha512-uzk64HRpUZyTGZtVuvrjP0FYxzQrBf4rojot6J65YMEbwBLB0CWm0CLojVpwpmFmxcE/lkvYICgfcGozbBq6rw==" }, "filename-reserved-regex": { "version": "1.0.0", @@ -4816,6 +5002,12 @@ "humanize-url": "^1.0.0" } }, + "filesize": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz", + "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==", + "dev": true + }, "filestack-loader": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/filestack-loader/-/filestack-loader-3.0.4.tgz", @@ -4825,7 +5017,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -4837,31 +5028,24 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } } } }, - "filled-array": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filled-array/-/filled-array-1.1.0.tgz", - "integrity": "sha1-w8T2xmO5I0WamqKZEtLQMfFQf4Q=", - "dev": true - }, "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", + "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.1", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "~2.3.0", "parseurl": "~1.3.2", - "statuses": "~1.3.1", + "statuses": "~1.4.0", "unpipe": "~1.0.0" }, "dependencies": { @@ -4873,6 +5057,41 @@ "requires": { "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true } } }, @@ -4883,13 +5102,11 @@ "dev": true }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" + "locate-path": "^2.0.0" } }, "findup": { @@ -4902,12 +5119,6 @@ "commander": "~2.1.0" }, "dependencies": { - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, "commander": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.1.0.tgz", @@ -4917,21 +5128,21 @@ } }, "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "dev": true, "requires": { "detect-file": "^1.0.0", - "is-glob": "^3.1.0", + "is-glob": "^4.0.0", "micromatch": "^3.0.4", "resolve-dir": "^1.0.1" } }, "fined": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz", - "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", "dev": true, "requires": { "expand-tilde": "^2.0.2", @@ -4948,29 +5159,37 @@ "dev": true }, "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, "follow-redirects": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.1.tgz", - "integrity": "sha512-v9GI1hpaqq1ZZR6pBD1+kI7O24PhDvNGNodjS3MdcEqyrahCp8zbtpv+2B/krUnSmUH80lbAS7MrdeK5IylgKg==", - "dev": true, + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz", + "integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==", "requires": { - "debug": "^3.1.0" + "debug": "^3.2.6" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + } } }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" }, "for-own": { "version": "1.0.0", @@ -4981,12 +5200,6 @@ "for-in": "^1.0.1" } }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -4994,37 +5207,26 @@ "dev": true }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, - "formidable": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz", - "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==" - }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", "dev": true }, - "forwarded-for": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/forwarded-for/-/forwarded-for-1.0.1.tgz", - "integrity": "sha1-59pIFAJRaP/AoQ0/954UFfRq9Gk=", - "dev": true - }, "fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, "requires": { "map-cache": "^0.2.2" } @@ -5035,6 +5237,16 @@ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", "dev": true }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, "fs-access": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", @@ -5045,25 +5257,24 @@ } }, "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", "dev": true, "requires": { "graceful-fs": "^4.1.2", - "jsonfile": "^2.1.0", - "klaw": "^1.0.0", - "path-is-absolute": "^1.0.0", - "rimraf": "^2.2.8" + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "fs-jetpack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-2.2.0.tgz", - "integrity": "sha512-d/fqY4pRhtKPEDyMz3sfx4ZBeWY6fV9b0E07fvI/k2oHwOYfFzCGe6yYuIHea7568dqIb1oEzzsGpZFQwGq+7Q==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/fs-jetpack/-/fs-jetpack-2.2.2.tgz", + "integrity": "sha512-USJrUxck7SIXSvYPzU5fuR5iqLHRDSzb0kHvCJlQhUGEVai3P9yZDu/2b+bAzprbWLCc2YcslxBLBUInDmYkYA==", "dev": true, "requires": { - "minimatch": "^3.0.2" + "minimatch": "^3.0.2", + "rimraf": "^2.6.3" } }, "fs-mkdirp-stream": { @@ -5076,16 +5287,27 @@ "through2": "^2.0.3" } }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", - "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", + "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", "dev": true, "optional": true, "requires": { @@ -5104,7 +5326,8 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -5114,9 +5337,9 @@ "optional": true }, "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", "dev": true, "optional": true, "requires": { @@ -5128,22 +5351,24 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==", "dev": true, "optional": true }, @@ -5151,19 +5376,22 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -5183,9 +5411,9 @@ } }, "deep-extend": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz", - "integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", "dev": true, "optional": true }, @@ -5238,9 +5466,9 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "optional": true, "requires": { @@ -5260,13 +5488,13 @@ "optional": true }, "iconv-lite": { - "version": "0.4.21", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", - "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "optional": true, "requires": { - "safer-buffer": "^2.1.0" + "safer-buffer": ">= 2.1.2 < 3" } }, "ignore-walk": { @@ -5294,8 +5522,9 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, + "dev": true, + "optional": true + }, "ini": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", @@ -5308,6 +5537,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5324,6 +5554,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -5332,22 +5563,24 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "dev": true, + "optional": true }, "minipass": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.4.tgz", - "integrity": "sha512-hzXIWWet/BzWhYs2b+u7dRHlruXhwdgvlTMDKC6Cb1U7ps6Ac6yQlR39xsbjWJE377YTCtKwIXIpJ5oP+j5y8g==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", "dev": true, + "optional": true, "requires": { - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.0" } }, "minizlib": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", - "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", "dev": true, "optional": true, "requires": { @@ -5359,6 +5592,7 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -5371,9 +5605,9 @@ "optional": true }, "needle": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.0.tgz", - "integrity": "sha512-eFagy6c+TYayorXw/qtAdSvaUpEbBsDwDyxYFgLZ0lTojfH7K+OdBqAF7TAFwDokJaGpubpSGG0wO3iC0XPi8w==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", + "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", "dev": true, "optional": true, "requires": { @@ -5383,19 +5617,19 @@ } }, "node-pre-gyp": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.0.tgz", - "integrity": "sha512-G7kEonQLRbcA/mOoFoxvlMrw6Q6dPf92+t/l0DFSMuSlDoWaI9JWIyPwK0jyE1bph//CUEL65/Fz1m2vJbmjQQ==", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz", + "integrity": "sha512-d1xFs+C/IPS8Id0qPTZ4bUT8wWryfR/OzzAFxweG+uLN85oPzyo2Iw6bVlLQ/JOdgNonXLCoRyqDzDWq4iw72A==", "dev": true, "optional": true, "requires": { "detect-libc": "^1.0.2", "mkdirp": "^0.5.1", - "needle": "^2.2.0", + "needle": "^2.2.1", "nopt": "^4.0.1", "npm-packlist": "^1.1.6", "npmlog": "^4.0.2", - "rc": "^1.1.7", + "rc": "^1.2.7", "rimraf": "^2.6.1", "semver": "^5.3.0", "tar": "^4" @@ -5413,16 +5647,16 @@ } }, "npm-bundled": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", - "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.5.tgz", + "integrity": "sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g==", "dev": true, "optional": true }, "npm-packlist": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", - "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.2.0.tgz", + "integrity": "sha512-7Mni4Z8Xkx0/oegoqlcao/JpPCPEMtUvsmB0q7mgvlMinykJLSRTYuFqoQLYgGY8biuxIeiHO+QNJKbCfljewQ==", "dev": true, "optional": true, "requires": { @@ -5447,7 +5681,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -5461,6 +5696,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -5505,13 +5741,13 @@ "optional": true }, "rc": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.7.tgz", - "integrity": "sha512-LdLD8xD4zzLsAT5xyushXDNscEjB7+2ulnl8+r1pnESlYtlJtVSoCMBGr30eDRJ3+2Gq89jK9P9e4tCEH1+ywA==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "optional": true, "requires": { - "deep-extend": "^0.5.1", + "deep-extend": "^0.6.0", "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" @@ -5543,20 +5779,21 @@ } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "optional": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", - "dev": true + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -5573,9 +5810,9 @@ "optional": true }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", "dev": true, "optional": true }, @@ -5598,6 +5835,7 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5619,6 +5857,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5631,18 +5870,18 @@ "optional": true }, "tar": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.1.tgz", - "integrity": "sha512-O+v1r9yN4tOsvl90p5HAP4AEqbYhx4036AGMm075fH9F8Qwi3oJ+v4u50FkT/KkvywNGtwkk0zRI+8eYm1X/xg==", + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", "dev": true, "optional": true, "requires": { - "chownr": "^1.0.1", + "chownr": "^1.1.1", "fs-minipass": "^1.2.5", - "minipass": "^2.2.4", - "minizlib": "^1.1.0", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.1", + "safe-buffer": "^5.1.2", "yallist": "^3.0.2" } }, @@ -5654,92 +5893,46 @@ "optional": true }, "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "optional": true, "requires": { - "string-width": "^1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "dev": true, + "optional": true }, "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==", + "dev": true, + "optional": true } } }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "fwd-stream": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/fwd-stream/-/fwd-stream-1.0.4.tgz", - "integrity": "sha1-7Sgcq+1G/uz5Ie4y3ExQs3KsfPo=", - "dev": true, - "requires": { - "readable-stream": "~1.0.26-4" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, "get-pkg-repo": { @@ -5756,22 +5949,20 @@ } }, "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, "get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=" }, "getpass": { "version": "0.1.7", @@ -5783,61 +5974,46 @@ } }, "gh-pages": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-1.2.0.tgz", - "integrity": "sha512-cGLYAvxtlQ1iTwAS4g7FreZPXoE/g62Fsxln2mmR19mgs4zZI+XJ+wVVUhBFCF/0+Nmvbq+abyTWue1m1BSnmg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/gh-pages/-/gh-pages-2.0.1.tgz", + "integrity": "sha512-uFlk3bukljeiWKQ2XvPfjcSi/ou7IfoDf2p+Fj672saLAr8bnOdFVqI/JSgrSgInKpCg5BksxEwGUl++dbg8Dg==", "dev": true, "requires": { - "async": "2.6.1", - "commander": "2.15.1", + "async": "^2.6.1", + "commander": "^2.18.0", + "email-addresses": "^3.0.1", "filenamify-url": "^1.0.0", - "fs-extra": "^5.0.0", + "fs-extra": "^7.0.0", "globby": "^6.1.0", - "graceful-fs": "4.1.11", + "graceful-fs": "^4.1.11", "rimraf": "^2.6.2" }, "dependencies": { - "async": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", - "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { - "lodash": "^4.17.10" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true - }, - "fs-extra": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-5.0.0.tgz", - "integrity": "sha512-66Pm4RYbjzdyeuqudYqhFiNBbCIuI9kgRqLPSHIlXHidW8NIQtVdkM1yeZ4lXwuhbTETv3EUGMNHAAw6hiundQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } } } }, "git-raw-commits": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.6.tgz", - "integrity": "sha512-svsK26tQ8vEKnMshTDatSIQSMDdz8CxIIqKsvPqbtV23Etmw6VNaFAitu8zwZ0VrOne7FztwPyRLxK7/DIUTQg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-2.0.0.tgz", + "integrity": "sha512-w4jFEJFgKXMQJ0H0ikBk2S+4KP2VEjhCvLCNqbNRQC8BgGWgLKNCO7a9K9LI+TVT7Gfoloje502sEnctibffgg==", "dev": true, "requires": { "dargs": "^4.0.1", @@ -5847,12 +6023,6 @@ "through2": "^2.0.0" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, "camelcase-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", @@ -5864,38 +6034,22 @@ "quick-lru": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", "dev": true }, - "lodash.template": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", - "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", - "dev": true, - "requires": { - "lodash._reinterpolate": "~3.0.0", - "lodash.templatesettings": "^4.0.0" - } - }, - "lodash.templatesettings": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", - "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "lodash._reinterpolate": "~3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" } }, "map-obj": { @@ -5921,6 +6075,33 @@ "trim-newlines": "^2.0.0" } }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, "read-pkg-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", @@ -5941,6 +6122,12 @@ "strip-indent": "^2.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", @@ -5974,21 +6161,15 @@ } }, "git-semver-tags": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.6.tgz", - "integrity": "sha512-2jHlJnln4D/ECk9FxGEBh3k44wgYdWjWDtMmJPaecjoRmxKo3Y1Lh8GMYuOPu04CHw86NTAODchYjC5pnpMQig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-2.0.2.tgz", + "integrity": "sha512-34lMF7Yo1xEmsK2EkbArdoU79umpvm0MfzaDkSNYSJqtM5QLAVTPWgpiXSVI5o/O9EvZPSrP4Zvnec/CqhSd5w==", "dev": true, "requires": { "meow": "^4.0.0", "semver": "^5.5.0" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, "camelcase-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", @@ -6000,21 +6181,24 @@ "quick-lru": "^1.0.0" } }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, "indent-string": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", "dev": true }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, "map-obj": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", @@ -6038,6 +6222,33 @@ "trim-newlines": "^2.0.0" } }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, "read-pkg-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", @@ -6058,6 +6269,12 @@ "strip-indent": "^2.0.0" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, "strip-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", @@ -6082,10 +6299,9 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6095,50 +6311,23 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "requires": { + "is-extglob": "^2.1.0" + } + } } }, "glob-stream": { @@ -6159,6 +6348,11 @@ "unique-stream": "^2.0.2" } }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=" + }, "glob-watcher": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.3.tgz", @@ -6173,6 +6367,15 @@ "object.defaults": "^1.1.0" } }, + "global-dirs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", + "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "dev": true, + "requires": { + "ini": "^1.3.4" + } + }, "global-modules": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", @@ -6198,73 +6401,51 @@ } }, "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", - "dev": true, + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-8.0.2.tgz", + "integrity": "sha512-yTzMmKygLp8RUpG1Ymu2VXPSJQZjNAZPD4ywgYEaG7e4tBJeUQBO8OpXrf1RCNcEs5alsoJYPAMiIHP0cmeC7w==", "requires": { "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "dir-glob": "2.0.0", + "fast-glob": "^2.0.2", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" } }, "glogg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", - "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", + "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", "dev": true, "requires": { "sparkles": "^1.0.0" } }, "got": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/got/-/got-5.7.1.tgz", - "integrity": "sha1-X4FjWmHkplifGAVp6k44FoClHzU=", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { - "create-error-class": "^3.0.1", - "duplexer2": "^0.1.4", + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", "is-redirect": "^1.0.0", "is-retry-allowed": "^1.0.0", "is-stream": "^1.0.0", "lowercase-keys": "^1.0.0", - "node-status-codes": "^1.0.0", - "object-assign": "^4.0.1", - "parse-json": "^2.1.0", - "pinkie-promise": "^2.0.0", - "read-all-stream": "^3.0.0", - "readable-stream": "^2.0.5", - "timed-out": "^3.0.0", - "unzip-response": "^1.0.2", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", "url-parse-lax": "^1.0.0" - }, - "dependencies": { - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - } } }, "graceful-fs": { @@ -6273,27 +6454,21 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", "dev": true }, "gulp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.0.tgz", - "integrity": "sha1-lXZsYB2t5Kd+0+eyttwDiBtZY2Y=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", "dev": true, "requires": { - "glob-watcher": "^5.0.0", - "gulp-cli": "^2.0.0", - "undertaker": "^1.0.0", + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", "vinyl-fs": "^3.0.0" }, "dependencies": { @@ -6327,9 +6502,9 @@ } }, "gulp-cli": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.0.1.tgz", - "integrity": "sha512-RxujJJdN8/O6IW2nPugl7YazhmrIEjmiVfPKrWt68r71UCaLKS71Hp0gpKT+F6qOUFtr7KqtifDKaAJPRVvMYQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.2.0.tgz", + "integrity": "sha512-rGs3bVYHdyJpLqR0TUBnlcZ1O5O++Zs4bA0ajm+zr3WFCfiSLjGwoCBqFs18wzN+ZxahT9DkOK5nDf26iDsWjA==", "dev": true, "requires": { "ansi-colors": "^1.0.1", @@ -6342,7 +6517,7 @@ "gulplog": "^1.0.0", "interpret": "^1.1.0", "isobject": "^3.0.1", - "liftoff": "^2.5.0", + "liftoff": "^3.1.0", "matchdep": "^2.0.0", "mute-stdout": "^1.0.0", "pretty-hrtime": "^1.0.0", @@ -6352,6 +6527,15 @@ "yargs": "^7.1.0" } }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, "os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", @@ -6361,6 +6545,17 @@ "lcid": "^1.0.0" } }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, "which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", @@ -6399,109 +6594,6 @@ } } }, - "gulp-better-rollup": { - "version": "3.1.0", - "resolved": "http://registry.npmjs.org/gulp-better-rollup/-/gulp-better-rollup-3.1.0.tgz", - "integrity": "sha512-jpfkO/UI6ImKfbj3iZuYDJStWIqP7U1FcKr/JAXrzaTSvdI0dlKCLoGXpF8HtXcws112x14Xk1V7kfC0tfY9lQ==", - "dev": true, - "requires": { - "lodash.camelcase": "^4.3.0", - "plugin-error": "^0.1.2", - "rollup": ">=0.48 <0.57", - "vinyl": "^2.1.0", - "vinyl-sourcemaps-apply": "^0.2.1" - }, - "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "rollup": { - "version": "0.56.5", - "resolved": "http://registry.npmjs.org/rollup/-/rollup-0.56.5.tgz", - "integrity": "sha512-IGPk5vdWrsc4vkiW9XMeXr5QMtxmvATTttTi59w2jBQWe9G/MMQtn8teIBAj+DdK51TrpVT6P0aQUaQUlUYCJA==", - "dev": true - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, "gulp-gzip": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/gulp-gzip/-/gulp-gzip-1.4.2.tgz", @@ -6514,6 +6606,20 @@ "plugin-error": "^1.0.0", "stream-to-array": "^2.3.0", "through2": "^2.0.3" + }, + "dependencies": { + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" + } + } } }, "gulp-rename": { @@ -6533,446 +6639,130 @@ "replacestream": "^4.0.0" } }, - "gulp-rollup": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/gulp-rollup/-/gulp-rollup-2.16.2.tgz", - "integrity": "sha512-Gs9NYcUl0xXod7qenC1Lm49a/PGllAa5ONyCXu29lXfkP1oJnJzSdPBjopm9RlOVhefadbHlfy9AijovFrqABA==", + "gulp-typescript": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-5.0.1.tgz", + "integrity": "sha512-YuMMlylyJtUSHG1/wuSVTrZp60k1dMEFKYOvDf7OvbAJWrDtxxD4oZon4ancdWwzjj30ztiidhe4VXJniF0pIQ==", "dev": true, "requires": { - "buffer-from": "^0.1.1", - "plugin-error": "^1.0.0", - "readable-stream": "^2.3.3", - "rollup": "^0.54.1", - "rollup-plugin-hypothetical": "^2.0.0", - "vinyl": "^2.1.0" + "ansi-colors": "^3.0.5", + "plugin-error": "^1.0.1", + "source-map": "^0.7.3", + "through2": "^3.0.0", + "vinyl": "^2.1.0", + "vinyl-fs": "^3.0.3" }, "dependencies": { - "buffer-from": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-0.1.2.tgz", - "integrity": "sha512-RiWIenusJsmI2KcvqQABB83tLxCByE3upSP8QU3rJDMVFGPWLvPQJt/O1Su9moRWeH7d+Q2HYb68f6+v+tw2vg==", - "dev": true - }, - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true }, - "rollup": { - "version": "0.54.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.54.1.tgz", - "integrity": "sha512-ebUUgUQ7K/sLn67CtO8Jj8H3RgKAoVWrpiJA7enOkwZPZzTCl8GC8CZ00g5jowjX80KgBmzs4Z1MV6cgglT86A==", + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "through2": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", + "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", "dev": true, "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" + "readable-stream": "2 || 3" } } } }, - "gulp-sourcemaps": { - "version": "2.6.4", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.4.tgz", - "integrity": "sha1-y7IAhFCxvM5s0jv5gze+dRv24wo=", + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "^1.0.0" + } + }, + "gzip-size": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.0.tgz", + "integrity": "sha512-wfSnvypBDRW94v5W3ckvvz/zFUNdJ81VgOP6tE4bPpRUcc0wGqU+y0eZjJEvKxwubJFix6P84sE8M51YWLT7rQ==", "dev": true, "requires": { - "@gulp-sourcemaps/identity-map": "1.X", - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "5.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "1.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom-string": "1.X", - "through2": "2.X" + "duplexer": "^0.1.1", + "pify": "^4.0.1" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", "dev": true } } }, - "gulp-typescript": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp-typescript/-/gulp-typescript-4.0.2.tgz", - "integrity": "sha512-Hhbn5Aa2l3T+tnn0KqsG6RRJmcYEsr3byTL2nBpNBeAK8pqug9Od4AwddU4JEI+hRw7mzZyjRbB8DDWR6paGVA==", + "handlebars": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz", + "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==", "dev": true, "requires": { - "ansi-colors": "^1.0.1", - "plugin-error": "^0.1.2", + "neo-async": "^2.6.0", + "optimist": "^0.6.1", "source-map": "^0.6.1", - "through2": "^2.0.3", - "vinyl": "^2.1.0", - "vinyl-fs": "^3.0.0" + "uglify-js": "^3.1.4" }, "dependencies": { - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - } - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", - "dev": true, - "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" - } - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - } } } }, - "gulp-uglify": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/gulp-uglify/-/gulp-uglify-3.0.1.tgz", - "integrity": "sha512-KVffbGY9d4Wv90bW/B1KZJyunLMyfHTBbilpDvmcrj5Go0/a1G3uVpt+1gRBWSw/11dqR3coJ1oWNTt1AiXuWQ==", + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash": "^4.13.1", - "make-error-cause": "^1.1.1", - "safe-buffer": "^5.1.2", - "through2": "^2.0.0", - "uglify-js": "^3.0.5", - "vinyl-sourcemaps-apply": "^0.2.0" + "ajv": "^6.5.5", + "har-schema": "^2.0.0" } }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { - "glogg": "^1.0.0" + "function-bind": "^1.1.1" } }, - "handlebars": { - "version": "4.0.11", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", - "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", - "dev": true, - "requires": { - "async": "^1.4.0", - "optimist": "^0.6.1", - "source-map": "^0.4.4", - "uglify-js": "^2.6" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "source-map": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": ">=0.0.4" - } - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "~0.5.1", - "uglify-to-browserify": "~1.0.0", - "yargs": "~3.10.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "^1.0.2", - "cliui": "^2.1.0", - "decamelize": "^1.0.0", - "window-size": "0.1.0" - } - } - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", - "dev": true, - "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-binary2": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", - "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", - "dev": true, - "requires": { - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-gulplog": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", - "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "requires": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -6983,7 +6773,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, "requires": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -6993,7 +6782,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -7011,27 +6799,15 @@ } }, "hash.js": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz", - "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { "inherits": "^2.0.3", "minimalistic-assert": "^1.0.1" } }, - "hat": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/hat/-/hat-0.0.3.tgz", - "integrity": "sha1-uwFKnmSzeIrtgAWRdBPU/z1QLYo=", - "dev": true - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, "highlight.js": { "version": "9.15.6", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.15.6.tgz", @@ -7050,25 +6826,26 @@ } }, "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { "parse-passwd": "^1.0.0" } }, + "hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "dev": true + }, "hosted-git-info": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", "dev": true }, - "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=" - }, "html-encoding-sniffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", @@ -7078,12 +6855,6 @@ "whatwg-encoding": "^1.0.1" } }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E=", - "dev": true - }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", @@ -7094,25 +6865,6 @@ "inherits": "2.0.3", "setprototypeof": "1.1.0", "statuses": ">= 1.4.0 < 2" - }, - "dependencies": { - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", - "dev": true - } - } - }, - "http-proxy": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.17.0.tgz", - "integrity": "sha512-Taqn+3nNvYRfJ3bGvKfBSRwy1v6eePlm3oc/aWVxZp57DQr5Eq3xhKJi7Z4hZpS8PC3H4qI+Yly5EmFacGuA/g==", - "dev": true, - "requires": { - "eventemitter3": "^3.0.0", - "follow-redirects": "^1.0.0", - "requires-port": "^1.0.0" } }, "http-signature": { @@ -7140,6 +6892,17 @@ "requires": { "agent-base": "^4.1.0", "debug": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } } }, "humanize-url": { @@ -7153,32 +6916,56 @@ } }, "iconv-lite": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", - "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, - "idb-wrapper": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/idb-wrapper/-/idb-wrapper-1.7.2.tgz", - "integrity": "sha512-zfNREywMuf0NzDo9mVsL0yegjsirJxHpKHvWcyRozIqQy89g0a3U+oBPOCN4cc0oCiOuYgZHimzaW/R46G1Mpg==", - "dev": true - }, "ieee754": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", "dev": true }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, "ignore": { "version": "3.3.10", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==" + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", "dev": true }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -7200,17 +6987,10 @@ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", "dev": true }, - "indexport": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/indexport/-/indexport-0.1.1.tgz", - "integrity": "sha1-FgMaCoJ5Hk+K0TKwhfZcGrWxL6Y=", - "dev": true - }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -7227,51 +7007,10 @@ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", "dev": true }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=", - "dev": true, - "requires": { - "source-map": "~0.5.3" - } - }, - "insert-module-globals": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz", - "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "dependencies": { - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - } - } - }, "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, "invariant": { @@ -7286,8 +7025,7 @@ "invert-kv": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" }, "ipaddr.js": { "version": "1.8.0", @@ -7295,12 +7033,6 @@ "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4=", "dev": true }, - "is": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha1-OzSixI81mXLzUEKEkZOucmS2NWI=", - "dev": true - }, "is-absolute": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", @@ -7315,7 +7047,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -7324,7 +7055,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -7349,17 +7079,7 @@ "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "^1.0.0" - } + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, "is-callable": { "version": "1.1.4", @@ -7367,11 +7087,19 @@ "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, + "is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dev": true, + "requires": { + "ci-info": "^2.0.0" + } + }, "is-data-descriptor": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -7380,7 +7108,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -7397,7 +7124,6 @@ "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, "requires": { "is-accessor-descriptor": "^0.1.6", "is-data-descriptor": "^0.1.4", @@ -7407,43 +7133,19 @@ "kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==" } } }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "^2.0.0" - } - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-fail": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-fail/-/is-fail-0.1.1.tgz", - "integrity": "sha1-jUEnvUTS5fsjneFU7qx8yPXxUmg=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-finite": { "version": "1.0.2", @@ -7455,29 +7157,34 @@ } }, "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "requires": { - "number-is-nan": "^1.0.0" + "is-extglob": "^2.1.1" } }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "is-installed-globally": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.1.0.tgz", + "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" } }, - "is-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", - "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", - "dev": true - }, "is-negated-glob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", @@ -7494,7 +7201,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -7503,7 +7209,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -7516,25 +7221,30 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, - "is-object": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "integrity": "sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc=", - "dev": true - }, "is-path-cwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", - "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.1.0.tgz", + "integrity": "sha512-Sc5j3/YnM8tDeyCsVeKlm/0p95075DyLmDEIkSgQ7mXkrOX+uTCtmQFm0CYzVyJwcCCmO3k8qfJt17SxQwB5Zw==", "dev": true }, "is-path-in-cwd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", - "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "dev": true, "requires": { - "is-path-inside": "^1.0.0" + "is-path-inside": "^2.1.0" + }, + "dependencies": { + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + } } }, "is-path-inside": { @@ -7556,44 +7266,16 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "requires": { "isobject": "^3.0.1" } }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, "is-redirect": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", "dev": true }, - "is-reference": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.1.tgz", - "integrity": "sha512-URlByVARcyP2E2GC7d3Ur702g3vqW391VKCHuF5Goo/M8IT97k4RU/+56OYImwDdX1J/V/VRxECE/wJqB0I2tg==", - "dev": true, - "requires": { - "@types/estree": "0.0.39" - } - }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", @@ -7621,22 +7303,7 @@ "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, - "is-svg": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", - "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", - "requires": { - "html-comment-regex": "^1.1.0" - } + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" }, "is-symbol": { "version": "1.0.2", @@ -7686,7 +7353,12 @@ "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", "dev": true }, "isarray": { @@ -7694,32 +7366,15 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "isbinaryfile": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-3.0.3.tgz", - "integrity": "sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw==", - "dev": true, - "requires": { - "buffer-alloc": "^1.2.0" - } - }, - "isbuffer": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/isbuffer/-/isbuffer-0.0.0.tgz", - "integrity": "sha1-OMFG2d9Si4v5sHAcPUPPEt8/w5s=", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" }, "isstream": { "version": "0.1.2", @@ -7728,24 +7383,116 @@ "dev": true }, "istanbul-lib-coverage": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", - "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", "dev": true }, "istanbul-lib-instrument": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", - "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", "dev": true, "requires": { - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", - "istanbul-lib-coverage": "^2.0.3", - "semver": "^5.5.0" + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.4.tgz", + "integrity": "sha512-QCHGyZEK0bfi9GR215QSm+NJwFKEShbtc7tfbUdLAEzn3kKhLDDZqvljn8rPZM9v8CEOhzL1nlYoO4r1ryl67w==", + "dev": true, + "requires": { + "handlebars": "^4.1.2" } }, "istextorbinary": { @@ -7760,4586 +7507,3523 @@ } }, "isutf8": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/isutf8/-/isutf8-2.0.2.tgz", - "integrity": "sha512-9lNbG6k+PE6vuFnPTHjhtX79/LDMQrXoFx1MOEjXXCyqFCSahWKAzuAb9G5ct+lfS12aQxNmC0tiZuyujvr4Uw==" - }, - "jmespath": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", - "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", - "dev": true - }, - "js-levenshtein": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", - "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", - "dev": true - }, - "js-string-escape": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", - "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/isutf8/-/isutf8-2.0.3.tgz", + "integrity": "sha512-ucppMz9qxhSceRJ8bP5SfdMdXukV718zXVgeSznBXkDGHbIcN5nptCPnosZhsN959eATLCD3751fo8tD86hM2Q==" }, - "jsdom": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-13.0.0.tgz", - "integrity": "sha512-Kmq4ASMNkgpY+YufE322EnIKoiz0UWY2DRkKlU7d5YrIW4xiVRhWFrZV1fr6w/ZNxQ50wGAH5gGRzydgnmkkvw==", + "jest": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-24.8.0.tgz", + "integrity": "sha512-o0HM90RKFRNWmAWvlyV8i5jGZ97pFwkeVoGvPW1EtLTgJc2+jcuqcbbqcSZLE/3f2S5pt0y2ZBETuhpWNl1Reg==", "dev": true, "requires": { - "abab": "^2.0.0", - "acorn": "^6.0.2", - "acorn-globals": "^4.3.0", - "array-equal": "^1.0.0", - "cssom": "^0.3.4", - "cssstyle": "^1.1.1", - "data-urls": "^1.0.1", - "domexception": "^1.0.1", - "escodegen": "^1.11.0", - "html-encoding-sniffer": "^1.0.2", - "nwsapi": "^2.0.9", - "parse5": "5.1.0", - "pn": "^1.1.0", - "request": "^2.88.0", - "request-promise-native": "^1.0.5", - "saxes": "^3.1.3", - "symbol-tree": "^3.2.2", - "tough-cookie": "^2.4.3", - "w3c-hr-time": "^1.0.1", - "w3c-xmlserializer": "^1.0.0", - "webidl-conversions": "^4.0.2", - "whatwg-encoding": "^1.0.5", - "whatwg-mimetype": "^2.2.0", - "whatwg-url": "^7.0.0", - "ws": "^6.1.0", - "xml-name-validator": "^3.0.0" + "import-local": "^2.0.0", + "jest-cli": "^24.8.0" }, "dependencies": { - "abab": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", - "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "acorn": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.4.tgz", - "integrity": "sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==", - "dev": true + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } }, - "aws4": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", - "dev": true + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } }, - "har-validator": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", - "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "ajv": "^6.5.5", - "har-schema": "^2.0.0" + "pump": "^3.0.0" } }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "jest-cli": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-24.8.0.tgz", + "integrity": "sha512-+p6J00jSMPQ116ZLlHJJvdf8wbjNbZdeSX9ptfHX06/MSNaXmKihQzx5vQcw0q2G6JsdVkUIdWbOWtSnaYs3yA==", + "dev": true, + "requires": { + "@jest/core": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "import-local": "^2.0.0", + "is-ci": "^2.0.0", + "jest-config": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "prompts": "^2.0.1", + "realpath-native": "^1.1.0", + "yargs": "^12.0.2" + } + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.0", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, - "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "p-try": "^2.0.0" } }, - "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true - } - } - }, - "jsdom-global": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/jsdom-global/-/jsdom-global-3.0.2.tgz", - "integrity": "sha1-a9KZwTsMRiay2iwDk81DhdYGrLk=", - "dev": true - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } }, - "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=", + "jest-changed-files": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-24.8.0.tgz", + "integrity": "sha512-qgANC1Yrivsq+UrLXsvJefBKVoCsKB0Hv+mBb6NMjjZ90wwxCDmU3hsCXBya30cH+LnPYjwgcU65i6yJ5Nfuug==", "dev": true, "requires": { - "jsonify": "~0.0.0" + "@jest/types": "^24.8.0", + "execa": "^1.0.0", + "throat": "^4.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } } }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true - }, - "json5": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", - "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "jest-config": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-24.8.0.tgz", + "integrity": "sha512-Czl3Nn2uEzVGsOeaewGWoDPD8GStxCpAe0zOYs2x2l0fZAgPbCr3uwUkgNKV3LwE13VXythM946cd5rdGkkBZw==", "dev": true, "requires": { - "minimist": "^1.2.0" + "@babel/core": "^7.1.0", + "@jest/test-sequencer": "^24.8.0", + "@jest/types": "^24.8.0", + "babel-jest": "^24.8.0", + "chalk": "^2.0.1", + "glob": "^7.1.1", + "jest-environment-jsdom": "^24.8.0", + "jest-environment-node": "^24.8.0", + "jest-get-type": "^24.8.0", + "jest-jasmine2": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "micromatch": "^3.1.10", + "pretty-format": "^24.8.0", + "realpath-native": "^1.1.0" } }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "jest-diff": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-24.8.0.tgz", + "integrity": "sha512-wxetCEl49zUpJ/bvUmIFjd/o52J+yWcoc5ZyPq4/W1LUKGEhRYDIbP1KcF6t+PvqNrGAFk4/JhtxDq/Nnzs66g==", "dev": true, "requires": { - "graceful-fs": "^4.1.6" + "chalk": "^2.0.1", + "diff-sequences": "^24.3.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.0" } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", - "dev": true - }, - "jsonschema": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz", - "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "jest-docblock": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-24.3.0.tgz", + "integrity": "sha512-nlANmF9Yq1dufhFlKG9rasfQlrY7wINJbo3q01tu56Jv5eBU5jirylhF2O5ZBnLxzOVBGRDz/9NAwNyBtG4Nyg==", "dev": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "detect-newline": "^2.1.0" } }, - "just-debounce": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", - "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", - "dev": true + "jest-each": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-24.8.0.tgz", + "integrity": "sha512-NrwK9gaL5+XgrgoCsd9svsoWdVkK4gnvyhcpzd6m487tXHqIdYeykgq3MKI1u4I+5Zf0tofr70at9dWJDeb+BA==", + "dev": true, + "requires": { + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.8.0", + "jest-util": "^24.8.0", + "pretty-format": "^24.8.0" + } }, - "karma": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/karma/-/karma-3.1.1.tgz", - "integrity": "sha512-NetT3wPCQMNB36uiL9LLyhrOt8SQwrEKt0xD3+KpTCfm0VxVyUJdPL5oTq2Ic5ouemgL/Iz4wqXEbF3zea9kQQ==", - "dev": true, - "requires": { - "bluebird": "^3.3.0", - "body-parser": "^1.16.1", - "chokidar": "^2.0.3", - "colors": "^1.1.0", - "combine-lists": "^1.0.0", - "connect": "^3.6.0", - "core-js": "^2.2.0", - "di": "^0.0.1", - "dom-serialize": "^2.2.0", - "expand-braces": "^0.1.1", - "glob": "^7.1.1", - "graceful-fs": "^4.1.2", - "http-proxy": "^1.13.0", - "isbinaryfile": "^3.0.0", - "lodash": "^4.17.4", - "log4js": "^3.0.0", - "mime": "^2.3.1", - "minimatch": "^3.0.2", - "optimist": "^0.6.1", - "qjobs": "^1.1.4", - "range-parser": "^1.2.0", - "rimraf": "^2.6.0", - "safe-buffer": "^5.0.1", - "socket.io": "2.1.1", - "source-map": "^0.6.1", - "tmp": "0.0.33", - "useragent": "2.2.1" + "jest-environment-jsdom": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-24.8.0.tgz", + "integrity": "sha512-qbvgLmR7PpwjoFjM/sbuqHJt/NCkviuq9vus9NBn/76hhSidO+Z6Bn9tU8friecegbJL8gzZQEMZBQlFWDCwAQ==", + "dev": true, + "requires": { + "@jest/environment": "^24.8.0", + "@jest/fake-timers": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-util": "^24.8.0", + "jsdom": "^11.5.1" }, "dependencies": { - "colors": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz", - "integrity": "sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==", + "acorn": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", + "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", "dev": true }, - "mime": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz", - "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==", + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "^2.0.0", + "acorn": "^5.5.3", + "acorn-globals": "^4.1.0", + "array-equal": "^1.0.0", + "cssom": ">= 0.3.2 < 0.4.0", + "cssstyle": "^1.0.0", + "data-urls": "^1.0.0", + "domexception": "^1.0.1", + "escodegen": "^1.9.1", + "html-encoding-sniffer": "^1.0.2", + "left-pad": "^1.3.0", + "nwsapi": "^2.0.7", + "parse5": "4.0.0", + "pn": "^1.1.0", + "request": "^2.87.0", + "request-promise-native": "^1.0.5", + "sax": "^1.2.4", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.3.4", + "w3c-hr-time": "^1.0.1", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.3", + "whatwg-mimetype": "^2.1.0", + "whatwg-url": "^6.4.1", + "ws": "^5.2.0", + "xml-name-validator": "^3.0.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } } } }, - "karma-browserify": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/karma-browserify/-/karma-browserify-5.3.0.tgz", - "integrity": "sha512-EMaUd1RNyQVGTETI80dtX/fEtYs57/A5sl3rClvzJFImPW1s3EtsbESfqNtk7/OkzfYuAHLh4RSZSSbVgvhNdQ==", + "jest-environment-node": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-24.8.0.tgz", + "integrity": "sha512-vIGUEScd1cdDgR6sqn2M08sJTRLQp6Dk/eIkCeO4PFHxZMOgy+uYLPMC4ix3PEfM5Au/x3uQ/5Tl0DpXXZsJ/Q==", "dev": true, "requires": { - "convert-source-map": "^1.1.3", - "hat": "^0.0.3", - "js-string-escape": "^1.0.0", - "lodash": "^4.17.10", - "minimatch": "^3.0.0", - "os-shim": "^0.1.3" - } - }, - "karma-browserstack-launcher": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/karma-browserstack-launcher/-/karma-browserstack-launcher-1.4.0.tgz", - "integrity": "sha512-bUQK84U+euDfOUfEjcF4IareySMOBNRLrrl9q6cttIe8f011Ir6olLITTYMOJDcGY58wiFIdhPHSPd9Pi6+NfQ==", - "dev": true, - "requires": { - "browserstack": "~1.5.1", - "browserstacktunnel-wrapper": "~2.0.2", - "q": "~1.5.0" + "@jest/environment": "^24.8.0", + "@jest/fake-timers": "^24.8.0", + "@jest/types": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-util": "^24.8.0" } }, - "karma-chrome-launcher": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-2.2.0.tgz", - "integrity": "sha512-uf/ZVpAabDBPvdPdveyk1EPgbnloPvFFGgmRhYLTDH7gEB4nZdSBk8yTU47w1g/drLSx5uMOkjKk7IWKfWg/+w==", - "dev": true, - "requires": { - "fs-access": "^1.0.0", - "which": "^1.2.1" - } + "jest-get-type": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-24.8.0.tgz", + "integrity": "sha512-RR4fo8jEmMD9zSz2nLbs2j0zvPpk/KCEz3a62jJWbd2ayNo0cb+KFRxPHVhE4ZmgGJEQp0fosmNz84IfqM8cMQ==", + "dev": true }, - "karma-electron": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/karma-electron/-/karma-electron-6.0.0.tgz", - "integrity": "sha1-yCTdpG9J9/x0S2ubYOZBOXmUc2I=", + "jest-haste-map": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-24.8.0.tgz", + "integrity": "sha512-ZBPRGHdPt1rHajWelXdqygIDpJx8u3xOoLyUBWRW28r3tagrgoepPrzAozW7kW9HrQfhvmiv1tncsxqHJO1onQ==", "dev": true, "requires": { - "combine-source-map": "~0.8.0", - "commander": "~2.9.0", - "convert-source-map": "~1.2.0", - "js-string-escape": "~1.0.0", - "minstache": "~1.2.0", - "xtend": "~4.0.1" + "@jest/types": "^24.8.0", + "anymatch": "^2.0.0", + "fb-watchman": "^2.0.0", + "fsevents": "^1.2.7", + "graceful-fs": "^4.1.15", + "invariant": "^2.2.4", + "jest-serializer": "^24.4.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "micromatch": "^3.1.10", + "sane": "^4.0.3", + "walker": "^1.0.7" }, "dependencies": { - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "dev": true, - "requires": { - "graceful-readlink": ">= 1.0.0" - } - }, - "convert-source-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.2.0.tgz", - "integrity": "sha1-RMCMJQbxD7PKb9iI1aNETPjWpmk=", + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", "dev": true } } }, - "karma-firefox-launcher": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.1.0.tgz", - "integrity": "sha512-LbZ5/XlIXLeQ3cqnCbYLn+rOVhuMIK9aZwlP6eOLGzWdo1UVp7t6CN3DP4SafiRLjexKwHeKHDm0c38Mtd3VxA==", - "dev": true - }, - "karma-mocha": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/karma-mocha/-/karma-mocha-1.3.0.tgz", - "integrity": "sha1-7qrH/8DiAetjxGdEDStpx883eL8=", + "jest-jasmine2": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-24.8.0.tgz", + "integrity": "sha512-cEky88npEE5LKd5jPpTdDCLvKkdyklnaRycBXL6GNmpxe41F0WN44+i7lpQKa/hcbXaQ+rc9RMaM4dsebrYong==", "dev": true, "requires": { - "minimist": "1.2.0" + "@babel/traverse": "^7.1.0", + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "co": "^4.6.0", + "expect": "^24.8.0", + "is-generator-fn": "^2.0.0", + "jest-each": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "pretty-format": "^24.8.0", + "throat": "^4.0.0" } }, - "karma-rollup-preprocessor": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/karma-rollup-preprocessor/-/karma-rollup-preprocessor-6.1.0.tgz", - "integrity": "sha512-/sps47osPwmtHpiod3lQWvhJXA1g0aSij8O4VyP2lv5PFEIB7Nft2k8yCSVGdO+dbvmpfXJ85cpqklUah4VGhw==", + "jest-leak-detector": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-24.8.0.tgz", + "integrity": "sha512-cG0yRSK8A831LN8lIHxI3AblB40uhv0z+SsQdW3GoMMVcK+sJwrIIyax5tu3eHHNJ8Fu6IMDpnLda2jhn2pD/g==", "dev": true, "requires": { - "chokidar": "^2.0.0" + "pretty-format": "^24.8.0" } }, - "keypress": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz", - "integrity": "sha1-SjGI1CkbZrT2XtuZ+AaqmuKTWSo=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "jest-localstorage-mock": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jest-localstorage-mock/-/jest-localstorage-mock-2.4.0.tgz", + "integrity": "sha512-/mC1JxnMeuIlAaQBsDMilskC/x/BicsQ/BXQxEOw+5b1aGZkkOAqAF3nu8yq449CpzGtp5jJ5wCmDNxLgA2m6A==", "dev": true }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "jest-matcher-utils": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-24.8.0.tgz", + "integrity": "sha512-lex1yASY51FvUuHgm0GOVj7DCYEouWSlIYmCW7APSqB9v8mXmKSn5+sWVF0MhuASG0bnYY106/49JU1FZNl5hw==", "dev": true, "requires": { - "graceful-fs": "^4.1.9" + "chalk": "^2.0.1", + "jest-diff": "^24.8.0", + "jest-get-type": "^24.8.0", + "pretty-format": "^24.8.0" } }, - "labeled-stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz", - "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==", + "jest-message-util": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-24.8.0.tgz", + "integrity": "sha512-p2k71rf/b6ns8btdB0uVdljWo9h0ovpnEe05ZKWceQGfXYr4KkzgKo3PBi8wdnd9OtNh46VpNIJynUn/3MKm1g==", "dev": true, "requires": { - "inherits": "^2.0.1", - "isarray": "^2.0.4", - "stream-splicer": "^2.0.0" + "@babel/code-frame": "^7.0.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/stack-utils": "^1.0.1", + "chalk": "^2.0.1", + "micromatch": "^3.1.10", + "slash": "^2.0.0", + "stack-utils": "^1.0.1" }, "dependencies": { - "isarray": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz", - "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA==", + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true } } }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "latest-version": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-2.0.0.tgz", - "integrity": "sha1-VvjWE5YghHuAF/jx9NeOIRMkFos=", + "jest-mock": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-24.8.0.tgz", + "integrity": "sha512-6kWugwjGjJw+ZkK4mDa0Df3sDlUTsV47MSrT0nGQ0RBWJbpODDQ8MHDVtGtUYBne3IwZUhtB7elxHspU79WH3A==", "dev": true, "requires": { - "package-json": "^2.0.0" + "@jest/types": "^24.8.0" } }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true + "jest-pnp-resolver": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.1.tgz", + "integrity": "sha512-pgFw2tm54fzgYvc/OHrnysABEObZCUNFnhjoRjaVOCN8NYc032/gVjPaHD4Aq6ApkSieWtfKAFQtmDKAmhupnQ==", + "dev": true }, - "lazy-req": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-1.1.0.tgz", - "integrity": "sha1-va6+rTD42CQDnODOFJ1Nqge6H6w=", + "jest-regex-util": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-24.3.0.tgz", + "integrity": "sha512-tXQR1NEOyGlfylyEjg1ImtScwMq8Oh3iJbGTjN7p0J23EuVX1MA8rwU69K4sLbCmwzgCUbVkm0FkSF9TdzOhtg==", "dev": true }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "jest-resolve": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-24.8.0.tgz", + "integrity": "sha512-+hjSzi1PoRvnuOICoYd5V/KpIQmkAsfjFO71458hQ2Whi/yf1GDeBOFj8Gxw4LrApHsVJvn5fmjcPdmoUHaVKw==", "dev": true, "requires": { - "readable-stream": "^2.0.5" + "@jest/types": "^24.8.0", + "browser-resolve": "^1.11.3", + "chalk": "^2.0.1", + "jest-pnp-resolver": "^1.2.1", + "realpath-native": "^1.1.0" } }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "jest-resolve-dependencies": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-24.8.0.tgz", + "integrity": "sha512-hyK1qfIf/krV+fSNyhyJeq3elVMhK9Eijlwy+j5jqmZ9QsxwKBiP6qukQxaHtK8k6zql/KYWwCTQ+fDGTIJauw==", "dev": true, "requires": { - "invert-kv": "^1.0.0" + "@jest/types": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-snapshot": "^24.8.0" } }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "jest-runner": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-24.8.0.tgz", + "integrity": "sha512-utFqC5BaA3JmznbissSs95X1ZF+d+4WuOWwpM9+Ak356YtMhHE/GXUondZdcyAAOTBEsRGAgH/0TwLzfI9h7ow==", "dev": true, "requires": { - "flush-write-stream": "^1.0.2" + "@jest/console": "^24.7.1", + "@jest/environment": "^24.8.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "chalk": "^2.4.2", + "exit": "^0.1.2", + "graceful-fs": "^4.1.15", + "jest-config": "^24.8.0", + "jest-docblock": "^24.3.0", + "jest-haste-map": "^24.8.0", + "jest-jasmine2": "^24.8.0", + "jest-leak-detector": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-resolve": "^24.8.0", + "jest-runtime": "^24.8.0", + "jest-util": "^24.8.0", + "jest-worker": "^24.6.0", + "source-map-support": "^0.5.6", + "throat": "^4.0.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + } } }, - "level-blobs": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/level-blobs/-/level-blobs-0.1.7.tgz", - "integrity": "sha1-mrm5e7mfHtv594o0M+Ie1WOGva8=", + "jest-runtime": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-24.8.0.tgz", + "integrity": "sha512-Mq0aIXhvO/3bX44ccT+czU1/57IgOMyy80oM0XR/nyD5zgBcesF84BPabZi39pJVA6UXw+fY2Q1N+4BiVUBWOA==", "dev": true, "requires": { - "level-peek": "1.0.6", - "once": "^1.3.0", - "readable-stream": "^1.0.26-4" + "@jest/console": "^24.7.1", + "@jest/environment": "^24.8.0", + "@jest/source-map": "^24.3.0", + "@jest/transform": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/yargs": "^12.0.2", + "chalk": "^2.0.1", + "exit": "^0.1.2", + "glob": "^7.1.3", + "graceful-fs": "^4.1.15", + "jest-config": "^24.8.0", + "jest-haste-map": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-mock": "^24.8.0", + "jest-regex-util": "^24.3.0", + "jest-resolve": "^24.8.0", + "jest-snapshot": "^24.8.0", + "jest-util": "^24.8.0", + "jest-validate": "^24.8.0", + "realpath-native": "^1.1.0", + "slash": "^2.0.0", + "strip-bom": "^3.0.0", + "yargs": "^12.0.2" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "level-filesystem": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/level-filesystem/-/level-filesystem-1.2.0.tgz", - "integrity": "sha1-oArKmRnEpN+v3KaoEI0iWq3/Y7M=", - "dev": true, - "requires": { - "concat-stream": "^1.4.4", - "errno": "^0.1.1", - "fwd-stream": "^1.0.4", - "level-blobs": "^0.1.7", - "level-peek": "^1.0.6", - "level-sublevel": "^5.2.0", - "octal": "^1.0.0", - "once": "^1.3.0", - "xtend": "^2.2.0" - }, - "dependencies": { - "xtend": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.2.0.tgz", - "integrity": "sha1-7vax8ZjByN6vrYsXZaBNrUoBxak=", - "dev": true - } - } - }, - "level-fix-range": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-1.0.2.tgz", - "integrity": "sha1-vxW5Fa422EcMgh6IPd95zRZCCCg=", - "dev": true - }, - "level-hooks": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/level-hooks/-/level-hooks-4.5.0.tgz", - "integrity": "sha1-G5rmGSKTDzMF0aYfxNg8gQLA3ZM=", - "dev": true, - "requires": { - "string-range": "~1.2" - } - }, - "level-js": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/level-js/-/level-js-2.2.4.tgz", - "integrity": "sha1-vAVfQYBjXUSJtWHJSG+jcOjBFpc=", - "dev": true, - "requires": { - "abstract-leveldown": "~0.12.0", - "idb-wrapper": "^1.5.0", - "isbuffer": "~0.0.0", - "ltgt": "^2.1.2", - "typedarray-to-buffer": "~1.0.0", - "xtend": "~2.1.2" - }, - "dependencies": { - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "object-keys": "~0.4.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } - } - } - }, - "level-peek": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/level-peek/-/level-peek-1.0.6.tgz", - "integrity": "sha1-vsUccqgu5GTTNkNMfIdsP8vM538=", - "dev": true, - "requires": { - "level-fix-range": "~1.0.2" - } - }, - "level-sublevel": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/level-sublevel/-/level-sublevel-5.2.3.tgz", - "integrity": "sha1-dEwSxy0ucr543eO5tc2E1iGRQTo=", - "dev": true, - "requires": { - "level-fix-range": "2.0", - "level-hooks": ">=4.4.0 <5", - "string-range": "~1.2.1", - "xtend": "~2.0.4" - }, - "dependencies": { - "clone": { - "version": "0.1.19", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.1.19.tgz", - "integrity": "sha1-YT+2hjmyaklKxTJT4Vsaa9iK2oU=", - "dev": true }, - "level-fix-range": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/level-fix-range/-/level-fix-range-2.0.0.tgz", - "integrity": "sha1-xBfWIVlEIVGhnZojZ4aPFyTC1Ug=", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "clone": "~0.1.9" + "locate-path": "^3.0.0" } }, - "object-keys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", - "integrity": "sha1-zd7AKZiwkb5CvxA1rjLknxy26mc=", + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "foreach": "~2.0.1", - "indexof": "~0.0.1", - "is": "~0.2.6" + "pump": "^3.0.0" } }, - "xtend": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", - "integrity": "sha1-XqZXptukRwacLlnFihE4ywxebO4=", + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "is-object": "~0.1.2", - "object-keys": "~0.2.0" + "invert-kv": "^2.0.0" } - } - } - }, - "levelup": { - "version": "0.18.6", - "resolved": "https://registry.npmjs.org/levelup/-/levelup-0.18.6.tgz", - "integrity": "sha1-5qAcsIlhbI7MApHCqb0/DETj5es=", - "dev": true, - "requires": { - "bl": "~0.8.1", - "deferred-leveldown": "~0.2.0", - "errno": "~0.1.1", - "prr": "~0.0.0", - "readable-stream": "~1.0.26", - "semver": "~2.3.1", - "xtend": "~3.0.0" - }, - "dependencies": { - "bl": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.8.2.tgz", - "integrity": "sha1-yba8oI0bwuoA/Ir7Txpf0eHGbk4=", + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "readable-stream": "~1.0.26" + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } }, - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, - "semver": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-2.3.2.tgz", - "integrity": "sha1-uYSPJdbPNjMwc+ye+IVtQvEjPlI=", + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true }, - "xtend": { + "strip-bom": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-3.0.0.tgz", - "integrity": "sha1-XM50B7r2Qsunvs2laBEcST9ZZlo=", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } + "jest-serializer": { + "version": "24.4.0", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-24.4.0.tgz", + "integrity": "sha512-k//0DtglVstc1fv+GY/VHDIjrtNjdYvYjMlbLUed4kxrE92sIUewOi5Hj3vrpB8CXfkJntRPDRjCrCvUhBdL8Q==", + "dev": true }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "jest-snapshot": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-24.8.0.tgz", + "integrity": "sha512-5ehtWoc8oU9/cAPe6fez6QofVJLBKyqkY2+TlKTOf0VllBB/mqUNdARdcjlZrs9F1Cv+/HKoCS/BknT0+tmfPg==", "dev": true, "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" + "@babel/types": "^7.0.0", + "@jest/types": "^24.8.0", + "chalk": "^2.0.1", + "expect": "^24.8.0", + "jest-diff": "^24.8.0", + "jest-matcher-utils": "^24.8.0", + "jest-message-util": "^24.8.0", + "jest-resolve": "^24.8.0", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^24.8.0", + "semver": "^5.5.0" } }, - "listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha1-hMinKrWcRyUyFIDJdeZQg0LnCTc=", - "dev": true - }, - "load-json-file": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", - "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "jest-util": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-24.8.0.tgz", + "integrity": "sha512-DYZeE+XyAnbNt0BG1OQqKy/4GVLPtzwGx5tsnDrFcax36rVE3lTA5fbvgmbVPUZf9w77AJ8otqR4VBbfFJkUZA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" + "@jest/console": "^24.7.1", + "@jest/fake-timers": "^24.8.0", + "@jest/source-map": "^24.3.0", + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "callsites": "^3.0.0", + "chalk": "^2.0.1", + "graceful-fs": "^4.1.15", + "is-ci": "^2.0.0", + "mkdirp": "^0.5.1", + "slash": "^2.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } } }, - "locate-character": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-2.0.5.tgz", - "integrity": "sha512-n2GmejDXtOPBAZdIiEFy5dJ5N38xBCXLNOtw2WpB9kGh6pnrEuKlwYI+Tkpofc4wDtVXHtoAOJaMRlYG/oYaxg==", - "dev": true - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "jest-validate": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-24.8.0.tgz", + "integrity": "sha512-+/N7VOEMW1Vzsrk3UWBDYTExTPwf68tavEPKDnJzrC6UlHtUDU/fuEdXqFoHzv9XnQ+zW6X3qMZhJ3YexfeLDA==", "dev": true, "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" + "@jest/types": "^24.8.0", + "camelcase": "^5.0.0", + "chalk": "^2.0.1", + "jest-get-type": "^24.8.0", + "leven": "^2.1.0", + "pretty-format": "^24.8.0" }, "dependencies": { - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true } } }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true + "jest-watcher": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.8.0.tgz", + "integrity": "sha512-SBjwHt5NedQoVu54M5GEx7cl7IGEFFznvd/HNT8ier7cCAx/Qgu9ZMlaTQkvK22G1YOpcWBLQPFSImmxdn3DAw==", + "dev": true, + "requires": { + "@jest/test-result": "^24.8.0", + "@jest/types": "^24.8.0", + "@types/yargs": "^12.0.9", + "ansi-escapes": "^3.0.0", + "chalk": "^2.0.1", + "jest-util": "^24.8.0", + "string-length": "^2.0.0" + } }, - "lodash._reinterpolate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", - "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", - "dev": true + "jest-worker": { + "version": "24.6.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.6.0.tgz", + "integrity": "sha512-jDwgW5W9qGNvpI1tNnvajh0a5IE/PuGLFmHk6aR/BZFz8tSgGw17GsDPXAJ6p91IvYDjOw8GpFbvvZGAK+DPQQ==", + "dev": true, + "requires": { + "merge-stream": "^1.0.1", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "jmespath": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", + "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", "dev": true }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "js-levenshtein": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", + "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==", "dev": true }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8=", - "dev": true + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, - "log4js": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-3.0.6.tgz", - "integrity": "sha512-ezXZk6oPJCWL483zj64pNkMuY/NcRX5MPiB0zE6tjZM137aeusrOnW1ecxgF9cmwMWkBMhjteQxBPoZBh9FDxQ==", + "jsdom": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-15.0.0.tgz", + "integrity": "sha512-rJnHm7CHyIj4tDyz9VaCt0f0P0nEh/wEmMfwp9mMixy+L/r8OW/BNcgmIlfZuBBnVQS3eRBpvd/qM3R7vr7e3A==", "dev": true, "requires": { - "circular-json": "^0.5.5", - "date-format": "^1.2.0", - "debug": "^3.1.0", - "rfdc": "^1.1.2", - "streamroller": "0.7.0" + "abab": "^2.0.0", + "acorn": "^6.0.4", + "acorn-globals": "^4.3.0", + "array-equal": "^1.0.0", + "cssom": "^0.3.4", + "cssstyle": "^1.1.1", + "data-urls": "^1.1.0", + "domexception": "^1.0.1", + "escodegen": "^1.11.0", + "html-encoding-sniffer": "^1.0.2", + "nwsapi": "^2.1.3", + "parse5": "5.1.0", + "pn": "^1.1.0", + "request": "^2.88.0", + "request-promise-native": "^1.0.5", + "saxes": "^3.1.9", + "symbol-tree": "^3.2.2", + "tough-cookie": "^2.5.0", + "w3c-hr-time": "^1.0.1", + "w3c-xmlserializer": "^1.1.2", + "webidl-conversions": "^4.0.2", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^7.0.0", + "ws": "^6.1.2", + "xml-name-validator": "^3.0.0" } }, - "lolex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.0.0.tgz", - "integrity": "sha512-hcnW80h3j2lbUfFdMArd5UPA/vxZJ+G8vobd+wg3nVEQA0EigStbYcrG030FJxL6xiDDPEkoMatV9xIh5OecQQ==", + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "longest": { + "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", "dev": true, "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" + "minimist": "^1.2.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } } }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", "dev": true, "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "graceful-fs": "^4.1.6" } }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", "dev": true }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", + "jsonschema": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.4.tgz", + "integrity": "sha512-lz1nOH69GbsVHeVgEdvyavc/33oymY1AZwtePMiMj4HZPMbP5OIKK3zT9INMWjwua/V4Z4yq7wSlBbSG+g4AEw==" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "dev": true, "requires": { - "es5-ext": "~0.10.2" + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" } }, - "ltgt": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ltgt/-/ltgt-2.2.1.tgz", - "integrity": "sha1-81ypHEk/e3PaDgdJUwTxezH4fuU=", + "just-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", + "integrity": "sha1-h/zPrv/AtozRnVX2cilD+SnqNeo=", "dev": true }, - "magic-string": { - "version": "0.25.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.1.tgz", - "integrity": "sha512-sCuTz6pYom8Rlt4ISPFn6wuFodbKMIHUMv4Qko9P17dpxb7s52KJTmRuZZqHdGmLCK9AOcDare039nRIcfdkEg==", - "dev": true, - "requires": { - "sourcemap-codec": "^1.4.1" - } + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" }, - "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "make-error-cause": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/make-error-cause/-/make-error-cause-1.2.2.tgz", - "integrity": "sha1-3wOI/NCzeBbf8KX7gQiTl3fcvJ0=", + "last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha1-RblpQsF7HHnHchmCWbqUO+v4yls=", "dev": true, "requires": { - "make-error": "^1.2.0" + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" } }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "dev": true, "requires": { - "kind-of": "^6.0.2" + "package-json": "^4.0.0" } }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", - "dev": true - }, - "map-visit": { + "lazystream": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "dev": true, "requires": { - "object-visit": "^1.0.0" + "readable-stream": "^2.0.5" } }, - "marked": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-0.4.0.tgz", - "integrity": "sha512-tMsdNBgOsrUophCAFQl0XPe6Zqk/uy9gnue+jIIKhykO51hxyu6uNx7zBPy0+y/WKYVZZMspV9YeXLNdKk+iYw==", - "dev": true - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", - "dev": true, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" + "invert-kv": "^1.0.0" } }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", "dev": true, "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "flush-write-stream": "^1.0.2" } }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", "dev": true }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "mimic-fn": "^1.0.0" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, - "memoizee": { - "version": "0.4.12", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.12.tgz", - "integrity": "sha512-sprBu6nwxBWBvBOh5v2jcsGqiGLlL2xr2dLub3vR8dnE8YB17omwtm/0NSHl8jjNbcsJd5GMWJAnTSVe/O0Wfg==", + "liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", "dev": true, "requires": { - "d": "1", - "es5-ext": "^0.10.30", - "es6-weak-map": "^2.0.2", - "event-emitter": "^0.3.5", - "is-promise": "^2.1", - "lru-queue": "0.1", - "next-tick": "1", - "timers-ext": "^0.1.2" - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" } }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, - "midware": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/midware/-/midware-0.1.7.tgz", - "integrity": "sha1-gnbsr4VavB+7Yhy1rdgA2+JFpFY=", + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true }, - "midware-pool": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/midware-pool/-/midware-pool-0.1.2.tgz", - "integrity": "sha1-rtAKf5kn1xpHuf7B2ty+lNwLuQo=", + "loader-utils": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", + "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "dev": true, "requires": { - "midware": "^0.1.7" + "big.js": "^5.2.2", + "emojis-list": "^2.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } } }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "requires": { - "bn.js": "^4.0.0", - "brorand": "^1.0.1" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, - "mime-types": { - "version": "2.1.19", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz", - "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==", - "requires": { - "mime-db": "~1.35.0" - }, - "dependencies": { - "mime-db": { - "version": "1.35.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz", - "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==" - } - } + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", "dev": true }, - "minimalistic-assert": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", "dev": true }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "lodash.has": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", + "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=", "dev": true }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } + "lodash.ismatch": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz", + "integrity": "sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=", + "dev": true }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "lodash.merge": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.1.tgz", + "integrity": "sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ==", "dev": true }, - "minimist-options": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", - "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", + "dev": true + }, + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", "dev": true, "requires": { - "arrify": "^1.0.1", - "is-plain-obj": "^1.1.0" + "lodash._reinterpolate": "~3.0.0", + "lodash.templatesettings": "^4.0.0" } }, - "minstache": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minstache/-/minstache-1.2.0.tgz", - "integrity": "sha1-/xzEA6woRPaNvxjGYhKb5+sO/EE=", + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", "dev": true, "requires": { - "commander": "1.0.4" - }, - "dependencies": { - "commander": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/commander/-/commander-1.0.4.tgz", - "integrity": "sha1-Xt6xruI8T7VBprcNaSq+8ZZpotM=", - "dev": true, - "requires": { - "keypress": "0.1.x" - } - } + "lodash._reinterpolate": "~3.0.0" } }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } + "js-tokens": "^3.0.0 || ^4.0.0" } }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, - "mocha": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", - "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "dev": true + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", "dev": true, "requires": { - "browser-stdout": "1.3.1", - "commander": "2.15.1", - "debug": "3.1.0", - "diff": "3.5.0", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.5", - "he": "1.1.1", - "minimatch": "3.0.4", - "mkdirp": "0.5.1", - "supports-color": "5.4.0" - }, - "dependencies": { - "commander": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", - "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", - "dev": true - }, - "supports-color": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", - "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "pify": "^3.0.0" } }, - "modify-values": { + "make-error": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", + "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" + }, + "make-iterator": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", - "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", - "dev": true + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", + "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", + "dev": true, + "requires": { + "kind-of": "^6.0.2" + } }, - "module-deps": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-4.1.1.tgz", - "integrity": "sha1-IyFYM/HaE/1gbMuAh7RIUty4If0=", + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", "dev": true, "requires": { - "JSONStream": "^1.0.3", - "browser-resolve": "^1.7.0", - "cached-path-relative": "^1.0.0", - "concat-stream": "~1.5.0", - "defined": "^1.0.0", - "detective": "^4.0.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.3", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" + "tmpl": "1.0.x" } }, - "mount-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mount-point/-/mount-point-3.0.0.tgz", - "integrity": "sha1-Zly57evoDREOZY21bDHQrvUaj5c=", + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { - "@sindresorhus/df": "^1.0.1", - "pify": "^2.3.0", - "pinkie-promise": "^2.0.1" - }, - "dependencies": { - "@sindresorhus/df": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@sindresorhus/df/-/df-1.0.1.tgz", - "integrity": "sha1-xptm9S9vzdKHyAffIQMF2694UA0=", - "dev": true - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "p-defer": "^1.0.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, - "mute-stdout": { + "map-obj": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", "dev": true }, - "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", - "dev": true, - "optional": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "object-visit": "^1.0.0" } }, - "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", - "dev": true - }, - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "marked": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.4.0.tgz", + "integrity": "sha512-tMsdNBgOsrUophCAFQl0XPe6Zqk/uy9gnue+jIIKhykO51hxyu6uNx7zBPy0+y/WKYVZZMspV9YeXLNdKk+iYw==", "dev": true }, - "nise": { - "version": "1.4.10", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.10.tgz", - "integrity": "sha512-sa0RRbj53dovjc7wombHmVli9ZihXbXCQ2uH3TNm03DyvOSIQbxg+pbqDKrk2oxMK1rtLGVlKxcB9rrc6X5YjA==", + "matchdep": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", + "integrity": "sha1-xvNINKDY28OzfCfui7yyfHd1WC4=", "dev": true, "requires": { - "@sinonjs/formatio": "^3.1.0", - "@sinonjs/text-encoding": "^0.7.1", - "just-extend": "^4.0.2", - "lolex": "^2.3.2", - "path-to-regexp": "^1.7.0" + "findup-sync": "^2.0.0", + "micromatch": "^3.0.4", + "resolve": "^1.4.0", + "stack-trace": "0.0.10" }, "dependencies": { - "@sinonjs/formatio": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.1.tgz", - "integrity": "sha512-tsHvOB24rvyvV2+zKMmPkZ7dXX6LSLKZ7aOtXY6Edklp0uRcgGpOsQTTGTcWViFyx4uhWc6GV8QdnALbIbIdeQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1", - "@sinonjs/samsam": "^3.1.0" - } - }, - "@sinonjs/samsam": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.0.tgz", - "integrity": "sha512-beHeJM/RRAaLLsMJhsCvHK31rIqZuobfPLa/80yGH5hnD8PV1hyh9xJBJNFfNmO7yWqm+zomijHsXpI6iTQJfQ==", + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", "dev": true, "requires": { - "@sinonjs/commons": "^1.0.2", - "array-from": "^2.1.1", - "lodash": "^4.17.11" + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" } }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "just-extend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.0.2.tgz", - "integrity": "sha512-FrLwOgm+iXrPV+5zDU6Jqu4gCRXbWEQg2O3SKONsWE4w7AXFRkryS53bpWdaL9cNol+AmR3AEYz6kn+o0fCPnw==", - "dev": true - }, - "lolex": { - "version": "2.7.5", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", - "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", - "dev": true - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "isarray": "0.0.1" + "is-extglob": "^2.1.0" } } } }, - "node-releases": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.10.tgz", - "integrity": "sha512-KbUPCpfoBvb3oBkej9+nrU0/7xPlVhmhhUJ1PZqwIP5/1dJkRWKWD3OONjo6M2J7tSCBtDCumLwwqeI+DWWaLQ==", + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { - "semver": "^5.3.0" + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "node-status-codes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/node-status-codes/-/node-status-codes-1.0.0.tgz", - "integrity": "sha1-WuVUHQJGRdMqWPzdyc7s6nrjrC8=", + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "requires": { - "hosted-git-info": "^2.1.4", - "is-builtin-module": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" + "mimic-fn": "^1.0.0" } }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "errno": "^0.1.3", + "readable-stream": "^2.0.1" } }, - "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", "dev": true, "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", "object-assign": "^4.0.1", - "prepend-http": "^1.0.0", - "query-string": "^4.1.0", - "sort-keys": "^1.0.0" + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } } }, - "now-and-later": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", - "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", - "dev": true, - "requires": { - "once": "^1.3.2" - } + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true }, - "npm-run-all": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", - "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", "dev": true, "requires": { - "ansi-styles": "^3.2.1", - "chalk": "^2.4.1", - "cross-spawn": "^6.0.5", - "memorystream": "^0.3.1", - "minimatch": "^3.0.4", - "pidtree": "^0.3.0", - "read-pkg": "^3.0.0", - "shell-quote": "^1.6.1", - "string.prototype.padend": "^3.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } + "readable-stream": "^2.0.1" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, + "merge2": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.2.3.tgz", + "integrity": "sha512-gdUU1Fwj5ep4kplwcmftruWofEFt6lfpkkr3h860CXbAB9c3hGb55EOL2ali0Td5oebvW0E1+3Sr+Ur7XfKpRA==" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "requires": { - "path-key": "^2.0.0" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" } }, - "nugget": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nugget/-/nugget-2.0.1.tgz", - "integrity": "sha1-IBCVpIfhrTYIGzQy+jytpPjQcbA=", + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "debug": "^2.1.3", - "minimist": "^1.1.0", - "pretty-bytes": "^1.0.2", - "progress-stream": "^1.1.0", - "request": "^2.45.0", - "single-line-log": "^1.1.2", - "throttleit": "0.0.2" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, - "null-check": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", - "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", - "dev": true - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", "dev": true }, - "nwsapi": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz", - "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==", + "mime-db": { + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", "dev": true }, - "nyc": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.3.0.tgz", - "integrity": "sha512-P+FwIuro2aFG6B0Esd9ZDWUd51uZrAEoGutqZxzrVmYl3qSfkLgcQpBPBjtDFsUQLFY1dvTQJPOyeqr8S9GF8w==", + "mime-types": { + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "dev": true, "requires": { - "archy": "^1.0.0", - "arrify": "^1.0.1", - "caching-transform": "^3.0.1", - "convert-source-map": "^1.6.0", - "find-cache-dir": "^2.0.0", - "find-up": "^3.0.0", - "foreground-child": "^1.5.6", - "glob": "^7.1.3", - "istanbul-lib-coverage": "^2.0.3", - "istanbul-lib-hook": "^2.0.3", - "istanbul-lib-instrument": "^3.1.0", - "istanbul-lib-report": "^2.0.4", - "istanbul-lib-source-maps": "^3.0.2", - "istanbul-reports": "^2.1.1", - "make-dir": "^1.3.0", - "merge-source-map": "^1.1.0", - "resolve-from": "^4.0.0", - "rimraf": "^2.6.3", - "signal-exit": "^3.0.2", - "spawn-wrap": "^1.4.2", - "test-exclude": "^5.1.0", - "uuid": "^3.3.2", - "yargs": "^12.0.5", - "yargs-parser": "^11.1.1" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "append-transform": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "default-require-extensions": "^2.0.0" - } - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "arrify": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "async": { - "version": "2.6.2", - "bundled": true, - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "caching-transform": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "hasha": "^3.0.0", - "make-dir": "^1.3.0", - "package-hash": "^3.0.0", - "write-file-atomic": "^2.3.0" - } - }, - "camelcase": { - "version": "5.0.0", - "bundled": true, - "dev": true - }, - "cliui": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "commander": { - "version": "2.17.1", - "bundled": true, - "dev": true, - "optional": true - }, - "commondir": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "convert-source-map": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, - "cross-spawn": { - "version": "4.0.2", - "bundled": true, - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "which": "^1.2.9" - } - }, - "debug": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decamelize": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "default-require-extensions": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "strip-bom": "^3.0.0" - } - }, - "end-of-stream": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "bundled": true, - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-error": { - "version": "4.1.1", - "bundled": true, - "dev": true - }, - "execa": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "bundled": true, - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - } - } - }, - "find-cache-dir": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^1.0.0", - "pkg-dir": "^3.0.0" - } - }, - "find-up": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "locate-path": "^3.0.0" - } - }, - "foreground-child": { - "version": "1.5.6", - "bundled": true, - "dev": true, - "requires": { - "cross-spawn": "^4", - "signal-exit": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "bundled": true, - "dev": true - }, - "get-stream": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.15", - "bundled": true, - "dev": true - }, - "handlebars": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "async": "^2.5.0", - "optimist": "^0.6.1", - "source-map": "^0.6.1", - "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "has-flag": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "hasha": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "is-stream": "^1.0.1" - } - }, - "hosted-git-info": { - "version": "2.7.1", - "bundled": true, - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "dev": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "invert-kv": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "istanbul-lib-coverage": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "istanbul-lib-hook": { - "version": "2.0.3", - "bundled": true, - "dev": true, - "requires": { - "append-transform": "^1.0.0" - } - }, - "istanbul-lib-report": { - "version": "2.0.4", - "bundled": true, - "dev": true, - "requires": { - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "supports-color": "^6.0.0" - }, - "dependencies": { - "supports-color": { - "version": "6.1.0", - "bundled": true, - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "requires": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^2.0.3", - "make-dir": "^1.3.0", - "rimraf": "^2.6.2", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "istanbul-reports": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "handlebars": "^4.1.0" - } - }, - "json-parse-better-errors": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "lcid": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "requires": { - "invert-kv": "^2.0.0" - } - }, - "load-json-file": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^4.0.0", - "pify": "^3.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "bundled": true, - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "bundled": true, - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "bundled": true, - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-dir": { - "version": "1.3.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "map-age-cleaner": { - "version": "0.1.3", - "bundled": true, - "dev": true, - "requires": { - "p-defer": "^1.0.0" - } - }, - "mem": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "requires": { - "map-age-cleaner": "^0.1.1", - "mimic-fn": "^1.0.0", - "p-is-promise": "^2.0.0" - } - }, - "merge-source-map": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true - } - } - }, - "mimic-fn": { - "version": "1.2.0", - "bundled": true, - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.10", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - } - } - }, - "ms": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "bundled": true, - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "bundled": true, - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-run-path": { - "version": "2.0.2", - "bundled": true, - "dev": true, - "requires": { - "path-key": "^2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "optimist": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "os-locale": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "execa": "^1.0.0", - "lcid": "^2.0.0", - "mem": "^4.0.0" - } - }, - "p-defer": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-finally": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "p-is-promise": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "p-limit": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "p-limit": "^2.0.0" - } - }, - "p-try": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "package-hash": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.15", - "hasha": "^3.0.0", - "lodash.flattendeep": "^4.4.0", - "release-zalgo": "^1.0.0" - } - }, - "parse-json": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" - } - }, - "path-exists": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "path-key": { - "version": "2.0.1", - "bundled": true, - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "bundled": true, - "dev": true - }, - "path-type": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "pify": "^3.0.0" - } - }, - "pify": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "pkg-dir": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^3.0.0" - } - }, - "pseudomap": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "pump": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "read-pkg": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "find-up": "^3.0.0", - "read-pkg": "^3.0.0" - } - }, - "release-zalgo": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "es6-error": "^4.0.1" - } - }, - "require-directory": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "resolve": { - "version": "1.10.0", - "bundled": true, - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-from": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.6.0", - "bundled": true, - "dev": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true - }, - "spawn-wrap": { - "version": "1.4.2", - "bundled": true, - "dev": true, - "requires": { - "foreground-child": "^1.5.6", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "rimraf": "^2.6.2", - "signal-exit": "^3.0.2", - "which": "^1.3.0" - } - }, - "spdx-correct": { - "version": "3.1.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "bundled": true, - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "bundled": true, - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "bundled": true, - "dev": true - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - }, - "strip-bom": { - "version": "3.0.0", - "bundled": true, - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "test-exclude": { - "version": "5.1.0", - "bundled": true, - "dev": true, - "requires": { - "arrify": "^1.0.1", - "minimatch": "^3.0.4", - "read-pkg-up": "^4.0.0", - "require-main-filename": "^1.0.1" - } - }, - "uglify-js": { - "version": "3.4.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "uuid": { - "version": "3.3.2", - "bundled": true, - "dev": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "bundled": true, - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "bundled": true, - "dev": true - }, - "wordwrap": { - "version": "0.0.3", - "bundled": true, - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "bundled": true, - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "write-file-atomic": { - "version": "2.4.2", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "signal-exit": "^3.0.2" - } - }, - "y18n": { - "version": "4.0.0", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "2.1.2", - "bundled": true, - "dev": true - }, - "yargs": { - "version": "12.0.5", - "bundled": true, - "dev": true, - "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", - "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^2.0.0", - "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "bundled": true, - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } + "mime-db": "~1.38.0" } }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, - "object-component": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", - "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", "dev": true }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "brace-expansion": "^1.1.7" } }, - "object-keys": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", - "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=", - "dev": true + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", "dev": true, "requires": { - "isobject": "^3.0.0" + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", "dev": true, "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" }, "dependencies": { - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } } } }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" }, "dependencies": { - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "requires": { - "for-in": "^1.0.1" + "is-plain-object": "^2.0.4" } } } }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "requires": { - "isobject": "^3.0.1" + "minimist": "0.0.8" } }, - "object.reduce": { + "modify-values": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "octal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/octal/-/octal-1.0.0.tgz", - "integrity": "sha1-Y+cWKmjvvrniE1iNWOmJ0eXEUws=", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.1.tgz", + "integrity": "sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==", "dev": true }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "opn": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", - "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", - "dev": true, - "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" - } - }, - "opn-cli": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/opn-cli/-/opn-cli-3.1.0.tgz", - "integrity": "sha1-+BmubK4LQRvQFJuFYP5siK2tIPg=", + "mount-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mount-point/-/mount-point-3.0.0.tgz", + "integrity": "sha1-Zly57evoDREOZY21bDHQrvUaj5c=", "dev": true, "requires": { - "file-type": "^3.6.0", - "get-stdin": "^5.0.1", - "meow": "^3.7.0", - "opn": "^4.0.0", - "temp-write": "^2.1.0" + "@sindresorhus/df": "^1.0.1", + "pify": "^2.3.0", + "pinkie-promise": "^2.0.1" }, "dependencies": { - "file-type": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=", + "@sindresorhus/df": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@sindresorhus/df/-/df-1.0.1.tgz", + "integrity": "sha1-xptm9S9vzdKHyAffIQMF2694UA0=", "dev": true }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true } } }, - "optimist": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { - "minimist": "~0.0.1", - "wordwrap": "~0.0.2" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + } + }, + "move-file": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/move-file/-/move-file-1.2.0.tgz", + "integrity": "sha512-USHrRmxzGowUWAGBbJPdFjHzEqtxDU03pLHY0Rfqgtnq+q8FOIs8wvkkf+Udmg77SJKs47y9sI0jJvQeYsmiCA==", + "dev": true, + "requires": { + "cp-file": "^6.1.0", + "make-dir": "^3.0.0", + "path-exists": "^3.0.0" }, "dependencies": { - "minimist": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", - "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", - "dev": true + "make-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", + "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + } }, - "wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", "dev": true } } }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" }, - "ordered-read-streams": { + "mute-stdout": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true + }, + "nan": { + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "requires": { - "readable-stream": "^2.0.1" + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" } }, - "os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", "dev": true }, - "os-locale": { + "neo-async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz", + "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==", + "dev": true + }, + "nested-error-stacks": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "dev": true + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", + "dev": true + }, + "nock": { + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/nock/-/nock-10.0.6.tgz", + "integrity": "sha512-b47OWj1qf/LqSQYnmokNWM8D88KvUl2y7jT0567NB3ZBAZFz2bWp2PC81Xn7u8F2/vJxzkzNZybnemeFa7AZ2w==", "dev": true, "requires": { - "execa": "^0.7.0", - "lcid": "^1.0.0", - "mem": "^1.1.0" + "chai": "^4.1.2", + "debug": "^4.1.0", + "deep-equal": "^1.0.0", + "json-stringify-safe": "^5.0.1", + "lodash": "^4.17.5", + "mkdirp": "^0.5.0", + "propagate": "^1.0.0", + "qs": "^6.5.1", + "semver": "^5.5.0" } }, - "os-shim": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", - "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=", + "node-fetch": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.5.0.tgz", + "integrity": "sha512-YuZKluhWGJwCcUu4RlZstdAxr8bFfOVHakc1mplwHkk8J+tqM1Y5yraYvIUpeX8aY7+crCwiELJq7Vl0o0LWXw==", "dev": true }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", "dev": true }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "node-libs-browser": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.0.tgz", + "integrity": "sha512-5MQunG/oyOaBdttrL40dA7bUfPORLRWMUJLQtMg7nluxUvk5XwnLdL9twQHFAjRx/y7mIMkLKT9++qPbbk6BZA==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.0", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", + "integrity": "sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + } + } + } + }, + "node-modules-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz", + "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=", + "dev": true + }, + "node-notifier": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.4.0.tgz", + "integrity": "sha512-SUDEb+o71XR5lXSTyivXd9J7fCloE3SyP4lSgt3lU2oSANiox+SxlNRGPjDKrwU1YN3ix2KN/VGGCg0t01rttQ==", "dev": true, "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" + "growly": "^1.3.0", + "is-wsl": "^1.1.0", + "semver": "^5.5.0", + "shellwords": "^0.1.1", + "which": "^1.3.0" } }, - "outpipe": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/outpipe/-/outpipe-1.1.1.tgz", - "integrity": "sha1-UM+GFjZeh+Ax4ppeyTOaPaRyX6I=", + "node-releases": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.18.tgz", + "integrity": "sha512-/mnVgm6u/8OwlIsoyRXtTI0RfQcxZoAZbdwyXap0EeWwcOpDDymyCHM2/aR9XKmHXrvizHoPAOs0pcbiJ6RUaA==", "dev": true, "requires": { - "shell-quote": "^1.4.2" + "semver": "^5.3.0" } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "p-try": "^1.0.0" + "remove-trailing-separator": "^1.0.1" } }, - "p-locate": { + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "now-and-later": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", + "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", "dev": true, "requires": { - "p-limit": "^1.1.0" + "once": "^1.3.2" } }, - "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } }, - "p-try": { + "null-check": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", "dev": true }, - "package-json": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-2.4.0.tgz", - "integrity": "sha1-DRW9Z9HLvduyyiIv8u24a8sxqLs=", - "dev": true, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nwsapi": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.1.3.tgz", + "integrity": "sha512-RowAaJGEgYXEZfQ7tvvdtAQUKPyTR6T6wNu0fwlNsGQYr/h3yQc6oI8WnVZh3Y/Sylwc+dtAlvPqfFZjhTyk3A==", + "dev": true + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "requires": { - "got": "^5.0.0", - "registry-auth-token": "^3.0.1", - "registry-url": "^3.0.3", - "semver": "^5.1.0" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "object-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", "dev": true }, - "parents": { + "object-visit": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=", - "dev": true, + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "requires": { - "path-platform": "~0.11.15" + "isobject": "^3.0.0" } }, - "parse-asn1": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz", - "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==", + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { - "asn1.js": "^4.0.0", - "browserify-aes": "^1.0.0", - "create-hash": "^1.1.0", - "evp_bytestokey": "^1.0.0", - "pbkdf2": "^3.0.3" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "dev": true, "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" + "array-each": "^1.0.1", + "array-slice": "^1.0.0", + "for-own": "^1.0.0", + "isobject": "^3.0.0" } }, - "parse-github-repo-url": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", - "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", - "dev": true - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } + "define-properties": "^1.1.2", + "es-abstract": "^1.5.1" } }, - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", "dev": true, "requires": { - "error-ex": "^1.3.1", - "json-parse-better-errors": "^1.0.1" + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" } }, - "parse-ms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", - "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", - "dev": true + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "requires": { + "isobject": "^3.0.1" + } }, - "parse-node-version": { + "object.reduce": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse5": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", - "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", - "dev": true - }, - "parseqs": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", - "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", + "integrity": "sha1-b+NI8qx/oPlcpiEiZZkJaCW7A60=", "dev": true, "requires": { - "better-assert": "~1.0.0" + "for-own": "^1.0.0", + "make-iterator": "^1.0.0" } }, - "parseuri": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", - "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", "dev": true, "requires": { - "better-assert": "~1.0.0" + "ee-first": "1.1.1" } }, - "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "open": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.1.0.tgz", + "integrity": "sha512-Vqch7NFb/WsMujhqfq+B3u0xkssRjZlxh+NSsBSphpcgaFD7gfB0SUBfR91E9ygBlyNGNogXR2cUB8rRfoo2kQ==", "dev": true, "requires": { - "pinkie-promise": "^2.0.0" + "is-wsl": "^1.1.0" } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "opener": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", + "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", "dev": true }, - "path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I=", - "dev": true + "opn-cli": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/opn-cli/-/opn-cli-4.1.0.tgz", + "integrity": "sha512-nVJ9dVb4fEKtmACWxUql+hhQxVWMt7BSRT+6TnB85W3xs5Pgk9sKW3icYeCIwOtOKALBw/6WUCoNmI1+ADfAow==", + "dev": true, + "requires": { + "file-type": "^10.10.0", + "get-stdin": "^6.0.0", + "meow": "^5.0.0", + "open": "^6.1.0", + "temp-write": "^3.4.0" + }, + "dependencies": { + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + } + }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + } + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + } + }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "path-root-regex": "^0.1.0" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" } }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", - "dev": true - }, - "path-type": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", - "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "pify": "^3.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + } } }, - "pbkdf2": { - "version": "3.0.16", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.16.tgz", - "integrity": "sha512-y4CXP3thSxqf7c0qmOF+9UeOTrifiVTIM+u7NWlq+PRsHbr7r7dpCmvzrZxa96JJUNi0Y5w9VqG5ZNeCVMoDcA==", + "ordered-read-streams": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", "dev": true, "requires": { - "create-hash": "^1.1.2", - "create-hmac": "^1.1.4", - "ripemd160": "^2.0.1", - "safe-buffer": "^5.0.1", - "sha.js": "^2.4.8" + "readable-stream": "^2.0.1" } }, - "pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", - "dev": true - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "pidtree": { + "os-browserify": { "version": "0.3.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.0.tgz", - "integrity": "sha512-9CT4NFlDcosssyg8KVFltgokyKZIFjoBxw8CTGy+5F38Y1eQWrt8tRayiUOXE+zVKQnYu5BR8JjCtvK3BcnBhg==", - "dev": true - }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", "dev": true }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", "dev": true }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "requires": { - "pinkie": "^2.0.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, - "plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "dev": true + }, + "p-each-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-1.0.0.tgz", + "integrity": "sha1-kw89Et0fUOdDRFeiLNbwSsatf3E=", "dev": true, "requires": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" + "p-reduce": "^1.0.0" } }, - "pn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", - "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "p-is-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", "dev": true }, - "pretty-bytes": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", - "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", - "dev": true, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "requires": { - "get-stdin": "^4.0.1", - "meow": "^3.1.0" + "p-try": "^1.0.0" } }, - "pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", - "dev": true - }, - "pretty-ms": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-3.2.0.tgz", - "integrity": "sha512-ZypexbfVUGTFxb0v+m1bUyy92DHe5SyYlnyY0msyms5zd3RwyvNgyxZZsXXgoyzlxjx5MiqtXUdhUfvQbe0A2Q==", - "dev": true, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "requires": { - "parse-ms": "^1.0.0" + "p-limit": "^1.1.0" } }, - "private": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", - "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", "dev": true }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true + "p-queue": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-4.0.0.tgz", + "integrity": "sha512-3cRXXn3/O0o3+eVmUroJPSj/esxoEFIm0ZOno/T+NzG/VZgPOqQ8WKmlNqubSEpZmCIngEy34unkHGg83ZIBmg==", + "requires": { + "eventemitter3": "^3.1.0" + } }, - "process-es6": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/process-es6/-/process-es6-0.11.6.tgz", - "integrity": "sha1-xrs4n5qVH4K9TrFpYAEFvS/5x3g=", + "p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", "dev": true }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" }, - "progress-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/progress-stream/-/progress-stream-1.2.0.tgz", - "integrity": "sha1-LNPP6jO6OonJwSHsM0er6asSX3c=", + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "dev": true, "requires": { - "speedometer": "~0.1.2", - "through2": "~0.2.3" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.2.3.tgz", - "integrity": "sha1-6zKE2k6jEbbMis42U3SKUqvyWj8=", - "dev": true, - "requires": { - "readable-stream": "~1.1.9", - "xtend": "~2.1.1" - } - }, - "xtend": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", - "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", - "dev": true, - "requires": { - "object-keys": "~0.4.0" - } - } + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, - "proxy-addr": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", - "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", + "pako": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", + "integrity": "sha512-0DTvPVU3ed8+HNXOu5Bs+o//Mbdj9VNQMUOe9oKCwh8l0GNwpTDMKCWbRjgtD291AWnkAgkqA/LOnQS8AmS1tw==", + "dev": true + }, + "parallel-transform": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", + "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", "dev": true, "requires": { - "forwarded": "~0.1.2", - "ipaddr.js": "1.8.0" + "cyclist": "~0.2.2", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", - "dev": true - }, - "public-encrypt": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.2.tgz", - "integrity": "sha512-4kJ5Esocg8X3h8YgJsKAuoesBgB7mqH3eowiDzMUPKiRDDE7E/BqqZD1hnTByIaAFiwAw246YEltSq7tdrOH0Q==", + "parse-asn1": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", "dev": true, "requires": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1" + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", "dev": true, "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - }, - "dependencies": { - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - } + "is-absolute": "^1.0.0", + "map-cache": "^0.2.0", + "path-root": "^0.1.1" } }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" + "error-ex": "^1.2.0" } }, - "punycode": { + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse5": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz", + "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==", + "dev": true + }, + "parseurl": { "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", "dev": true }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=" + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", "dev": true }, - "qjobs": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", - "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", "dev": true }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", "dev": true, "requires": { - "object-assign": "^4.1.0", - "strict-uri-encode": "^1.0.0" + "path-root-regex": "^0.1.0" } }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", "dev": true }, - "quick-lru": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", - "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", "dev": true }, - "randomatic": { + "path-type": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", - "dev": true, + "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", + "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - } + "pify": "^3.0.0" } }, - "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", - "dev": true, - "requires": { - "safe-buffer": "^5.1.0" - } + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true }, - "randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "pbkdf2": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, - "raw-body": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", - "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", - "dev": true, - "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.3", - "iconv-lite": "0.4.23", - "unpipe": "1.0.0" - } + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - } + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true }, - "read-all-stream": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/read-all-stream/-/read-all-stream-3.1.0.tgz", - "integrity": "sha1-NcPhd/IHjveJ7kv6+kNzB06u9Po=", + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie-promise": "^2.0.0", - "readable-stream": "^2.0.0" + "pinkie": "^2.0.0" } }, - "read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=", + "pirates": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz", + "integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==", "dev": true, "requires": { - "readable-stream": "^2.0.2" + "node-modules-regexp": "^1.0.0" } }, - "read-pkg": { + "pkg-dir": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", - "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", - "dev": true, - "requires": { - "load-json-file": "^4.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^3.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + "find-up": "^3.0.0" }, "dependencies": { - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" + "locate-path": "^3.0.0" } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" + "p-try": "^2.0.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "p-limit": "^2.0.0" } + }, + "p-try": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.1.0.tgz", + "integrity": "sha512-H2RyIJ7+A3rjkwKC2l5GGtU4H1vkxKCAGsWasNVd0Set+6i4znxbWy6/j16YDPJDWxhsgZiKAstMEP8wCdSpjA==", + "dev": true } } }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "minimatch": "^3.0.2", - "readable-stream": "^2.0.2", - "set-immediate-shim": "^1.0.1" + "ansi-colors": "^1.0.1", + "arr-diff": "^4.0.0", + "arr-union": "^3.1.0", + "extend-shallow": "^3.0.2" } }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=" + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.17.0.tgz", + "integrity": "sha512-sXe5lSt2WQlCbydGETgfm1YBShgOX4HxQkFPvbxkcwgDvGDeqVau8h+12+lmSVlP3rHPz0oavfddSZg/q+Szjw==", + "dev": true + }, + "prettier-tslint": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/prettier-tslint/-/prettier-tslint-0.4.2.tgz", + "integrity": "sha512-urhX7U/F+fu8sztEs/Z7CxNS8PdEytEwGKhQaH5fxxCdRmHGT45FoClyDlcZrMk9cK/8JpX/asFmTOHtSGJfLg==", "requires": { - "resolve": "^1.1.6" + "chalk": "^2.4.0", + "globby": "^8.0.1", + "ignore": "^3.3.7", + "require-relative": "^0.8.7", + "tslint": "^5.9.1", + "yargs": "^11.0.0" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "pretty-format": { + "version": "24.8.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-24.8.0.tgz", + "integrity": "sha512-P952T7dkrDEplsR+TuY7q3VXDae5Sr7zmQb12JU/NDQa/3CH7/QW0yvqLcGN6jL+zQFKaoJcPc+yJxMTGmosqw==", "dev": true, "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" + "@jest/types": "^24.8.0", + "ansi-regex": "^4.0.0", + "ansi-styles": "^3.2.0", + "react-is": "^16.8.4" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + } } }, - "regenerate": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", - "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", "dev": true }, - "regenerate-unicode-properties": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz", - "integrity": "sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ==", - "dev": true, - "requires": { - "regenerate": "^1.4.0" - } + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true }, - "regenerator-transform": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.4.tgz", - "integrity": "sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A==", + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "prompts": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.4.tgz", + "integrity": "sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA==", "dev": true, "requires": { - "private": "^0.1.6" + "kleur": "^3.0.2", + "sisteransi": "^1.0.0" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "propagate": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/propagate/-/propagate-1.0.0.tgz", + "integrity": "sha1-AMLa7t2iDofjeCs0Stuhzd1q1wk=", + "dev": true + }, + "proxy-addr": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz", + "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==", "dev": true, "requires": { - "is-equal-shallow": "^0.1.3" + "forwarded": "~0.1.2", + "ipaddr.js": "1.8.0" } }, - "regex-not": { + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "pseudomap": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" }, - "regexp-tree": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.5.tgz", - "integrity": "sha512-nUmxvfJyAODw+0B13hj8CFVAxhe7fDEAgJgaotBu3nnR+IgGgZq59YedJP5VYTlkEfqjuK6TuRpnymKdatLZfQ==", + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", "dev": true }, - "regexpu-core": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", - "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { - "regenerate": "^1.4.0", - "regenerate-unicode-properties": "^8.0.2", - "regjsgen": "^0.5.0", - "regjsparser": "^0.6.0", - "unicode-match-property-ecmascript": "^1.0.4", - "unicode-match-property-value-ecmascript": "^1.1.0" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, - "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, "requires": { - "rc": "^1.1.6", - "safe-buffer": "^5.0.1" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, - "registry-url": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", - "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, "requires": { - "rc": "^1.0.1" + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" } }, - "regjsgen": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", - "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", "dev": true }, - "regjsparser": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", - "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", - "dev": true, - "requires": { - "jsesc": "~0.5.0" - }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", - "dev": true - } - } + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", "dev": true, "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "dev": true }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", "dev": true }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { - "is-finite": "^1.0.0" + "safe-buffer": "^5.1.0" } }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, - "replacestream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", - "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.3", - "object-assign": "^4.0.1", - "readable-stream": "^2.0.2" - } + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true }, - "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "raw-body": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", + "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", "dev": true, "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "bytes": "3.0.0", + "http-errors": "1.6.3", + "iconv-lite": "0.4.23", + "unpipe": "1.0.0" }, "dependencies": { - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", "dev": true }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", "dev": true, "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" + "safer-buffer": ">= 2.1.2 < 3" } - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true } } }, - "request-promise-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", "dev": true, "requires": { - "lodash": "^4.13.1" + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + } } }, - "request-promise-native": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", - "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", + "react-is": { + "version": "16.8.6", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.6.tgz", + "integrity": "sha512-aUk3bHfZ2bRSVFFbbeVS4i+lNPZr3/WM5jT2J5omUVV1zzcs1nAaf3l51ctA5FFvCRbhrH0bdAsRRQddFJZPtA==", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "request-promise-core": "1.1.1", - "stealthy-require": "^1.1.0", - "tough-cookie": ">=2.3.3" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + }, + "dependencies": { + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } } }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { + "read-pkg-up": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "require-relative": { - "version": "0.8.7", - "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", - "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", - "dev": true - }, - "requires-port": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", - "dev": true + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + }, + "dependencies": { + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + } + } }, - "resolve": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz", - "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==", + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" } }, - "resolve-options": { + "realpath-native": { "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", + "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", "dev": true, "requires": { - "value-or-function": "^3.0.0" + "util.promisify": "^1.0.0" } }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "retry": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.8.0.tgz", - "integrity": "sha1-I2dijcDtskex6rZJ3FOshiisLV8=", - "dev": true - }, - "rfdc": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz", - "integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA==", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, - "optional": true, "requires": { - "align-text": "^0.1.1" + "resolve": "^1.1.6" } }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", "dev": true, "requires": { - "glob": "^7.0.5" + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" } }, - "ripemd160": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", - "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "regenerate": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", + "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.0.2.tgz", + "integrity": "sha512-SbA/iNrBUf6Pv2zU8Ekv1Qbhv92yxL4hiDa2siuxs4KKn4oOoMDHXjAf7+Nz9qinUQ46B1LcWEi/PhJfPWpZWQ==", "dev": true, "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" + "regenerate": "^1.4.0" } }, - "rocky": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/rocky/-/rocky-0.4.15.tgz", - "integrity": "sha512-6jfS+ENpZYW2Wfw9ETT8dO/HyNg6Deexv+9kXt2bWJxEgJLzgio3+op0i0nn9vwD3EJQ9TpJ4068Cl5BkcQopA==", + "regenerator-transform": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.13.4.tgz", + "integrity": "sha512-T0QMBjK3J0MtxjPmdIMXm72Wvj2Abb0Bd4HADdfijwMdoIsyQZ6fWC7kDFhk2YinBBEMZDL7Y7wh0J1sGx3S4A==", "dev": true, "requires": { - "http-proxy": "^1.16.2", - "indexport": "^0.1.1", - "is-fail": "^0.1.1", - "lodash": "^3.9.3", - "media-typer": "^0.3.0", - "midware-pool": "^0.1.1", - "raw-body": "^2.1.2", - "retry": "^0.8.0", - "router": "^1.3.1" - }, - "dependencies": { - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", - "dev": true - } + "private": "^0.1.6" } }, - "rollup": { - "version": "0.57.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-0.57.1.tgz", - "integrity": "sha512-I18GBqP0qJoJC1K1osYjreqA8VAKovxuI3I81RSk0Dmr4TgloI0tAULjZaox8OsJ+n7XRrhH6i0G2By/pj1LCA==", - "dev": true, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "requires": { - "@types/acorn": "^4.0.3", - "acorn": "^5.5.3", - "acorn-dynamic-import": "^3.0.0", - "date-time": "^2.1.0", - "is-reference": "^1.1.0", - "locate-character": "^2.0.5", - "pretty-ms": "^3.1.0", - "require-relative": "^0.8.7", - "rollup-pluginutils": "^2.0.1", - "signal-exit": "^3.0.2", - "sourcemap-codec": "^1.4.1" + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" } }, - "rollup-plugin-alias": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-alias/-/rollup-plugin-alias-1.4.0.tgz", - "integrity": "sha512-lB094zdi19FS+1bVarVp9kBN0Zk41PdTGoCk0z8xesKO7RGjOo18cp1hUzEqrOQ4bM9+KLD9nbnu/XUxQm9pbg==", + "regexp-tree": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.6.tgz", + "integrity": "sha512-LFrA98Dw/heXqDojz7qKFdygZmFoiVlvE1Zp7Cq2cvF+ZA+03Gmhy0k0PQlsC1jvHPiTUSs+pDHEuSWv6+6D7w==", + "dev": true + }, + "regexpu-core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", + "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", "dev": true, "requires": { - "slash": "^1.0.0" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.0.2", + "regjsgen": "^0.5.0", + "regjsparser": "^0.6.0", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.1.0" } }, - "rollup-plugin-babel": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-babel/-/rollup-plugin-babel-4.3.2.tgz", - "integrity": "sha512-KfnizE258L/4enADKX61ozfwGHoqYauvoofghFJBhFnpH9Sb9dNPpWg8QHOaAfVASUYV8w0mCx430i9z0LJoJg==", + "registry-auth-token": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.0.0", - "rollup-pluginutils": "^2.3.0" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, - "rollup-plugin-commonjs": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-commonjs/-/rollup-plugin-commonjs-9.2.0.tgz", - "integrity": "sha512-0RM5U4Vd6iHjL6rLvr3lKBwnPsaVml+qxOGaaNUWN1lSq6S33KhITOfHmvxV3z2vy9Mk4t0g4rNlVaJJsNQPWA==", + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, "requires": { - "estree-walker": "^0.5.2", - "magic-string": "^0.25.1", - "resolve": "^1.8.1", - "rollup-pluginutils": "^2.3.3" - }, - "dependencies": { - "rollup-pluginutils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.4.1.tgz", - "integrity": "sha512-wesMQ9/172IJDIW/lYWm0vW0LiKe5Ekjws481R7z9WTRtmO59cqyM/2uUlxvf6yzm/fElFmHUobeQOYz46dZJw==", - "dev": true, - "requires": { - "estree-walker": "^0.6.0", - "micromatch": "^3.1.10" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.0.tgz", - "integrity": "sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw==", - "dev": true - } - } - } + "rc": "^1.0.1" } }, - "rollup-plugin-hypothetical": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-hypothetical/-/rollup-plugin-hypothetical-2.1.0.tgz", - "integrity": "sha512-MlxPQTkMtiRUtyhIJ7FpBvTzWtar8eFBA+V7/J6Deg9fSgIIHwL6bJKK1Wl1uWSWtOrWhOmtsMwb9F6aagP/Pg==", + "regjsgen": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.0.tgz", + "integrity": "sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA==", "dev": true }, - "rollup-plugin-json": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-json/-/rollup-plugin-json-3.1.0.tgz", - "integrity": "sha512-BlYk5VspvGpjz7lAwArVzBXR60JK+4EKtPkCHouAWg39obk9S61hZYJDBfMK+oitPdoe11i69TlxKlMQNFC/Uw==", + "regjsparser": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.0.tgz", + "integrity": "sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ==", "dev": true, "requires": { - "rollup-pluginutils": "^2.3.1" + "jsesc": "~0.5.0" }, "dependencies": { - "rollup-pluginutils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.4.1.tgz", - "integrity": "sha512-wesMQ9/172IJDIW/lYWm0vW0LiKe5Ekjws481R7z9WTRtmO59cqyM/2uUlxvf6yzm/fElFmHUobeQOYz46dZJw==", - "dev": true, - "requires": { - "estree-walker": "^0.6.0", - "micromatch": "^3.1.10" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.0.tgz", - "integrity": "sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw==", - "dev": true - } - } + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true } } }, - "rollup-plugin-node-builtins": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-builtins/-/rollup-plugin-node-builtins-2.1.2.tgz", - "integrity": "sha1-JKH+1KQyV7a2Q3HYq8bOGrFFl+k=", + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", "dev": true, "requires": { - "browserify-fs": "^1.0.0", - "buffer-es6": "^4.9.2", - "crypto-browserify": "^3.11.0", - "process-es6": "^0.11.2" + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" } }, - "rollup-plugin-node-globals": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-globals/-/rollup-plugin-node-globals-1.4.0.tgz", - "integrity": "sha512-xRkB+W/m1KLIzPUmG0ofvR+CPNcvuCuNdjVBVS7ALKSxr3EDhnzNceGkGi1m8MToSli13AzKFYH4ie9w3I5L3g==", + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", "dev": true, "requires": { - "acorn": "^5.7.3", - "buffer-es6": "^4.9.3", - "estree-walker": "^0.5.2", - "magic-string": "^0.22.5", - "process-es6": "^0.11.6", - "rollup-pluginutils": "^2.3.1" - }, - "dependencies": { - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "magic-string": { - "version": "0.22.5", - "resolved": "http://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz", - "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==", - "dev": true, - "requires": { - "vlq": "^0.2.2" - } - }, - "rollup-pluginutils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.4.1.tgz", - "integrity": "sha512-wesMQ9/172IJDIW/lYWm0vW0LiKe5Ekjws481R7z9WTRtmO59cqyM/2uUlxvf6yzm/fElFmHUobeQOYz46dZJw==", - "dev": true, - "requires": { - "estree-walker": "^0.6.0", - "micromatch": "^3.1.10" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.0.tgz", - "integrity": "sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw==", - "dev": true - } - } - } + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" } }, - "rollup-plugin-node-resolve": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.4.0.tgz", - "integrity": "sha512-PJcd85dxfSBWih84ozRtBkB731OjXk0KnzN0oGp7WOWcarAFkVa71cV5hTJg2qpVsV2U8EUwrzHP3tvy9vS3qg==", - "dev": true, - "requires": { - "builtin-modules": "^2.0.0", - "is-module": "^1.0.0", - "resolve": "^1.1.6" - }, - "dependencies": { - "builtin-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-2.0.0.tgz", - "integrity": "sha512-3U5kUA5VPsRUA3nofm/BXX7GVHKfxz0hOBAPxXrIvHzlDRkQVqEn6yi8QJegxl4LzOHLdvb7XF5dVawa/VVYBg==", - "dev": true - } - } + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true }, - "rollup-plugin-replace": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-replace/-/rollup-plugin-replace-2.1.0.tgz", - "integrity": "sha512-SxrAIgpH/B5/W4SeULgreOemxcpEgKs2gcD42zXw50bhqGWmcnlXneVInQpAqzA/cIly4bJrOpeelmB9p4YXSQ==", + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "magic-string": "^0.25.1", - "minimatch": "^3.0.2", - "rollup-pluginutils": "^2.0.1" + "is-finite": "^1.0.0" } }, - "rollup-pluginutils": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.4.1.tgz", - "integrity": "sha512-wesMQ9/172IJDIW/lYWm0vW0LiKe5Ekjws481R7z9WTRtmO59cqyM/2uUlxvf6yzm/fElFmHUobeQOYz46dZJw==", + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha1-6H9tUTuSjd6AgmDBK+f+xv9ueYw=", "dev": true, "requires": { - "estree-walker": "^0.6.0", - "micromatch": "^3.1.10" - }, - "dependencies": { - "estree-walker": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.0.tgz", - "integrity": "sha512-peq1RfVAVzr3PU/jL31RaOjUKLoZJpObQWJJ+LgfcxDUifyLZ1RjPQZTl0pzj2uJ45b7A7XpyppXvxdEqzo4rw==", - "dev": true - } + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" } }, - "rollup-watch": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/rollup-watch/-/rollup-watch-4.3.1.tgz", - "integrity": "sha512-6yjnIwfjpSrqA8IafyIu7fsEyeImNR4aDjA1bQ7KWeVuiA+Clfsx8+PGQkyABWIQzmauQ//tIJ5wAxLXsXs8qQ==", + "replacestream": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/replacestream/-/replacestream-4.0.3.tgz", + "integrity": "sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==", "dev": true, "requires": { - "chokidar": "^1.7.0", - "require-relative": "0.8.7", - "rollup-pluginutils": "^2.0.1" - }, - "dependencies": { - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "^1.3.0", - "async-each": "^1.0.0", - "fsevents": "^1.0.0", - "glob-parent": "^2.0.0", - "inherits": "^2.0.1", - "is-binary-path": "^1.0.0", - "is-glob": "^2.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - } - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - } - } + "escape-string-regexp": "^1.0.3", + "object-assign": "^4.0.1", + "readable-stream": "^2.0.2" } }, - "router": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/router/-/router-1.3.3.tgz", - "integrity": "sha1-wUL2tepNazNZAiypW2WAvSF/ic8=", + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { - "array-flatten": "2.1.1", - "debug": "2.6.9", - "methods": "~1.1.2", - "parseurl": "~1.3.2", - "path-to-regexp": "0.1.7", - "setprototypeof": "1.1.0", - "utils-merge": "1.0.1" + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "dependencies": { - "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", "dev": true }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, "requires": { - "ms": "2.0.0" + "psl": "^1.1.24", + "punycode": "^1.4.1" } } } }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "dev": true, + "requires": { + "lodash": "^4.17.11" + } + }, + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "dev": true, + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" + }, + "require-relative": { + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=" + }, + "resolve": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "requires": { + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "rsvp": { + "version": "4.8.4", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-4.8.4.tgz", + "integrity": "sha512-6FomvYPfs+Jy9TfXmBpBuMWNH94SgCsZmJKcanySzgNNP6LjWxBvyLTa9KaMfDDM5oxRfrKDB0r/qeRsLwnBfA==", + "dev": true + }, "run-applescript": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-3.1.0.tgz", - "integrity": "sha1-WIZe28ySuWRKMwxL+t7fXiZYjF0=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-3.2.0.tgz", + "integrity": "sha512-Ep0RsvAjnRcBX1p5vogbaBdAGu/8j/ewpvGqnQYunnLd9SM0vWcPJewPKNnWFggf0hF0pwIgwV5XK7qQ7UZ8Qg==", "dev": true, "requires": { - "execa": "^0.8.0" + "execa": "^0.10.0" }, "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz", + "integrity": "sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==", "dev": true, "requires": { - "cross-spawn": "^5.0.1", + "cross-spawn": "^6.0.0", "get-stream": "^3.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", @@ -12350,16 +11034,25 @@ } } }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, "requires": { "ret": "~0.1.10" } @@ -12370,6 +11063,78 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, + "sane": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/sane/-/sane-4.1.0.tgz", + "integrity": "sha512-hhbzAgTIX8O7SHfp2c8/kREfEn4qO/9q8C9beyY6+tvZ87EpoZ3i1RIEvp27YBswnNbY9mWd6paKVmKbAgLfZA==", + "dev": true, + "requires": { + "@cnakazawa/watch": "^1.0.3", + "anymatch": "^2.0.0", + "capture-exit": "^2.0.0", + "exec-sh": "^0.3.2", + "execa": "^1.0.0", + "fb-watchman": "^2.0.0", + "micromatch": "^3.1.4", + "minimist": "^1.1.1", + "walker": "~1.0.5" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "sax": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.1.tgz", @@ -12377,19 +11142,29 @@ "dev": true }, "saxes": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.3.tgz", - "integrity": "sha512-Nc5DXc5A+m3rUDtkS+vHlBWKT7mCKjJPyia7f8YMW773hsXVv2wEHQZGE0zs4+5PLwz9U5Sbl/94Cnd9vHV7Bg==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.9.tgz", + "integrity": "sha512-FZeKhJglhJHk7eWG5YM0z46VHmI3KJpMBAQm3xa9meDvd+wevB5GuBB0wc0exPInZiBBHqi00DbS8AcvCGCFMw==", "dev": true, "requires": { "xmlchars": "^1.3.1" } }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, "semver": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", - "dev": true + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" }, "semver-diff": { "version": "2.1.0", @@ -12445,14 +11220,20 @@ "ms": "2.0.0" } }, - "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, + "serialize-javascript": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.6.1.tgz", + "integrity": "sha512-A5MOagrPFga4YaKQSWHryl7AXvbQkEqpw4NNYMTNYUNV51bA8ABHgYFpqKx+YFFrw59xMV1qGH1R4AgoNIVgCw==", + "dev": true + }, "serve-static": { "version": "1.13.2", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", @@ -12468,20 +11249,12 @@ "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "set-value": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -12493,7 +11266,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -12522,21 +11294,10 @@ "safe-buffer": "^5.0.1" } }, - "shasum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=", - "dev": true, - "requires": { - "json-stable-stringify": "~0.0.0", - "sha.js": "~2.4.4" - } - }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, "requires": { "shebang-regex": "^1.0.0" } @@ -12544,20 +11305,7 @@ "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shell-quote": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", - "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", - "dev": true, - "requires": { - "array-filter": "~0.0.0", - "array-map": "~0.0.0", - "array-reduce": "~0.0.0", - "jsonify": "~0.0.0" - } + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "shelljs": { "version": "0.8.3", @@ -12570,61 +11318,32 @@ "rechoir": "^0.6.2" } }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" }, - "simple-concat": { + "sisteransi": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz", - "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY=", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.0.tgz", + "integrity": "sha512-N+z4pHB4AmUv0SjveWRd6q1Nj5w62m5jodv+GD8lvmbY/83T/rpbJGZOnK5T149OldDj4Db07BSv9xY4K6NTPQ==", "dev": true }, - "single-line-log": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/single-line-log/-/single-line-log-1.1.2.tgz", - "integrity": "sha1-wvg/Jzo+GhbtsJlWYdoO1e8DM2Q=", - "dev": true, - "requires": { - "string-width": "^1.0.1" - } - }, - "sinon": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.1.1.tgz", - "integrity": "sha512-iYagtjLVt1vN3zZY7D8oH7dkjNJEjLjyuzy8daX5+3bbQl8gaohrheB9VfH1O3L6LKuue5WTJvFluHiuZ9y3nQ==", - "dev": true, - "requires": { - "@sinonjs/commons": "^1.2.0", - "@sinonjs/formatio": "^3.0.0", - "@sinonjs/samsam": "^2.1.2", - "diff": "^3.5.0", - "lodash.get": "^4.4.2", - "lolex": "^3.0.0", - "nise": "^1.4.6", - "supports-color": "^5.5.0", - "type-detect": "^4.0.8" - } - }, "slash": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", - "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", - "dev": true - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" }, "snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, "requires": { "base": "^0.11.1", "debug": "^2.2.0", @@ -12640,7 +11359,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -12649,7 +11367,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -12658,10 +11375,14 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, @@ -12669,7 +11390,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, "requires": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -12680,7 +11400,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, "requires": { "is-descriptor": "^1.0.0" } @@ -12689,7 +11408,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -12698,7 +11416,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, "requires": { "kind-of": "^6.0.0" } @@ -12707,7 +11424,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, "requires": { "is-accessor-descriptor": "^1.0.0", "is-data-descriptor": "^1.0.0", @@ -12720,7 +11436,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, "requires": { "kind-of": "^3.2.0" }, @@ -12729,74 +11444,12 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } } } }, - "socket.io": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", - "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", - "dev": true, - "requires": { - "debug": "~3.1.0", - "engine.io": "~3.2.0", - "has-binary2": "~1.0.2", - "socket.io-adapter": "~1.1.0", - "socket.io-client": "2.1.1", - "socket.io-parser": "~3.2.0" - } - }, - "socket.io-adapter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", - "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=", - "dev": true - }, - "socket.io-client": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", - "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", - "dev": true, - "requires": { - "backo2": "1.0.2", - "base64-arraybuffer": "0.1.5", - "component-bind": "1.0.0", - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "engine.io-client": "~3.2.0", - "has-binary2": "~1.0.2", - "has-cors": "1.1.0", - "indexof": "0.0.1", - "object-component": "0.0.3", - "parseqs": "0.0.5", - "parseuri": "0.0.5", - "socket.io-parser": "~3.2.0", - "to-array": "0.1.4" - } - }, - "socket.io-parser": { - "version": "3.2.0", - "resolved": "http://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", - "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "debug": "~3.1.0", - "isarray": "2.0.1" - }, - "dependencies": { - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", - "dev": true - } - } - }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", @@ -12806,17 +11459,21 @@ "is-plain-obj": "^1.0.0" } }, + "source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" }, "source-map-resolve": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, "requires": { "atob": "^2.1.1", "decode-uri-component": "^0.2.0", @@ -12825,17 +11482,26 @@ "urix": "^0.1.0" } }, + "source-map-support": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", + "integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==", + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + } + } + }, "source-map-url": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "sourcemap-codec": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.1.tgz", - "integrity": "sha512-hX1eNBNuilj8yfFnECh0DzLgwKpBLMIvmhgEhixXNui8lMLBInTI8Kyxt++RwJnMNu7cAUo635L2+N1TxMJCzA==", - "dev": true + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=" }, "spark-md5": { "version": "3.0.0", @@ -12849,9 +11515,9 @@ "dev": true }, "spdx-correct": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", - "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", @@ -12859,9 +11525,9 @@ } }, "spdx-exceptions": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", - "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", + "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, "spdx-expression-parse": { @@ -12875,15 +11541,9 @@ } }, "spdx-license-ids": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", - "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", - "dev": true - }, - "speedometer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/speedometer/-/speedometer-0.1.4.tgz", - "integrity": "sha1-mHbb0qFp0xFUAtSObqYynIgWpQ0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", + "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", "dev": true }, "split": { @@ -12899,7 +11559,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, "requires": { "extend-shallow": "^3.0.0" } @@ -12916,13 +11575,12 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -12936,52 +11594,280 @@ "tweetnacl": "~0.14.0" } }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=", "dev": true }, + "stack-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.2.tgz", + "integrity": "sha512-MTX+MeG5U994cazkjd/9KNAapsHnibjMLnfXodlkXw76JEea0UiNzrqidzo1emMwk7w5Qhc9jd4Bn9TBb1MFwA==", + "dev": true + }, "standard-version": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-4.4.0.tgz", - "integrity": "sha512-jJ8FZhnmh9xJRQLnaXiGRLaAUNItIH29lOQZGpL5fd4+jUHto9Ij6SPCYN86h6ZNNXkYq2TYiIVVF7gVyC+pcQ==", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "conventional-changelog": "^1.1.0", - "conventional-recommended-bump": "^1.0.0", - "dotgitignore": "^1.0.3", - "figures": "^1.5.0", - "fs-access": "^1.0.0", - "semver": "^5.1.0", - "yargs": "^8.0.1" + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-6.0.1.tgz", + "integrity": "sha512-+09AwTbyLKyUwefiZSccgarp24okvH9A229NOVSpYTKWcxBxqZqdYmtQaJ8UET9mjPXRxP84vonJU4YMqCyBTQ==", + "dev": true, + "requires": { + "chalk": "2.4.2", + "conventional-changelog": "3.1.8", + "conventional-changelog-config-spec": "1.0.0", + "conventional-recommended-bump": "5.0.0", + "detect-indent": "6.0.0", + "detect-newline": "3.0.0", + "dotgitignore": "2.1.0", + "figures": "3.0.0", + "find-up": "3.0.0", + "fs-access": "1.0.1", + "git-semver-tags": "2.0.2", + "semver": "6.0.0", + "stringify-package": "1.0.0", + "yargs": "13.2.2" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", + "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", + "dev": true + } } }, - "supports-color": { + "detect-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.0.0.tgz", + "integrity": "sha512-JAP22dVPAqvhdRFFxK1G5GViIokyUn0UWXRNW0ztK96fsqi9cuM8w8ESbSk+T2w5OVorcMcL6m7yUg1RrX+2CA==", + "dev": true + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "require-main-filename": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "semver": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz", + "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==", + "dev": true + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + }, + "y18n": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", + "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true + }, + "yargs": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", + "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + } + }, + "yargs-parser": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.0.tgz", + "integrity": "sha512-Yq+32PrijHRri0vVKQEm+ys8mbqWjLiwQkMFNXEENutzLPP0bE4Lcd4iA3OQY5HF+GD3xXxf0MEHb8E4/SA3AA==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, @@ -12989,7 +11875,6 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, "requires": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -12999,7 +11884,6 @@ "version": "0.2.5", "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, "requires": { "is-descriptor": "^0.1.0" } @@ -13007,9 +11891,9 @@ } }, "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", "dev": true }, "stealthy-require": { @@ -13019,23 +11903,23 @@ "dev": true }, "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" } }, - "stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=", + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" } }, "stream-exhaust": { @@ -13063,16 +11947,6 @@ "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", "dev": true }, - "stream-splicer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz", - "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, "stream-to-array": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz", @@ -13082,86 +11956,99 @@ "any-promise": "^1.1.0" } }, - "streamroller": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-0.7.0.tgz", - "integrity": "sha512-WREzfy0r0zUqp3lGO096wRuUp7ho1X6uo/7DJfTlEi0Iv/4gT7YHqXDjKC2ioVGBZtE8QzsQD9nx1nIuoZ57jQ==", - "dev": true, - "requires": { - "date-format": "^1.2.0", - "debug": "^3.1.0", - "mkdirp": "^0.5.1", - "readable-stream": "^2.3.0" - } - }, "strict-uri-encode": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, - "string-range": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/string-range/-/string-range-1.2.2.tgz", - "integrity": "sha1-qJPtNH5yKZvIO++78qaSqNI51d0=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", "dev": true, "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" + "astral-regex": "^1.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, - "string.prototype.padend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", - "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", - "dev": true, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "requires": { - "define-properties": "^1.1.2", - "es-abstract": "^1.4.3", - "function-bind": "^1.0.2" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + } + } } }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.2.0.tgz", + "integrity": "sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } }, + "stringify-package": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stringify-package/-/stringify-package-1.0.0.tgz", + "integrity": "sha512-JIQqiWmLiEozOC0b0BtxZ/AOUtdUZHCBPgqIZ2kSJJqGwgb9neo44XdTHUC4HZSGqi03hOeB7W/E8rAlKnGe9g==", + "dev": true + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, "requires": { "ansi-regex": "^2.0.0" } }, "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha1-5SEekiQ2n7uB1jOi8ABE3IztrZI=", - "dev": true + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "^0.2.0" + } }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "strip-indent": { "version": "1.0.1", @@ -13170,6 +12057,14 @@ "dev": true, "requires": { "get-stdin": "^4.0.1" + }, + "dependencies": { + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + } } }, "strip-json-comments": { @@ -13193,64 +12088,10 @@ "integrity": "sha1-IrD6OkE4WzO+PzMVUbu4N/oM164=", "dev": true }, - "subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", - "dev": true, - "requires": { - "minimist": "^1.1.0" - } - }, - "sumchecker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-2.0.2.tgz", - "integrity": "sha1-D0LBDl0F2l1C7qPlbDOZo31sWz4=", - "dev": true, - "requires": { - "debug": "^2.2.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - } - } - }, - "superagent": { - "version": "3.8.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.3.tgz", - "integrity": "sha512-GLQtLMCoEIK4eDv6OGtkOoSMt3D+oq0y3dsxMuYuDvaNUvuT8eFBuLmfR0iYYzHC1e8hpzC6ZsxbuP6DIalMFA==", - "requires": { - "component-emitter": "^1.2.0", - "cookiejar": "^2.1.0", - "debug": "^3.1.0", - "extend": "^3.0.0", - "form-data": "^2.3.1", - "formidable": "^1.2.0", - "methods": "^1.1.1", - "mime": "^1.4.1", - "qs": "^6.5.1", - "readable-stream": "^2.3.5" - }, - "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - } - } - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -13271,72 +12112,223 @@ "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", "dev": true }, - "syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", + "tapable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.1.tgz", + "integrity": "sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA==", + "dev": true + }, + "teeny-request": { + "version": "3.11.3", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-3.11.3.tgz", + "integrity": "sha512-CKncqSF7sH6p4rzCgkb/z/Pcos5efl0DmolzvlqRQUNcpRIruOhY9+T1FsIlyEbfWd7MsFpodROOwHYh2BaXzw==", "dev": true, "requires": { - "acorn-node": "^1.2.0" + "https-proxy-agent": "^2.2.1", + "node-fetch": "^2.2.0", + "uuid": "^3.3.2" } }, - "tcomb": { - "version": "3.2.27", - "resolved": "https://registry.npmjs.org/tcomb/-/tcomb-3.2.27.tgz", - "integrity": "sha512-XWdJW7F/M3YzXhDEUP8ycmNWoYymBtsHwCHoda0YF44RthJsls95TqDrmpAlC1sB/KXaCvkdBlcNRq+AaV6klA==" + "temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "dev": true }, - "tcomb-validation": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tcomb-validation/-/tcomb-validation-3.4.1.tgz", - "integrity": "sha512-urVVMQOma4RXwiVCa2nM2eqrAomHROHvWPuj6UkDGz/eb5kcy0x6P0dVt6kzpUZtYMNoAqJLWmz1BPtxrtjtrA==", + "temp-write": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-3.4.0.tgz", + "integrity": "sha1-jP9jD7fp2gXwR8dM5M5NaFRX1JI=", + "dev": true, "requires": { - "tcomb": "^3.0.0" + "graceful-fs": "^4.1.2", + "is-stream": "^1.1.0", + "make-dir": "^1.0.0", + "pify": "^3.0.0", + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" } }, - "temp-write": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/temp-write/-/temp-write-2.1.0.tgz", - "integrity": "sha1-WYkJGODvCdVIqqNC9L00CdhATpY=", + "term-size": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", + "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "mkdirp": "^0.5.0", - "os-tmpdir": "^1.0.0", - "pify": "^2.2.0", - "pinkie-promise": "^2.0.0", - "uuid": "^2.0.1" + "execa": "^0.7.0" + } + }, + "terser": { + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz", + "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==", + "dev": true, + "requires": { + "commander": "^2.19.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.10" }, "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "terser-webpack-plugin": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz", + "integrity": "sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA==", + "dev": true, + "requires": { + "cacache": "^11.0.2", + "find-cache-dir": "^2.0.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^1.4.0", + "source-map": "^0.6.1", + "terser": "^3.16.1", + "webpack-sources": "^1.1.0", + "worker-farm": "^1.5.2" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" + } + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true } } }, "text-extensions": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.7.0.tgz", - "integrity": "sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.9.0.tgz", + "integrity": "sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==", "dev": true }, "textextensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.2.0.tgz", - "integrity": "sha512-j5EMxnryTvKxwH2Cq+Pb43tsf6sdEgw6Pdwxk83mPaq0ToeFJt6WE4J3s5BqY7vmjlLgkgXvhtXUxo80FyBhCA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/textextensions/-/textextensions-2.4.0.tgz", + "integrity": "sha512-qftQXnX1DzpSV8EddtHIT0eDDEiBF8ywhFYR2lI9xrGtxqKN+CvLXhACeCIGbCpQfxxERbrkZEFb8cZcDKbVZA==", "dev": true }, - "throttleit": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-0.0.2.tgz", - "integrity": "sha1-z+34jmDADdlpe2H90qg0OptoDq8=", + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", "dev": true }, "through": { @@ -13346,19 +12338,19 @@ "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "^2.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", "dev": true, "requires": { "through2": "~2.0.0", @@ -13371,45 +12363,26 @@ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", "dev": true }, - "time-zone": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=", - "dev": true - }, "timed-out": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-3.1.3.tgz", - "integrity": "sha1-lYYL/MXHbCd/j4Mm/Q9bLiDrohc=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", "dev": true }, "timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=", + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz", + "integrity": "sha512-YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==", "dev": true, "requires": { - "process": "~0.11.0" + "setimmediate": "^1.0.4" } }, - "timers-ext": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.5.tgz", - "integrity": "sha512-tsEStd7kmACHENhsUPaxb8Jf8/+GZZxyNFQbZD07HQOyooOa6At1rQqjffgvg7n+dxscQa9cjjMdWhJtsP2sxg==", - "dev": true, - "requires": { - "es5-ext": "~0.10.14", - "next-tick": "1" - } - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true }, "to-absolute-glob": { "version": "2.0.2", @@ -13421,12 +12394,6 @@ "is-negated-glob": "^1.0.0" } }, - "to-array": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", - "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", - "dev": true - }, "to-arraybuffer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", @@ -13443,7 +12410,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -13452,7 +12418,6 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -13463,7 +12428,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, "requires": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -13475,7 +12439,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, "requires": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -13491,40 +12454,19 @@ } }, "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "dev": true, "requires": { - "punycode": "^1.4.1" + "psl": "^1.1.28", + "punycode": "^2.1.1" }, "dependencies": { "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true - } - } - }, - "toxy": { - "version": "0.3.16", - "resolved": "https://registry.npmjs.org/toxy/-/toxy-0.3.16.tgz", - "integrity": "sha512-UPM6+AJp+BocVb8CHVnW9wtjCFWmn2PSq05OTKv379F2gfczLP/uMw0gjBh6t+Uo4YEbuETOwgP2wDENVo2BAg==", - "dev": true, - "requires": { - "indexport": "^0.1.1", - "midware": "^0.1.3", - "object-assign": "^3.0.0", - "raw-body": "^2.1.2", - "rocky": "^0.4.15", - "router": "^1.3.1" - }, - "dependencies": { - "object-assign": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", - "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true } } @@ -13547,19 +12489,20 @@ } }, "trash": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/trash/-/trash-4.3.0.tgz", - "integrity": "sha512-f36TKwIaBiXm63xSrn8OTNghg5CYHBsFVJvcObMo76LRpgariuRi2CqXQHw1VzfeximD0igdGaonOG6N760BtQ==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/trash/-/trash-5.2.0.tgz", + "integrity": "sha512-QpczfQrHKoe4O/iWskzRUwybweYK0okbuO8YvUGL2L1XP5/O9x3juUBr5HBY4yvU77wISKG9VtMD/fWjJLM1Lg==", "dev": true, "requires": { "escape-string-applescript": "^2.0.0", - "fs-extra": "^0.30.0", "globby": "^7.1.1", - "p-map": "^1.2.0", - "p-try": "^1.0.0", - "pify": "^3.0.0", - "run-applescript": "^3.0.0", - "uuid": "^3.1.0", + "is-path-inside": "^2.0.0", + "make-dir": "^1.3.0", + "move-file": "^1.1.0", + "p-map": "^2.0.0", + "p-try": "^2.2.0", + "run-applescript": "^3.2.0", + "uuid": "^3.3.2", "xdg-trashdir": "^2.1.1" }, "dependencies": { @@ -13576,26 +12519,35 @@ "pify": "^3.0.0", "slash": "^1.0.0" } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true } } }, "trash-cli": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/trash-cli/-/trash-cli-1.4.0.tgz", - "integrity": "sha1-MojYkMgkpcyXimxEip8ymwa+Bp0=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trash-cli/-/trash-cli-2.0.0.tgz", + "integrity": "sha512-DVhOIZ35PnD4vWTSKzwSiUyPj63UnnXwwf8eUXp8pRX2U4ka4TeksnwOkxklE9juj6H0HiyTJCXs2paeY5oNsA==", "dev": true, "requires": { "meow": "^3.7.0", - "trash": "^4.0.0", - "update-notifier": "^1.0.2" + "trash": "^5.2.0", + "update-notifier": "^2.5.0" } }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=", - "dev": true - }, "trim-newlines": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", @@ -13623,48 +12575,104 @@ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", "dev": true }, + "tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==", + "dev": true + }, + "ts-jest": { + "version": "24.0.2", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-24.0.2.tgz", + "integrity": "sha512-h6ZCZiA1EQgjczxq+uGLXQlNgeg02WWJBbeT8j6nyIBRQdglqbvzDoHahTEIiS6Eor6x8mK6PfZ7brQ9Q6tzHw==", + "dev": true, + "requires": { + "bs-logger": "0.x", + "buffer-from": "1.x", + "fast-json-stable-stringify": "2.x", + "json5": "2.x", + "make-error": "1.x", + "mkdirp": "0.x", + "resolve": "1.x", + "semver": "^5.5", + "yargs-parser": "10.x" + }, + "dependencies": { + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, + "ts-node": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.1.0.tgz", + "integrity": "sha512-34jpuOrxDuf+O6iW1JpgTRDFynUZ1iEqtYruBqh35gICNjN8x+LpVcPAcwzLPi9VU6mdA3ym+x233nZmZp445A==", + "requires": { + "arg": "^4.1.0", + "diff": "^3.1.0", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + } + }, "tslib": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" }, "tslint": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz", - "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", - "dev": true, + "version": "5.16.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz", + "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==", "requires": { - "babel-code-frame": "^6.22.0", + "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", "diff": "^3.2.0", "glob": "^7.1.1", - "js-yaml": "^3.7.0", + "js-yaml": "^3.13.0", "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", - "tsutils": "^2.27.2" + "tsutils": "^2.29.0" } }, "tslint-config-semistandard": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tslint-config-semistandard/-/tslint-config-semistandard-7.0.0.tgz", - "integrity": "sha512-SMZmVMbHYn6sykthhoNSK39Oxt7b3LdkuXycAxsagp+W7rCBWYowbpwYOJQmeT2a8Vjh6Tz2ifHyraWKB5uArw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/tslint-config-semistandard/-/tslint-config-semistandard-8.0.0.tgz", + "integrity": "sha512-cyxZRD4BKfHYh3ukzKkgrvVxxG3AdDdb51sxMLMtF4eFlc+ReWHHAA3/jlb90CYq/7Y0bvf7vOB7pvyV+ctFKw==", "dev": true, "requires": { - "tslint-config-standard": "^7.0.0", - "tslint-eslint-rules": "^4.1.1" + "tslint-config-standard": "^8.0.0" } }, "tslint-config-standard": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/tslint-config-standard/-/tslint-config-standard-7.1.0.tgz", - "integrity": "sha512-cETzxZcEQ1RKjwtEScGryAtqwiRFc55xBxhZP6bePyOfXmo6i1/QKQrTgFKBiM4FjCvcqTjJq20/KGrh+TzTfQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/tslint-config-standard/-/tslint-config-standard-8.0.1.tgz", + "integrity": "sha512-OWG+NblgjQlVuUS/Dmq3ax2v5QDZwRx4L0kEuDi7qFY9UI6RJhhNfoCV1qI4el8Fw1c5a5BTrjQJP0/jhGXY/Q==", "dev": true, "requires": { "tslint-eslint-rules": "^5.3.1" + } + }, + "tslint-eslint-rules": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", + "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", + "dev": true, + "requires": { + "doctrine": "0.7.2", + "tslib": "1.9.0", + "tsutils": "^3.0.0" }, "dependencies": { "tslib": { @@ -13673,60 +12681,29 @@ "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", "dev": true }, - "tslint-eslint-rules": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.3.1.tgz", - "integrity": "sha512-qq2H/AU/FlFbQJKXuxhtIk+ni/nQu9jHHhsFKa6hnA0/n3zl1/RWRc3TVFlL8HfWFMzkST350VeTrFpy1u4OUg==", - "dev": true, - "requires": { - "doctrine": "0.7.2", - "tslib": "1.9.0", - "tsutils": "2.8.0" - } - }, "tsutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.8.0.tgz", - "integrity": "sha1-AWAXNymzvxOGKN0UoVN+AIUdgUo=", + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.10.0.tgz", + "integrity": "sha512-q20XSMq7jutbGB8luhKKsQldRKWvyBO2BGqni3p4yq8Ys9bEP/xQw3KepKmMRt9gJ4lvQSScrihJrcKdKoSU7Q==", "dev": true, "requires": { - "tslib": "^1.7.1" + "tslib": "^1.8.1" } } } }, - "tslint-eslint-rules": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-4.1.1.tgz", - "integrity": "sha1-fDDniC8mvCdr/5HSOEl1xp2viLo=", - "dev": true, - "requires": { - "doctrine": "^0.7.2", - "tslib": "^1.0.0", - "tsutils": "^1.4.0" - }, - "dependencies": { - "tsutils": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz", - "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=", - "dev": true - } - } - }, "tsutils": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", - "dev": true, "requires": { "tslib": "^1.8.1" } }, "tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", "dev": true }, "tunnel-agent": { @@ -13742,8 +12719,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "dev": true }, "type-check": { "version": "0.3.2", @@ -13776,12 +12752,6 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "typedarray-to-buffer": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-1.0.4.tgz", - "integrity": "sha1-m7i6DoQfs/TPH+fCRenz+opf6Zw=", - "dev": true - }, "typedoc": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.14.2.tgz", @@ -13818,15 +12788,6 @@ "universalify": "^0.1.0" } }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, "typescript": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", @@ -13842,94 +12803,48 @@ "dev": true }, "typescript": { - "version": "2.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz", - "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", + "version": "3.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.5.tgz", + "integrity": "sha512-YycBxUb49UUhdNMU5aJ7z5Ej2XGmaIBL0x34vZ82fn3hGvD+bgrMrVDpatgz2f7YxUMJxMkbWxJZeAvDxVe7Vw==", "dev": true }, - "uglify-es": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.10.tgz", - "integrity": "sha512-rPzPisCzW68Okj1zNrfa2dR9uEm43SevDmpR6FChoZABFk9dANGnzzBMgHYUXI3609//63fnVkyQ1SQmAMyjww==", + "uglify-js": { + "version": "3.5.8", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.8.tgz", + "integrity": "sha512-GFSjB1nZIzoIq70qvDRtWRORHX3vFkAnyK/rDExc0BN7r9+/S+Voz3t/fwJuVfjppAMz+ceR2poE7tkhvnVwQQ==", "dev": true, + "optional": true, "requires": { - "commander": "~2.14.1", + "commander": "~2.20.0", "source-map": "~0.6.1" }, "dependencies": { "commander": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", - "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", - "dev": true + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", + "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", + "dev": true, + "optional": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, - "uglify-js": { - "version": "3.4.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", - "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", - "dev": true, - "requires": { - "commander": "~2.17.1", - "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "optional": true } } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "ultron": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", - "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==", - "dev": true - }, - "umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", - "dev": true - }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", "dev": true }, - "undeclared-identifiers": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz", - "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==", - "dev": true, - "requires": { - "acorn-node": "^1.3.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - } - }, "undertaker": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.0.tgz", - "integrity": "sha1-M52kZGJS0ILcN45wgGcpl1DhG0k=", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.2.1.tgz", + "integrity": "sha512-71WxIzDkgYk9ZS+spIB8iZXchFhAdEo2YU8xYqBYJ39DIUIqziK78ftm26eecoIY49X0J2MLhG4hr18Yp6/CMA==", "dev": true, "requires": { "arr-flatten": "^1.0.1", @@ -13981,7 +12896,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, "requires": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -13993,7 +12907,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -14002,7 +12915,6 @@ "version": "0.4.3", "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, "requires": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -14012,6 +12924,24 @@ } } }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz", + "integrity": "sha512-n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, "unique-stream": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", @@ -14020,18 +12950,15 @@ "requires": { "json-stable-stringify-without-jsonify": "^1.0.1", "through2-filter": "^3.0.0" - }, - "dependencies": { - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - } + } + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true, + "requires": { + "crypto-random-string": "^1.0.0" } }, "universalify": { @@ -14050,7 +12977,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, "requires": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -14060,7 +12986,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, "requires": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -14071,7 +12996,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, "requires": { "isarray": "1.0.0" } @@ -14081,87 +13005,59 @@ "has-values": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=" } } }, "unzip-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", - "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", "dev": true }, - "unzipper": { - "version": "0.9.10", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.9.10.tgz", - "integrity": "sha512-dhxTaR67KGyrmxseXTmsyzdlRWkuN0rMPo9j6lxosR/PkzbHNd3smzMobaApx6o/oYvqU1uv+fAPoWr1P4bd8Q==", - "dev": true, - "requires": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "~1.0.10", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - }, - "dependencies": { - "bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha1-9y12C+Cbf3bQjtj66Ysomo0F+rM=", - "dev": true - } - } - }, "upath": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz", - "integrity": "sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", + "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", "dev": true }, "update-notifier": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-1.0.3.tgz", - "integrity": "sha1-j5LFFUgr1oMbfJMBPnD4dVLHz1o=", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.5.0.tgz", + "integrity": "sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==", "dev": true, "requires": { - "boxen": "^0.6.0", - "chalk": "^1.0.0", - "configstore": "^2.0.0", + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-ci": "^1.0.10", + "is-installed-globally": "^0.1.0", "is-npm": "^1.0.0", - "latest-version": "^2.0.0", - "lazy-req": "^1.1.0", + "latest-version": "^3.0.0", "semver-diff": "^2.0.0", - "xdg-basedir": "^2.0.0" + "xdg-basedir": "^3.0.0" }, "dependencies": { - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "ci-info": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.6.0.tgz", + "integrity": "sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==", "dev": true }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ci-info": "^1.5.0" } }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", "dev": true } } @@ -14186,13 +13082,12 @@ "urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=" }, "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/url/-/url-0.10.3.tgz", + "integrity": "sha1-Ah5NnHcF8hu/N9A861h2dAJ3TGQ=", "dev": true, "requires": { "punycode": "1.3.2", @@ -14208,34 +13103,30 @@ "prepend-http": "^1.0.1" } }, + "urlgrey": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/urlgrey/-/urlgrey-0.4.4.tgz", + "integrity": "sha1-iS/pWWCAXoVRnxzUOJ8stMu3ZS8=", + "dev": true + }, "use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==" }, - "useragent": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/useragent/-/useragent-2.2.1.tgz", - "integrity": "sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4=", + "user-home": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "dev": true, "requires": { - "lru-cache": "2.2.x", - "tmp": "0.0.x" - }, - "dependencies": { - "lru-cache": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.2.4.tgz", - "integrity": "sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0=", - "dev": true - } + "os-homedir": "^1.0.0" } }, "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { "inherits": "2.0.3" @@ -14244,7 +13135,18 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "object.getownpropertydescriptors": "^2.0.3" + } }, "utils-merge": { "version": "1.0.1", @@ -14253,9 +13155,15 @@ "dev": true }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + }, + "v8-compile-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz", + "integrity": "sha512-1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==", "dev": true }, "v8flags": { @@ -14280,9 +13188,9 @@ } }, "validate-npm-package-license": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", - "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", @@ -14364,63 +13272,8 @@ "now-and-later": "^2.0.0", "remove-bom-buffer": "^3.0.0", "vinyl": "^2.0.0" - }, - "dependencies": { - "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, - "vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha1-q2VJ1h0XLCsbh75cUI0jnI74dwU=", - "dev": true, - "requires": { - "source-map": "^0.5.1" } }, - "vlq": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz", - "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==", - "dev": true - }, "vm-browserify": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", @@ -14430,784 +13283,375 @@ "indexof": "0.0.1" } }, - "void-elements": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", - "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "^0.1.2" + } + }, + "w3c-xmlserializer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz", + "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==", + "dev": true, + "requires": { + "domexception": "^1.0.1", + "webidl-conversions": "^4.0.2", + "xml-name-validator": "^3.0.0" + } + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.x" + } + }, + "watchpack": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", + "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "dev": true, + "requires": { + "chokidar": "^2.0.2", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" + } + }, + "webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", "dev": true }, - "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "webpack": { + "version": "4.30.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.30.0.tgz", + "integrity": "sha512-4hgvO2YbAFUhyTdlR4FNyt2+YaYBYHavyzjCMbZzgglo02rlKi/pcsEzwCuCpsn1ryzIl1cq/u8ArIKu8JBYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.0.5", + "acorn-dynamic-import": "^4.0.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^1.0.0", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + } + }, + "webpack-assets-manifest": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/webpack-assets-manifest/-/webpack-assets-manifest-3.1.1.tgz", + "integrity": "sha512-JV9V2QKc5wEWQptdIjvXDUL1ucbPLH2f27toAY3SNdGZp+xSaStAgpoMcvMZmqtFrBc9a5pTS1058vxyMPOzRQ==", "dev": true, "requires": { - "browser-process-hrtime": "^0.1.2" + "chalk": "^2.0", + "lodash.get": "^4.0", + "lodash.has": "^4.0", + "mkdirp": "^0.5", + "schema-utils": "^1.0.0", + "tapable": "^1.0.0", + "webpack-sources": "^1.0.0" } }, - "w3c-xmlserializer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.0.0.tgz", - "integrity": "sha512-0et1+9uXYiIRAecx1D5Z1nk60+vimniGdIKl4XjeqkWi6acoHNlXMv1VR5jV+jF4ooeO08oWbYxeAJOcon1oMA==", + "webpack-bundle-analyzer": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.3.2.tgz", + "integrity": "sha512-7qvJLPKB4rRWZGjVp5U1KEjwutbDHSKboAl0IfafnrdXMrgC0tOtZbQD6Rw0u4cmpgRN4O02Fc0t8eAT+FgGzA==", "dev": true, "requires": { - "domexception": "^1.0.1", - "webidl-conversions": "^4.0.2", - "xml-name-validator": "^3.0.0" + "acorn": "^6.0.7", + "acorn-walk": "^6.1.1", + "bfj": "^6.1.1", + "chalk": "^2.4.1", + "commander": "^2.18.0", + "ejs": "^2.6.1", + "express": "^4.16.3", + "filesize": "^3.6.1", + "gzip-size": "^5.0.0", + "lodash": "^4.17.10", + "mkdirp": "^0.5.1", + "opener": "^1.5.1", + "ws": "^6.0.0" + }, + "dependencies": { + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } } }, - "watchify": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/watchify/-/watchify-3.11.1.tgz", - "integrity": "sha512-WwnUClyFNRMB2NIiHgJU9RQPQNqVeFk7OmZaWf5dC5EnNa0Mgr7imBydbaJ7tGTuPM2hz1Cb4uiBvK9NVxMfog==", + "webpack-cli": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.1.tgz", + "integrity": "sha512-c2inFU7SM0IttEgF7fK6AaUsbBnORRzminvbyRKS+NlbQHVZdCtzKBlavRL5359bFsywXGRAItA5di/IruC8mg==", "dev": true, "requires": { - "anymatch": "^2.0.0", - "browserify": "^16.1.0", - "chokidar": "^2.1.1", - "defined": "^1.0.0", - "outpipe": "^1.1.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.0", + "findup-sync": "^2.0.0", + "global-modules": "^1.0.0", + "import-local": "^2.0.0", + "interpret": "^1.1.0", + "loader-utils": "^1.1.0", + "supports-color": "^5.5.0", + "v8-compile-cache": "^2.0.2", + "yargs": "^12.0.5" }, "dependencies": { - "acorn": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", - "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", - "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, - "acorn-node": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.2.tgz", - "integrity": "sha512-rIhNEZuNI8ibQcL7ANm/mGyPukIaZsRNX9psFNQURyJW0nu6k8wjSDld20z6v2mDBWqX13pIEnk9gGZJHIlEXg==", + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { - "acorn": "^6.0.2", - "acorn-dynamic-import": "^4.0.0", - "acorn-walk": "^6.1.0", - "xtend": "^4.0.1" + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, - "browserify": { - "version": "16.2.3", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz", - "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==", + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "JSONStream": "^1.0.3", - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^1.11.0", - "browserify-zlib": "~0.2.0", - "buffer": "^5.0.2", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "labeled-stream-splicer": "^2.0.0", - "mkdirp": "^0.5.0", - "module-deps": "^6.0.0", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^2.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" + "locate-path": "^3.0.0" } }, - "chokidar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz", - "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==", + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", "dev": true, "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.0" + "detect-file": "^1.0.0", + "is-glob": "^3.1.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" } }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" + "pump": "^3.0.0" } }, - "detective": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", - "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "acorn-node": "^1.6.1", - "defined": "^1.0.0", - "minimist": "^1.1.1" + "is-extglob": "^2.1.0" } }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", - "dev": true + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "dev": true, + "requires": { + "invert-kv": "^2.0.0" + } }, - "fsevents": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.7.tgz", - "integrity": "sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw==", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, - "optional": true, "requires": { - "nan": "^2.9.2", - "node-pre-gyp": "^0.10.0" - }, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "balanced-match": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "chownr": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "debug": { - "version": "2.6.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.3", - "bundled": true, - "dev": true, - "optional": true - }, - "fs-minipass": { - "version": "1.2.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "glob": { - "version": "7.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "iconv-lite": { - "version": "0.4.24", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ignore-walk": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.5", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "minipass": { - "version": "2.3.5", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "^5.1.2", - "yallist": "^3.0.0" - } - }, - "minizlib": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "minipass": "^2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "needle": { - "version": "2.2.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" - } - }, - "node-pre-gyp": { - "version": "0.10.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "mkdirp": "^0.5.1", - "needle": "^2.2.1", - "nopt": "^4.0.1", - "npm-packlist": "^1.1.6", - "npmlog": "^4.0.2", - "rc": "^1.2.7", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^4" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npm-bundled": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "npm-packlist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ignore-walk": "^3.0.1", - "npm-bundled": "^1.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rimraf": { - "version": "2.6.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.1.2", - "bundled": true, - "dev": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sax": { - "version": "1.2.4", - "bundled": true, - "dev": true, - "optional": true - }, - "semver": { - "version": "5.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "4.4.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "chownr": "^1.1.1", - "fs-minipass": "^1.2.5", - "minipass": "^2.3.4", - "minizlib": "^1.1.1", - "mkdirp": "^0.5.0", - "safe-buffer": "^5.1.2", - "yallist": "^3.0.2" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "yallist": { - "version": "3.0.3", - "bundled": true, - "dev": true - } + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "dev": true, + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" } }, - "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "is-extglob": "^2.1.1" + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, - "module-deps": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.0.tgz", - "integrity": "sha512-hKPmO06so6bL/ZvqVNVqdTVO8UAYsi3tQWlCa+z9KuWhoN4KDQtb5hcqQQv58qYiDE21wIvnttZEPiDgEbpwbA==", + "p-limit": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz", + "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==", "dev": true, "requires": { - "JSONStream": "^1.0.3", - "browser-resolve": "^1.7.0", - "cached-path-relative": "^1.0.0", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.0.2", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" + "p-try": "^2.0.0" } }, - "normalize-path": { + "p-locate": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" } }, - "vm-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz", - "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw==", - "dev": true + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", + "webpack-node-externals": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-1.7.2.tgz", + "integrity": "sha512-ajerHZ+BJKeCLviLUUmnyd5B4RavLF76uv3cs6KNuO8W+HuQaEs0y0L7o40NQxdPy5w0pcv8Ew7yPUAQG0UdCg==", "dev": true }, + "webpack-sources": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz", + "integrity": "sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.3.2.tgz", + "integrity": "sha512-VpBtk0Ha1W0GebTzPj3Y8UqbmPDp+HqGlegRv+hS8g8/x818dw9NuEfJEOp5CF6zTPs3KF6aqknVu52Bh5h1eQ==", + "dev": true, + "requires": { + "webpack-sources": "^1.3.0" + } + }, "whatwg-encoding": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", @@ -15215,23 +13659,12 @@ "dev": true, "requires": { "iconv-lite": "0.4.24" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - } } }, "whatwg-mimetype": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz", - "integrity": "sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", "dev": true }, "whatwg-url": { @@ -15249,7 +13682,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -15257,76 +13689,81 @@ "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" }, "widest-line": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", - "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-2.0.1.tgz", + "integrity": "sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==", "dev": true, "requires": { - "string-width": "^1.0.1" + "string-width": "^2.1.1" } }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true }, - "winston": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.3.tgz", - "integrity": "sha512-GYKuysPz2pxYAVJD2NPsDLP5Z79SDEzPm9/j4tCjkF/n89iBNGBMJcR+dMUqxgPNgoSs6fVygPi+Vl2oxIpBuw==", + "worker-farm": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", + "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", "dev": true, "requires": { - "async": "~1.0.0", - "colors": "1.0.x", - "cycle": "1.0.x", - "eyes": "0.1.x", - "isstream": "0.1.x", - "stack-trace": "0.0.x" + "errno": "~0.1.7" } }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write-file-atomic": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.1.tgz", + "integrity": "sha512-TGHFeZEZMnv+gBFRfjAcxL5bPHrsGKtnb4qsFAws7/vlh+QfwAaySIw4AXP9ZskTTh5GWu3FLuJhsWVdiJPGvg==", "dev": true, "requires": { "graceful-fs": "^4.1.11", "imurmurhash": "^0.1.4", - "slide": "^1.1.5" + "signal-exit": "^3.0.2" } }, "ws": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.0.tgz", - "integrity": "sha512-H3dGVdGvW2H8bnYpIDc3u3LH8Wue3Qh+Zto6aXXFzvESkTVT6rAfKR6tR/+coaUvxs8yHtmNV0uioBF62ZGSTg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "dev": true, "requires": { "async-limiter": "~1.0.0" @@ -15359,15 +13796,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true - }, - "user-home": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/user-home/-/user-home-2.0.0.tgz", - "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", - "dev": true, - "requires": { - "os-homedir": "^1.0.0" - } } } }, @@ -15399,12 +13827,6 @@ "integrity": "sha512-tGkGJkN8XqCod7OT+EvGYK5Z4SfDQGD30zAa58OcnAa0RRWgzUEK72tkXhsX1FZd+rgnhRxFtmO+ihkp8LHSkw==", "dev": true }, - "xmlhttprequest-ssl": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", - "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", - "dev": true - }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -15414,198 +13836,44 @@ "y18n": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" }, "yallist": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" }, "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", "requires": { - "camelcase": "^4.1.0", - "cliui": "^3.2.0", + "cliui": "^4.0.0", "decamelize": "^1.1.1", + "find-up": "^2.1.0", "get-caller-file": "^1.0.1", "os-locale": "^2.0.0", - "read-pkg-up": "^2.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1", - "yargs-parser": "^7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - } + "yargs-parser": "^9.0.2" } }, "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", "requires": { "camelcase": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } } }, - "yauzl": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", - "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", - "dev": true, - "requires": { - "fd-slicer": "~1.0.1" - } - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", - "dev": true + "yn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz", + "integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==" } } } diff --git a/package.json b/package.json index bef6725b..a5d50cc4 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Official JavaScript library for Filestack", "main": "build/main/index.js", "module": "build/module/index.js", - "browser": "build/browser/index.esm.js", + "browser": "build/browser/filestack.esm.js", "typings": "build/main/index.d.ts", "unpkg": "build/browser/filestack.min.js", "repository": "https://github.com/filestack/filestack-js", @@ -15,26 +15,21 @@ "build" ], "scripts": { - "build": "gulp build", + "build": "gulp build:typescript && npm run webpack", "build:main": "gulp typescript:main", "build:module": "gulp typescript:module", - "build:browser": "gulp build:rollup", - "lint": "tslint --project . src/**/*.ts", - "prism:mock": "node test/prism.js", - "prism:record": "node test/prism.js --record", - "toxy": "node test/toxy.js", - "test": "npm run build && npm run lint && npm-run-all -p -r 'prism:mock' 'toxy' 'test:runner'", - "test:runner": "TEST_ENV=unit karma start && TEST_ENV=unit nyc mocha", - "test:runner:mocha": "TEST_ENV=unit nyc mocha", - "test:runner:karma": "TEST_ENV=unit karma start", - "test:karma": "npm run build && npm run lint && npm-run-all -p -r 'prism:mock' 'toxy' 'test:runner:karma'", - "test:mocha": "npm run build && npm run lint && npm-run-all -p -r 'prism:mock' 'toxy' 'test:runner:mocha'", - "test:integration": "npm run build && npm run lint && TEST_ENV=integration karma start && TEST_ENV=integration nyc mocha", + "webpack": "npx webpack", + "webpack:profile": "npx webpack --profile --json > .stats.json", + "webpack:analyze": "npm run webpack:profile && npx webpack-bundle-analyzer .stats.json build/browser/", + "lint": "tslint -p tsconfig.tslint.json", + "test": "npm run lint && jest", + "test:watch": "npm t -- --watch", + "test:codecov": "npx codecov", "docs": "trash build/docs && typedoc src && opn build/docs/index.html", "docs:publish": "npm run docs && gh-pages -d build/docs", "release": "standard-version", - "prepare": "gulp build:prod", - "publish:pre": "gulp build:prod && node scripts/publish.js --pre", + "prepare": "npm run build", + "publish:pre": "npm run build && node scripts/publish.js --pre", "publish": "npm run docs:publish && node scripts/publish.js --current --latest", "examples": "npm run build && node ./examples/examples.js" }, @@ -43,85 +38,68 @@ }, "dependencies": { "abab": "^2.0.0", - "file-type": "^8.1.0", + "axios": "^0.18.0", + "debug": "^4.1.1", + "eventemitter3": "^3.1.2", + "file-type": "^10.0.0", "filestack-loader": "^3.0.4", - "is-svg": "^3.0.0", - "isutf8": "^2.0.2", + "isutf8": "^2.0.3", "jsonschema": "^1.2.4", + "p-queue": "^4.0.0", + "prettier-tslint": "^0.4.2", "spark-md5": "^3.0.0", - "superagent": "^3.8.3", - "tcomb-validation": "^3.4.1", + "ts-node": "^8.1.0", "tslib": "^1.9.3" }, "devDependencies": { - "@babel/core": "^7.3.4", - "@babel/preset-env": "^7.3.4", - "@types/mime": "^2.0.0", - "@types/mocha": "^2.2.48", - "@types/node": "^10.5.2", - "@types/sinon": "^5.0.1", - "@types/spark-md5": "^3.0.0", - "@types/superagent": "^3.8.3", - "aws-sdk": "^2.291.0", - "browserify": "^14.5.0", - "connect": "^3.6.6", - "connect-prism": "^1.0.20", - "cors": "^2.8.4", - "del": "^3.0.0", - "dotenv": "^4.0.0", - "electron": "^3.0.6", + "@babel/core": "^7.4.4", + "@babel/preset-env": "^7.4.4", + "@purtuga/esm-webpack-plugin": "^1.0.1", + "@types/jest": "^24.0.12", + "@types/mime": "^2.0.1", + "@types/node": "^12.0.0", + "@types/spark-md5": "^3.0.1", + "@types/uuid": "^3.4.4", + "aws-sdk": "^2.451.0", + "babel-loader": "^8.0.5", + "clean-webpack-plugin": "^2.0.2", + "codecov": "^3.3.0", + "compression-webpack-plugin": "^2.0.0", + "del": "^4.1.1", + "dotenv": "^8.0.0", "envify": "^4.1.0", - "express": "^4.16.4", - "fs-jetpack": "^2.2.0", - "gh-pages": "^1.2.0", - "gulp": "^4.0.0", - "gulp-better-rollup": "3.1.0", + "fs-jetpack": "^2.2.2", + "gh-pages": "^2.0.1", + "gulp": "^4.0.2", "gulp-gzip": "^1.4.2", "gulp-rename": "^1.4.0", "gulp-replace": "^1.0.0", - "gulp-rollup": "^2.16.2", - "gulp-sourcemaps": "^2.6.4", - "gulp-typescript": "^4.0.2", - "gulp-uglify": "^3.0.1", - "har-validator": "^5.1.3", - "js-yaml": "^3.12.0", - "jsdom": "13.0.0", - "jsdom-global": "3.0.2", - "karma": "^3.1.1", - "karma-browserify": "^5.3.0", - "karma-browserstack-launcher": "^1.4.0", - "karma-chrome-launcher": "^2.2.0", - "karma-electron": "^6.0.0", - "karma-firefox-launcher": "^1.1.0", - "karma-mocha": "^1.3.0", - "karma-rollup-preprocessor": "^6.1.0", - "mime-types": "^2.1.19", - "mocha": "^5.2.0", - "npm-run-all": "^4.1.5", - "nyc": "^13.3.0", - "opn-cli": "^3.1.0", - "rollup": "^0.57.0", - "rollup-plugin-alias": "^1.4.0", - "rollup-plugin-babel": "^4.3.2", - "rollup-plugin-commonjs": "^9.2.0", - "rollup-plugin-json": "^3.1.0", - "rollup-plugin-node-builtins": "^2.1.2", - "rollup-plugin-node-globals": "^1.4.0", - "rollup-plugin-node-resolve": "^3.4.0", - "rollup-plugin-replace": "^2.1.0", - "rollup-watch": "^4.3.1", - "sinon": "^7.1.1", - "standard-version": "^4.4.0", - "toxy": "^0.3.16", - "trash-cli": "^1.4.0", - "tslint": "^5.11.0", - "tslint-config-semistandard": "^7.0.0", + "gulp-typescript": "^5.0.1", + "jest": "^24.8.0", + "jest-localstorage-mock": "^2.4.0", + "jest-mock": "^24.8.0", + "js-yaml": "^3.13.1", + "jsdom": "^15.0.0", + "lodash.clonedeep": "^4.5.0", + "lodash.merge": "^4.6.1", + "nock": "^10.0.6", + "opn-cli": "^4.1.0", + "prettier": "^1.17.0", + "prettier-tslint": "^0.4.2", + "standard-version": "^6.0.1", + "trash-cli": "^2.0.0", + "ts-jest": "^24.0.2", + "tslint": "^5.16.0", + "tslint-config-semistandard": "^8.0.0", "typedoc": "^0.14.2", - "typescript": "^2.9.2", - "uglify-es": "^3.3.10", - "url": "^0.11.0", + "typescript": "^3.4.5", "validate-commit-msg": "^2.14.0", - "watchify": "^3.11.1" + "webpack": "^4.30.0", + "webpack-assets-manifest": "^3.1.1", + "webpack-bundle-analyzer": "^3.3.2", + "webpack-cli": "^3.3.1", + "webpack-node-externals": "^1.7.2", + "webpack-subresource-integrity": "^1.3.2" }, "keywords": [ "filestack", diff --git a/releases/filestack-js-3.0.0-relase.md b/releases/filestack-js-3.0.0-relase.md new file mode 100644 index 00000000..e5a89117 --- /dev/null +++ b/releases/filestack-js-3.0.0-relase.md @@ -0,0 +1,113 @@ +# Filestack-js@3.0.0 Releases notes + +## Features +- **[BREAKING]** add name sanitization
+ by default following characters: + ``` + ['\\', '{', '}', '|', '%', '`', '"', "'", '~', '[', ']', '#', '|', '^', '<', '>'] + ``` + will be replaced with '-'

+ to disable sanitizer set storeUploadOption - sanitizer to false

+ @see https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html + +- **[ENHANCEMENT]** storeUrl now use new base64 transform protocol by default +- **[ENHANCEMENT]** Add escape params with ',' in storeUrl method +- **[FEATURE]** add multiupload feature + ```js + client + .multiupload([file1, file2, file3], { onRetry }, { filename: (normalizedFile) => { + return 'newname.jpg' + } }, token) + .then(res => console.log(res)); + ``` + +- **[ENHANCEMENT]** rewrite retry policy (retry on all 5xx request and connection errors, do not retry on 4xx errors) +- **[ENHANCEMENT]** update progress event (now its returning overall progress and for each file) +- **[FEATURE]** add debug for uploads +- **[FEATURE]** filename now supports function: + ```js + client + .upload(file, { onRetry }, { filename: (normalizedFile) => { + return 'newname.jpg' + } }, token) + .then(res => console.log(res)); + ``` +- **[FEATURE]** file argument in upload now supports "named file" object so, we can pass name for each file + ```js + client + .upload({ + file, + name: (normalizedFile) => 'newname.jpg' + }) + .then(res => console.log(res)); + ``` +- **[ENHANCEMENT]** added setSecurity and setCname methods to client + + ```js + client + .setSecurity({ + policy: 'newPolicy' + signature: 'newSignature' + }) + .upload({ + file, + name: (normalizedFile) => 'newname.jpg' + }) + .then(res => console.log(res)); + ``` +- **[ENHANCEMENT]** rewrite all options validation to JSONSchema and remove old tcomb library + ```js + const apikey = 'YOUR_APIKEY'; + const src = new filestack.Filelink('EXAMPLE_HANDLE', apikey) + try { + src.blur({amount: 15}) + .resize({ + wrongOption: 720, + height: 480, + } + ); + }.catch(e: FilestackError => { + console.log(e.message); + console.log(e.details); // detailed validation errors + }) + + ``` + + ```js + try { + client + .picker({ + wrongPickerOption: true + }) + .open(); + }.catch(e: FilestackError => { + console.log(e.message); + console.log(e.details); // detailed validation errors + }) + + ``` +- **[ENHANCEMENT]** rewrite all tests (now tests are splitted to integrations and units) +- **[ENHANCEMENT]** change request library to axios (better error handling) +- **[FEATURE]** add missing transformations uglifyJs and uglifyCss +- minor fixes + +## Deprecation: +- **[BREAKING]** remove preferLinkOverStorage picker option + +## Others: +- Rewrite upload to objective typescript +- move to new build system (webpack) +- add codeconv service and setup pull requests to minimum tests coverage (99%) +- add sri hashes to manifest.json +- update outdated packages +- cleanup unused packages + +## Picker +- add viewType option, now user can set default view type option [#157] +- add transformations: { force: true } to allow force crop for ie. circle transformation [#122] +- fix problem with dropPane and cropFiles [#228] +- fix problem with generating uploadId [#230] +- fix problem with passing undefined options to picker [#95] +- fix problem with disabling crop transformation [#148] +- incrise messages duration to 8s +- add new translation for notification in image search [#227] diff --git a/rollup.config.js b/rollup.config.js deleted file mode 100644 index 50cd0224..00000000 --- a/rollup.config.js +++ /dev/null @@ -1,91 +0,0 @@ -const alias = require('rollup-plugin-alias'); -const builtins = require('rollup-plugin-node-builtins'); -const commonjs = require('rollup-plugin-commonjs'); -const globals = require('rollup-plugin-node-globals'); -const nodeResolve = require('rollup-plugin-node-resolve'); -const replace = require('rollup-plugin-replace'); -const json = require('rollup-plugin-json'); -const babel = require('rollup-plugin-babel'); - -const adapters = { - './lib/api/security': 'build/module/adapters/security.browser.js', - './file_utils': 'build/module/adapters/file_utils.browser.js', - './is_mobile': 'build/module/adapters/is_mobile.browser.js', -}; - -const namedExports = { - 'node_modules/tcomb-validation/index.js': [ - 'Boolean', - 'Function', - 'Integer', - 'Number', - 'String', - 'enums', - 'refinement', - 'union', - 'tuple', - 'struct', - 'validate', - 'maybe', - 'list' - ], - 'node_modules/superagent/lib/client.js': [ - 'get', - 'post', - 'put', - 'delete', - 'head' - ], - 'node_modules/ajv/lib/ajv.js': ['Ajv'], - 'node_modules/bowser/src/bowser.js': [ 'mobile' ], - 'node_modules/spark-md5/spark-md5.js': [ 'ArrayBuffer' ] -}; - -const plugins = [ - alias(adapters), - json({ - include: 'node_modules/**', - preferConst: true, // Default: false - indent: ' ', - namedExports: true - }), - nodeResolve({ - browser: true, - preferBuiltins: true, - }), - commonjs({ - include: 'node_modules/**', - namedExports: namedExports, - }), - replace({ - 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), - 'process.env.TEST_ENV': JSON.stringify(process.env.TEST_ENV), - }), - babel({ - runtimeHelpers: true, - presets: [ - [ - "@babel/preset-env", - { - targets: "> 0.25%, not dead", - }, - ], - ], - }), -]; - -plugins.push(builtins()); -plugins.push(globals()); - -module.exports = { - input: 'build/module/index.js', - // external: ['ajv'], - onwarn: function(warning) { - // Skip certain warnings - // should intercept ... but doesn't in some rollup versions - if ( warning.code === 'THIS_IS_UNDEFINED' ) { return; } - // console.warn everything else - console.warn( warning.message ); - }, - plugins -}; diff --git a/scripts/build.js b/scripts/build.js index 1a81011a..952f739b 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -1,20 +1,9 @@ const gulp = require('gulp'); -const path = require('path'); -const fs = require('fs'); -const sourcemaps = require('gulp-sourcemaps'); const ts = require('gulp-typescript'); const replace = require('gulp-replace'); -const uglifyEs = require('uglify-es'); -const composer = require('gulp-uglify/composer'); -const betterRollup = require('gulp-better-rollup') const del = require('del'); -const rollupConfig = require('../rollup.config') const version = require('../package.json').version; -const uglify = composer(uglifyEs); -const rename = require('gulp-rename'); -const gzip = require('gulp-gzip'); -// const debug = require('gulp-debug'); gulp.task('build:clean', function () { return del([ 'build/**/*' @@ -39,56 +28,4 @@ gulp.task('typescript:modules', () => { gulp.task('build:typescript', gulp.series(['typescript:main', 'typescript:modules'])); -gulp.task('build:rollup', gulp.series('build:typescript', () => { - return gulp.src('build/module/index.js') - .pipe(sourcemaps.init()) - .pipe(betterRollup(rollupConfig, [{ - file: 'index.esm.js', - format: 'es', - }, { - file: 'index.umd.js', - name: 'filestack', - format: 'umd', - }])) - .on('error', function (err) { - console.log('Rollup error:', err) - }) - .pipe(sourcemaps.write('.')) - .pipe(gulp.dest('build/browser')) -})); - -gulp.task('build:uglify', gulp.series('build:rollup', () => { - const uglifyOptions = { - warnings: false, - output: { - preamble: fs.readFileSync(path.join(__dirname, '..', 'LICENSE')).toString('utf8').replace('${year}', new Date().getFullYear()), - }, - compress: { - pure_getters: true, - unsafe: true, - unsafe_comps: true, - }, - }; - - return gulp.src(['build/browser/index.umd.js']) - .pipe(sourcemaps.init({ - loadMaps: true, - })) - .pipe(uglify(uglifyOptions)) - .on('error', function (err) { - console.log('Uglify error:', err) - }) - .pipe(rename({ suffix: '.min', basename: 'filestack' })) - .pipe(sourcemaps.write('.')) - .pipe(gulp.dest('build/browser')); -})); - -gulp.task('build', gulp.series(['build:clean', 'build:rollup'])); - -gulp.task('build:prod', gulp.series(['build:clean', 'build:uglify', () => { - return gulp.src(['build/browser/filestack.min.js']) - .pipe(gzip({ - preExtension: 'gz' - })) - .pipe(gulp.dest('build/browser')); -}])); +gulp.task('build', gulp.series(['build:clean', 'build:typescript'])); diff --git a/scripts/publish.js b/scripts/publish.js index b2dd0cd5..8dfa54d6 100644 --- a/scripts/publish.js +++ b/scripts/publish.js @@ -14,6 +14,7 @@ const figureOutFileMimetype = (file) => { if (type !== false) { return type; } + return 'application/octet-stream'; }; @@ -100,7 +101,7 @@ if (args.indexOf('--current') > -1) { } if (args.indexOf('--pre') > -1) { - console.log(`publishing to prerelase version ${version}-pre`); + console.log(`publishing to prerelease version ${version}-pre`); versionsToPublish.push({ bucket, folder: `filestack-js/${version}-pre`, diff --git a/src/adapters/file_utils.browser.ts b/src/adapters/file_utils.browser.ts deleted file mode 100644 index 4a81bce5..00000000 --- a/src/adapters/file_utils.browser.ts +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (c) 2018 by Filestack. - * Some rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { atob } from 'abab'; -import { calcMD5 } from '../lib/api/upload/md5'; -import { Context, PartObj } from '../lib/api/upload/types'; - -/** - * Is file? - * - * @private - * @return {Boolean} - */ -const isFile = (file: any): boolean => { - return file.toString() === '[object File]'; -}; - -/** - * Is blob? - * - * @private - * @param blob - * @returns {Boolean} - */ -const isBlob = (blob: any): boolean => { - return isFile(blob) || (blob.toString() === '[object Blob]'); -}; - -/** - * Convert encoded base64 string or dataURI to blob - * @param b64data String to decode - * @param sliceSize Byte quantity to split data into - * @private - * @returns {Blob} - */ -const b64toBlob = (b64Data: string, sliceSize = 512) => { - let byteString; - let contentType = ''; - if (b64Data.split(',')[0].indexOf('base64') >= 0) { - byteString = b64Data.split(',')[1]; - } - if (byteString !== undefined) { - contentType = b64Data.split(',')[0].split(':')[1].split(';')[0]; - b64Data = decodeURI(byteString); - } - const byteCharacters = atob(b64Data); - const byteArrays: any[] = []; - for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) { - const slice = byteCharacters.slice(offset, offset + sliceSize); - const byteNumbers = new Array(slice.length); - for (let i = 0; i < slice.length; i += 1) { - byteNumbers[i] = slice.charCodeAt(i); - } - const byteArray = new Uint8Array(byteNumbers); - byteArrays.push(byteArray); - } - const blob = new Blob(byteArrays, { type: contentType }); - return blob; -}; - -/** - * Get start and end for slice operations - * @private - * @returns Object where keys are `start` and `end` - */ -const getRange = ({ config, file }: Context, partNumber: number) => { - const start = partNumber * config.partSize; - const end = Math.min(start + config.partSize, file.size); - return { start, end }; -}; - -/** - * Slice file into a single part - * @private - */ -const sliceFile = (ctx: Context, partNumber: number) => { - const { start, end } = getRange(ctx, partNumber); - - return ctx.file.slice(start, end); -}; - -/** - * Reads file as ArrayBuffer using HTML5 FileReader implementation - * @private - * @param file Valid File instance - * @returns {Promise} - */ -const readFile = (file: any) => { - return new Promise((resolve, reject) => { - let reader; - if (File && FileReader && Blob) { - reader = new FileReader(); - reader.onloadend = resolve; - reader.onerror = reject; - reader.readAsArrayBuffer(file); - } else { - reject(new Error('The File APIs are not fully supported by your browser')); - } - }); -}; - -/** - * Reads a slice of a file based on the current part. - * @private - */ -export const getPart = (part: PartObj, ctx: Context) => { - return readFile(sliceFile(ctx, part.number)) - .then((evt: any) => { - const buffer = evt.target.result; - const newPart = { - ...part, - buffer, - size: buffer.byteLength, - md5: calcMD5(buffer), - }; - return newPart; - }); -}; - -/** - * Get a Blob from a File or string. - * @private - */ -export const getFile = (fileOrString: any): Promise => { - let file: any = fileOrString; - if (typeof fileOrString === 'string') { - file = b64toBlob(file); - } - if (!file || !isBlob(file)) { - return Promise.reject(new TypeError('File argument is not a valid Blob')); - } - return Promise.resolve(file); -}; - -/** - * This is a noop in browsers - */ -export const closeFile = () => undefined; diff --git a/src/adapters/is_mobile.browser.ts b/src/adapters/is_mobile.browser.ts deleted file mode 100644 index 938d99cb..00000000 --- a/src/adapters/is_mobile.browser.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2018 by Filestack. - * Some rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -declare var navigator: any; -declare var window: any; - -export const isMobile = () => { - const vendor = navigator.userAgent || navigator.vendor || window.opera; - - return !!( - /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test( - vendor - ) || - /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw-(n|u)|c55\/|capi|ccwa|cdm-|cell|chtm|cldc|cmd-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc-s|devi|dica|dmob|do(c|p)o|ds(12|-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(-|_)|g1 u|g560|gene|gf-5|g-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd-(m|p|t)|hei-|hi(pt|ta)|hp( i|ip)|hs-c|ht(c(-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i-(20|go|ma)|i230|iac( |-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|-[a-w])|libw|lynx|m1-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|-([1-8]|c))|phil|pire|pl(ay|uc)|pn-2|po(ck|rt|se)|prox|psio|pt-g|qa-a|qc(07|12|21|32|60|-[2-7]|i-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h-|oo|p-)|sdk\/|se(c(-|0|1)|47|mc|nd|ri)|sgh-|shar|sie(-|m)|sk-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h-|v-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl-|tdg-|tel(i|m)|tim-|t-mo|to(pl|sh)|ts(70|m-|m3|m5)|tx-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas-|your|zeto|zte-/i.test( - vendor.substr(0, 4) - ) - ); -}; diff --git a/src/config.ts b/src/config.ts index 9c9b605b..eec80f10 100644 --- a/src/config.ts +++ b/src/config.ts @@ -18,7 +18,7 @@ /** * @private */ -const PICKER_VERSION = '1.4.8'; +const PICKER_VERSION = '1.4.9'; /** * @private @@ -39,30 +39,12 @@ export interface Config { urls: Hosts; } -/** - * @private - */ -export let config: Config; - -/* istanbul ignore next */ -if (process.env.NODE_ENV === 'production') { - config = { - urls: { - fileApiUrl: 'https://www.filestackapi.com/api/file', - uploadApiUrl: 'https://upload.filestackapi.com', - cloudApiUrl: 'https://cloud.filestackapi.com', - cdnUrl: 'https://cdn.filestackcontent.com', - pickerUrl: `https://static.filestackapi.com/picker/${PICKER_VERSION}/picker.js`, - }, - }; -} else { - config = { - urls: { - fileApiUrl: 'https://www.filestackapi.com/api/file', - uploadApiUrl: 'https://upload.filestackapi.com', - cloudApiUrl: 'https://cloud.filestackapi.com', - cdnUrl: 'https://cdn.filestackcontent.com', - pickerUrl: `https://static.filestackapi.com/picker/${PICKER_VERSION}/picker.js`, - }, - }; -} +export const config = { + urls: { + fileApiUrl: 'https://www.filestackapi.com/api/file', + uploadApiUrl: 'https://upload.filestackapi.com', + cloudApiUrl: 'https://cloud.filestackapi.com', + cdnUrl: 'https://cdn.filestackcontent.com', + pickerUrl: `https://static.filestackapi.com/picker/${PICKER_VERSION}/picker.js`, + }, +}; diff --git a/src/filestack_error.spec.ts b/src/filestack_error.spec.ts new file mode 100644 index 00000000..2530bcde --- /dev/null +++ b/src/filestack_error.spec.ts @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { FilestackError } from './filestack_error'; + +describe('FilestackError', () => { + it('should work without params', () => { + expect(() => new FilestackError()).not.toThrow(); + }); + + it('should work with only message parrams', () => { + expect((new FilestackError('Some message')).message).toEqual('Some message'); + }); + + it('should allow pass details', () => { + expect((new FilestackError('Some message', { errors : 123 })).details).toEqual({ errors : 123 }); + }); +}); diff --git a/src/FilestackError.ts b/src/filestack_error.ts similarity index 77% rename from src/FilestackError.ts rename to src/filestack_error.ts index 9bdb660d..3ec3bbc9 100644 --- a/src/FilestackError.ts +++ b/src/filestack_error.ts @@ -15,6 +15,12 @@ * limitations under the License. */ +export enum FilestackErrorType { + VALIDATION = 'validation', + REQUEST = 'request', + OTHER = 'other', +} + export class FilestackError extends Error { /** @@ -24,11 +30,16 @@ export class FilestackError extends Error { * @memberof FilestackError */ public readonly details: any; + public readonly type: string; - constructor(message: string, details?: any) { + constructor(message?: string, details?: any, type?: FilestackErrorType) { + + /* istanbul ignore next */ super(message); + Object.setPrototypeOf(this, FilestackError.prototype); this.details = details; + this.type = type; } } diff --git a/src/index.ts b/src/index.ts index 2101ef01..4f022780 100644 --- a/src/index.ts +++ b/src/index.ts @@ -36,6 +36,7 @@ export const version = '@{VERSION}'; export * from './lib/api/transform'; export * from './lib/filelink'; +export * from './filestack_error'; export { TransformSchema, diff --git a/src/lib/api/cloud.spec.browser.ts b/src/lib/api/cloud.spec.browser.ts new file mode 100644 index 00000000..39e87061 --- /dev/null +++ b/src/lib/api/cloud.spec.browser.ts @@ -0,0 +1,431 @@ +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { config } from './../../config'; +import { CloudClient, PICKER_KEY } from './cloud'; +import * as nock from 'nock'; + +const testApiKey = 'API_KEY'; +const testTokSession = 'TOK_SESSION'; +const testTokArchiveId = 'ARCHIVE_ID'; + +const testCloudToken = 'testCloudToken'; + +const testSecurity = { + policy: 'examplePolicy', + signature: 'exampleSignature', +}; + +const sessionURls = config.urls; +const testSession = { + apikey: testApiKey, + urls: sessionURls, +}; + +let scope = nock(sessionURls.cloudApiUrl); + +const mockTokInit = jest + .fn() + .mockName('tokInit') + .mockReturnValue('init'); + +const mockTokStart = jest + .fn() + .mockName('tokStart') + .mockReturnValue('start'); + +const mockTokStop = jest + .fn() + .mockName('tokStop') + .mockReturnValue('stop'); + +const mockMetadata = jest + .fn() + .mockName('metadata') + .mockReturnValue('metadata'); + +const mockPrefetch = jest + .fn() + .mockName('prefetch') + .mockReturnValue('prefetch'); + +const mockList = jest + .fn() + .mockName('list') + .mockImplementation(data => { + if (data && data.clouds.token) { + return { token: testCloudToken }; + } + + return data; + }); + +const mockLogout = jest + .fn() + .mockName('logout') + .mockImplementation((url, data) => { + const params = data ? JSON.parse(data) : {}; + + if (data && params.clouds && params.clouds.token) { + return { token: testCloudToken }; + } + + return data; + }); + +const mockStore = jest + .fn() + .mockName('store') + .mockImplementation(params => { + if (params && params.clouds && params.clouds.token) { + return JSON.stringify({ token: testCloudToken }); + } + + return JSON.stringify(params); + }); + +describe('cloud', () => { + beforeEach(() => { + scope + .persist() + .options(/.*/) + .reply(204, '', { + 'access-control-allow-headers': 'filestack-source,filestack-trace-id,filestack-trace-span', + 'access-control-allow-methods': '*', + 'access-control-allow-origin': '*', + }); + + scope + .get('/prefetch') + .query({ apikey: testApiKey }) + .reply(200, mockPrefetch); + + scope.post('/auth/logout/').reply(200, mockLogout); + scope.post('/folder/list').reply(200, (_, data) => mockList(JSON.parse(data))); + scope.post('/store/').reply(200, (_, data) => mockStore(JSON.parse(data))); + scope.post('/metadata/').reply(200, mockMetadata); + + scope.post(/\/recording\/(audio|video)\/init/).reply(200, mockTokInit); + scope.post(/\/recording\/(audio|video)\/start/).reply(200, mockTokStart); + scope.post(/\/recording\/(audio|video)\/stop/).reply(200, mockTokStop); + }); + + afterEach(() => { + nock.cleanAll(); + jest.clearAllMocks(); + localStorage.clear(); + }); + + describe('prefetch', () => { + it('should make correct request to api', async () => { + const res = await new CloudClient(testSession).prefetch(); + + expect(mockPrefetch).toHaveBeenCalledWith(expect.any(String), ''); + expect(res).toEqual('prefetch'); + }); + }); + + describe('list', () => { + it('should make correct list request', async () => { + const clouds = { test: true }; + + const res = await new CloudClient(testSession).list({ ...clouds }); + + expect(res).toEqual({ + apikey: testApiKey, + flow: 'web', + clouds, + }); + }); + + it('should make correct list request with session cache', async () => { + const clouds = { test: true }; + localStorage.setItem(PICKER_KEY, testCloudToken); + + const res = await new CloudClient(testSession, { + sessionCache: true, + }).list({ ...clouds }); + + expect(res).toEqual({ + apikey: testApiKey, + flow: 'web', + token: testCloudToken, + clouds, + }); + }); + + it('should set token on api token response', async () => { + const clouds = { token: true }; + const res = await new CloudClient(testSession).list({ ...clouds }); + + expect(res).toEqual({ token: testCloudToken }); + }); + + it('should cache session token to local storage', async () => { + const clouds = { token: true }; + + const res = await new CloudClient(testSession, { sessionCache: true }).list({ ...clouds }); + + expect(localStorage.setItem).toHaveBeenCalledWith(PICKER_KEY, testCloudToken); + expect(res).toEqual({ token: testCloudToken }); + }); + + it('should make correct list request with security', async () => { + const clouds = { test: true }; + + const res = await new CloudClient({ + ...testSession, + ...testSecurity, + }).list({ ...clouds }); + + expect(res).toEqual({ + apikey: testApiKey, + flow: 'web', + clouds, + ...testSecurity, + }); + }); + }); + + describe('store', () => { + it('should make correct basic request', async () => { + const res = await new CloudClient(testSession).store('google', 'test', { filename: '1' }); + + expect(res).toEqual({ + apikey: testApiKey, + flow: 'web', + clouds: { + google: { + path: 'test', + store: { + filename: '1', + location: 's3', + }, + }, + }, + }); + }); + + it('should respect store location param', async () => { + const res = await new CloudClient(testSession).store('google', 'test', { filename: '1', location: 'gcs' }); + + expect(res).toEqual({ + apikey: testApiKey, + flow: 'web', + clouds: { + google: { + path: 'test', + store: { + filename: '1', + location: 'gcs', + }, + }, + }, + }); + }); + + it('should make correct basic with security', async () => { + const res = await new CloudClient({ + ...testSession, + ...testSecurity, + }).store('token', 'test', { filename: '1' }); + + const excepted = { + ...testSecurity, + apikey: testApiKey, + flow: 'web', + clouds: { + token: { + path: 'test', + store: { + filename: '1', + location: 's3', + }, + }, + }, + }; + + expect(mockStore).toHaveBeenCalledWith(excepted); + expect(res).toEqual(testCloudToken); + }); + + it('should handle custom source', async () => { + const customSource = { + customSourcePath: 'cs_path', + customSourceContainer: 'cs_container', + }; + + const res = await new CloudClient(testSession).store('customsource', 'test', { filename: '1' }, customSource); + + expect(res).toEqual({ + apikey: testApiKey, + flow: 'web', + clouds: { + customsource: { + ...customSource, + path: 'test', + store: { + filename: '1', + location: 's3', + }, + }, + }, + }); + }); + }); + + describe('logout', () => { + it('should make correct request to logout', async () => { + expect(await new CloudClient(testSession).logout()).toEqual({ apikey: 'API_KEY', flow: 'web' }); + }); + + it('should make correct request to logout with provided cloud', async () => { + expect(await new CloudClient(testSession).logout('google')).toEqual({ apikey: 'API_KEY', flow: 'web', clouds: { google: {} } }); + }); + + it('should make correct request to logout and return correct response when cloud name is returned', async () => { + expect(await new CloudClient(testSession).logout('token')).toEqual('testCloudToken'); + }); + + it('should make correct request to logout and clean session cache ', async () => { + localStorage.setItem(PICKER_KEY, testCloudToken); + + const res = await new CloudClient(testSession, { sessionCache: true }).logout(); + + expect(localStorage.removeItem).toHaveBeenCalledWith(PICKER_KEY); + expect(res).toEqual({ apikey: 'API_KEY', flow: 'web', token: testCloudToken }); + }); + }); + + describe('metadata', () => { + it('should make correct request', async () => { + const testUrl = 'http://test.com'; + + const res = await new CloudClient(testSession).metadata(testUrl); + + expect(mockMetadata).toHaveBeenCalledWith( + expect.any(String), + JSON.stringify({ + apikey: testApiKey, + url: testUrl, + }) + ); + expect(res).toEqual('metadata'); + }); + + it('should make correct request with security', async () => { + const testUrl = 'http://test.com'; + + const res = await new CloudClient({ + ...testSession, + ...testSecurity, + }).metadata(testUrl); + + expect(mockMetadata).toHaveBeenCalledWith( + expect.any(String), + JSON.stringify({ + apikey: testApiKey, + url: testUrl, + ...testSecurity, + }) + ); + expect(res).toEqual('metadata'); + }); + }); + + describe('OpenTok', () => { + describe('tokInit', () => { + it('should make correct request to api (audio)', async () => { + const res = await new CloudClient(testSession).tokInit('audio'); + + expect(mockTokInit).toHaveBeenCalledWith(expect.any(String), ''); + expect(res).toEqual({ body: 'init' }); + }); + + it('should make correct request to api (video)', async () => { + const res = await new CloudClient(testSession).tokInit('audio'); + + expect(mockTokInit).toHaveBeenCalledWith(expect.any(String), ''); + expect(res).toEqual({ body: 'init' }); + }); + + it('should throw on wrong type', async() => { + expect(() => { + new CloudClient(testSession).tokInit('videoa').then(() => { + console.log('init'); + }).catch(() => { + console.log('err'); + }); + }).toThrowError(); + }); + }); + + describe('tokStart', () => { + it('should make correct request to api (audio)', async () => { + const res = await new CloudClient(testSession).tokStart('audio', 'key', testTokSession); + + expect(mockTokStart).toHaveBeenCalledWith(expect.any(String), JSON.stringify({ apikey: 'key', session_id: testTokSession })); + expect(res).toEqual({ body: 'start' }); + }); + + it('should make correct request to api (video)', async () => { + const res = await new CloudClient(testSession).tokStart('video', 'key', testTokSession); + + expect(mockTokStart).toHaveBeenCalledWith(expect.any(String), JSON.stringify({ apikey: 'key', session_id: testTokSession })); + expect(res).toEqual({ body: 'start' }); + }); + + it('should throw on wrong type', () => { + expect(() => new CloudClient(testSession).tokStart('videoa', 'key', testTokSession)).toThrowError(); + }); + }); + + describe('tokStop', () => { + it('should make correct request to api (audio)', async () => { + const res = await new CloudClient(testSession).tokStop('audio', 'key', testTokSession, testTokArchiveId); + + expect(mockTokStop).toHaveBeenCalledWith( + expect.any(String), + JSON.stringify({ + apikey: 'key', + session_id: testTokSession, + archive_id: testTokArchiveId, + }) + ); + expect(res).toEqual({ body: 'stop' }); + }); + + it('should make correct request to api (video)', async () => { + const res = await new CloudClient(testSession).tokStop('video', 'key', testTokSession, testTokArchiveId); + + expect(mockTokStop).toHaveBeenCalledWith( + expect.any(String), + JSON.stringify({ + apikey: 'key', + session_id: testTokSession, + archive_id: testTokArchiveId, + }) + ); + expect(res).toEqual({ body: 'stop' }); + }); + + it('should throw on wrong type', () => { + expect(() => new CloudClient(testSession).tokStop('videoa', 'key', testTokSession, testTokArchiveId)).toThrowError(); + }); + }); + }); +}); diff --git a/src/lib/api/cloud.spec.ts b/src/lib/api/cloud.spec.ts deleted file mode 100644 index 485359d9..00000000 --- a/src/lib/api/cloud.spec.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2018 by Filestack. - * Some rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as assert from 'assert'; -import { CloudClient, PICKER_KEY } from './cloud'; - -declare var ENV: any; - -const session = ENV.cloudSession; -const secureSession = ENV.secureCloudSession; -const mockClouds = { - facebook: { - path: '/', - }, -}; - -describe('cloud', function cloud() { - this.timeout(60000); - - it('should construct an instance of CloudClient', () => { - const client = new CloudClient(session); - assert.ok(client.session = session); - assert.ok(client instanceof CloudClient); - }); - - it('should call prefetch for application profile', (done) => { - const client = new CloudClient(session); - client.prefetch() - .then((res: any) => { - assert.ok(res); - assert.ok(res.whitelabel); - done(); - }) - .catch((err: any) => { - done(err); - }); - }); - - it('should call list with security', (done) => { - const client = new CloudClient(secureSession); - client.list(mockClouds) - .then((res: any) => { - assert.ok(res); - done(); - }) - .catch((err: any) => { - done(err); - }); - }); - - it('should save token if sessionCache is true -- BROWSER ONLY', (done) => { - if (typeof localStorage === 'undefined') { - return done(); - } - - const client = new CloudClient(session, { sessionCache: true }); - client.list(mockClouds) - .then((res: any) => { - assert.ok(res); - const cached = localStorage.getItem(PICKER_KEY); - assert.ok(cached === res.token); - done(); - }) - .catch((err: any) => { - done(err); - }); - }); - -}); diff --git a/src/lib/api/cloud.ts b/src/lib/api/cloud.ts index dbfecbb8..08475369 100644 --- a/src/lib/api/cloud.ts +++ b/src/lib/api/cloud.ts @@ -15,9 +15,11 @@ * limitations under the License. */ -import { ClientOptions, Session, StoreOptions } from '../client'; import { removeEmpty } from '../utils'; -import { requestWithSource as request } from '../api/request'; +import { StoreParams } from '../filelink'; +import { ClientOptions, Session } from '../client'; +import { requestWithSource, request } from '../api/request'; +import { FilestackError } from './../../filestack_error'; /** * @private @@ -36,6 +38,7 @@ export class CloudClient { constructor(session: Session, options?: ClientOptions) { this.session = session; this.cloudApiUrl = session.urls.cloudApiUrl; + if (options && options.sessionCache) { this.cache = options.sessionCache; } @@ -60,44 +63,46 @@ export class CloudClient { const params = { apikey: this.session.apikey, }; - return request('get', `${this.cloudApiUrl}/prefetch`) - .query(params) - .then((res: any) => res.body); + return requestWithSource() + .get(`${this.cloudApiUrl}/prefetch`, { params }) + .then(res => res.data); } - list(clouds: any, token: any = {}) { + list(clouds: any, token?: any) { const payload: any = { apikey: this.session.apikey, clouds, flow: 'web', token: this.token, }; + if (this.session.policy && this.session.signature) { payload.policy = this.session.policy; payload.signature = this.session.signature; } - return new Promise((resolve, reject) => { - const req = request('post', `${this.cloudApiUrl}/folder/list`) - .send(payload) - .end((err: Error, response: any) => { - if (err) { - reject(err); - } else { - if (response.body && response.body.token) { - this.token = response.body.token; - } - resolve(response.body); - } - }); - token.cancel = () => { - req.abort(); - reject(new Error('Cancelled')); - }; - }); - } - store(name: string, path: string, options: StoreOptions = {}, customSource: any = {}, token: any = {}) { + let options: any = {}; + + if (token) { + const CancelToken = request.CancelToken; + const source = CancelToken.source(); + token.cancel = source.cancel; + + options.cancelToken = source.token; + } + + return requestWithSource() + .post(`${this.cloudApiUrl}/folder/list`, payload, options) + .then(res => { + if (res.data && res.data.token) { + this.token = res.data.token; + } + return res.data; + }); + } + + store(name: string, path: string, options: StoreParams = {}, customSource: any = {}, token?: any) { // Default to S3 if (options.location === undefined) options.location = 's3'; @@ -126,77 +131,29 @@ export class CloudClient { payload.signature = this.session.signature; } - return new Promise((resolve, reject) => { - const req = request('post', `${this.cloudApiUrl}/store/`) - .send(payload) - .end((err: Error, response: any) => { - if (err) { - reject(err); - } else { - if (response.body && response.body.token) { - this.token = response.body.token; - } - if (response.body && response.body[name]) { - resolve(response.body[name]); - } else { - resolve(response.body); - } - } - }); - - token.cancel = () => { - req.abort(); - reject(new Error('Cancelled')); - }; - }); - } + let requestOptions: any = {}; - link(name: string, path: string, customSource: any = {}, token: any = {}) { - const payload: any = { - apikey: this.session.apikey, - token: this.token, - flow: 'web', - clouds: { - [name]: { - path, - }, - }, - }; + if (token) { + const CancelToken = request.CancelToken; + const source = CancelToken.source(); + token.cancel = source.cancel; - if (name === 'customsource' && customSource.customSourcePath) { - payload.clouds.customsource.customSourcePath = customSource.customSourcePath; + requestOptions.cancelToken = source.token; } - if (name === 'customsource' && customSource.customSourceContainer) { - payload.clouds.customsource.customSourceContainer = customSource.customSourceContainer; - } + return requestWithSource() + .post(`${this.cloudApiUrl}/store/`, payload, requestOptions) + .then(res => { + if (res.data && res.data.token) { + this.token = res.data.token; + } - if (this.session.policy && this.session.signature) { - payload.policy = this.session.policy; - payload.signature = this.session.signature; - } - return new Promise((resolve, reject) => { - const req = request('post', `${this.cloudApiUrl}/link/`) - .send(payload) - .end((err: Error, response: any) => { - if (err) { - reject(err); - } else { - if (response.body && response.body.token) { - this.token = response.body.token; - } - if (response.body[name]) { - resolve(response.body[name]); - } else { - resolve(response.body); - } - } - }); - token.cancel = () => { - req.abort(); - reject(new Error('Cancelled')); - }; - }); + if (res.data && res.data[name]) { + return res.data[name]; + } + + return res.data; + }); } logout(name?: string) { @@ -205,30 +162,22 @@ export class CloudClient { flow: 'web', token: this.token, }; + if (name) { - payload.clouds = { - [name]: {}, - }; - } else { + payload.clouds = { [name]: {} }; + } else if (this.cache) { // No name means logout of ALL clouds. Clear local session. - if (this.cache) { - localStorage.removeItem(PICKER_KEY); - } + localStorage.removeItem(PICKER_KEY); } - return new Promise((resolve, reject) => { - request('post', `${this.cloudApiUrl}/auth/logout/`) - .send(payload) - .end((err: Error, response: any) => { - if (err) { - reject(err); - } else { - if (response.body && response.body.token) { - this.token = response.body.token; - } - resolve(response.body); - } - }); - }); + + return requestWithSource() + .post(`${this.cloudApiUrl}/auth/logout/`, payload) + .then(res => { + if (res.data && res.data[name]) { + return res.data[name]; + } + return res.data; + }); } metadata(url: string) { @@ -236,80 +185,66 @@ export class CloudClient { apikey: this.session.apikey, url, }; + if (this.session.policy && this.session.signature) { payload.policy = this.session.policy; payload.signature = this.session.signature; } - return new Promise((resolve, reject) => { - request('post', `${this.cloudApiUrl}/metadata`) - .send(payload) - .end((err: Error, response: any) => { - if (err) { - reject(err); - } else { - resolve(response.body); - } - }); - }); + + return requestWithSource() + .post(`${this.cloudApiUrl}/metadata/`, payload) + .then(res => res.data); } // OpenTok API Endpoints tokInit(type: string) { if (type !== 'video' && type !== 'audio') { - throw new Error('Type must be one of video or audio.'); + throw new FilestackError('Type must be one of video or audio.'); } - return new Promise((resolve, reject) => { - return request('post', `${this.cloudApiUrl}/recording/${type}/init`) - .end((err: Error, response: any) => { - if (err) { - reject(err); - } else { - resolve(response); - } - }); - }); + return requestWithSource() + .post(`${this.cloudApiUrl}/recording/${type}/init`) + .then(res => { + return { + body: res.data, + }; + }); } tokStart(type: string, key: string, sessionId: string) { if (type !== 'video' && type !== 'audio') { - throw new Error('Type must be one of video or audio.'); + throw new FilestackError('Type must be one of video or audio.'); } const payload = { apikey: key, session_id: sessionId, }; - return new Promise((resolve, reject) => { - return request('post', `${this.cloudApiUrl}/recording/${type}/start`) - .send(payload) - .end((err: Error, response: any) => { - if (err) { - reject(err); - } else { - resolve(response); - } - }); - }); + + return requestWithSource() + .post(`${this.cloudApiUrl}/recording/${type}/start`, payload) + .then(res => { + return { + body: res.data, + }; + }); } tokStop(type: string, key: string, sessionId: string, archiveId: string) { if (type !== 'video' && type !== 'audio') { - throw new Error('Type must be one of video or audio.'); + throw new FilestackError('Type must be one of video or audio.'); } + const payload = { apikey: key, session_id: sessionId, archive_id: archiveId, }; - return new Promise((resolve, reject) => { - return request('post', `${this.cloudApiUrl}/recording/${type}/stop`) - .send(payload) - .end((err: Error, response: any) => { - if (err) { - reject(err); - } else { - resolve(response); - } - }); - }); + + return requestWithSource() + .post(`${this.cloudApiUrl}/recording/${type}/stop`, payload) + .then(res => { + return { + body: res.data, + }; + }); } } diff --git a/src/lib/api/file.spec.ts b/src/lib/api/file.spec.ts index c14f24a6..f72e9eba 100644 --- a/src/lib/api/file.spec.ts +++ b/src/lib/api/file.spec.ts @@ -14,229 +14,255 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +/* + * Copyright (c) 2018 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ -import * as assert from 'assert'; -import { - metadata, - remove, - retrieve, -} from './file'; -import { storeURL } from './store'; +import { retrieve, remove, metadata } from './file'; +import * as axios from 'axios'; +import { Session } from '../client'; -declare var ENV: any; +jest.mock('axios'); +jest.mock('./../filelink'); -const session = ENV.session; -const secureSession = ENV.secureSession; -const filelink = ENV.filelink; -const secureFilelink = ENV.secureFilelink; +const mockedSession: Session = { + apikey: 'fakeApikey', + urls: { + cdnUrl: 'fakeUrl', + fileApiUrl: 'fakeApiUrl', + uploadApiUrl: 'fakeUploadApiUrl', + cloudApiUrl: 'fakeCloudApiUrl', + pickerUrl: 'fakePickerUrl', + }, +}; -describe('metadata', function metadataFunc() { - this.timeout(60000); +describe('FileAPI', () => { + describe('Metadata', () => { + it('should call correct metadata without options', async () => { + const methodMocked = jest.fn(() => Promise.resolve({ data: {} })); + // @ts-ignore + axios.get.mockImplementation(methodMocked); + const resp = await metadata(mockedSession, 'fakeHandle'); - it('should throw an error if no handle is set', () => { - assert.throws(() => metadata(session)); - }); + expect(resp).toEqual({ handle: 'fakeHandle' }); + expect(methodMocked).toHaveBeenLastCalledWith('fakeApiUrl/fakeHandle/metadata', { params: {} }); + }); - it('should get an ok response with a valid handle', (done) => { - metadata(session, filelink) - .then((result) => { - assert.ok(result); - done(); - }) - .catch((err) => { - done(err); - }); - }); + it('should call correct metadata with options', async () => { + const methodMocked = jest.fn(() => Promise.resolve({ data: {} })); + // @ts-ignore + axios.get.mockImplementation(methodMocked); + const resp = await metadata(mockedSession, 'fakeHandle', { size: true }); - it('should get an ok response with a valid handle and options', (done) => { - metadata(session, filelink, { md5: true, sourceUrl: true }) - .then((result) => { - assert.ok(result); - done(); - }) - .catch((err) => { - done(err); - }); - }); + expect(resp).toEqual({ handle: 'fakeHandle' }); + expect(methodMocked).toHaveBeenLastCalledWith('fakeApiUrl/fakeHandle/metadata', { params: { size: true } }); + }); - it('should get an ok response with a valid secure handle and options', (done) => { - metadata(secureSession, secureFilelink) - .then((result) => { - assert.ok(result); - done(); - }) - .catch((err) => { - done(err); - }); - }); + it('should throw on wrong option', async () => { + // @ts-ignore + return expect(() => metadata(mockedSession, 'fakekey', { bla: 123 })).toThrowError('Invalid metadata params'); + }); - it('should call promise catch with error', (done) => { - const sessionClone = JSON.parse(JSON.stringify(session)); - sessionClone.urls.fileApiUrl = 'http://www.somebadurl.com'; - - metadata(sessionClone, filelink) - .then(() => { - done(new Error('Request passed')); - }) - .catch((err) => { - assert.ok(err instanceof Error); - done(); - }); - }); -}); + it('should throw an error on empty handle', () => { + return expect(() => metadata(mockedSession)).toThrowError(); + }); -describe('retrieve', function metadataFunc() { - this.timeout(60000); + it('should respect provided security options', async () => { + const fakeSecurity = { + signature: 'fakeS', + policy: 'fakeP', + }; - it('should throw an error if no handle is set', () => { - assert.throws(() => retrieve(session, '')); - }); + // @ts-ignore + axios.get.mockImplementation(() => Promise.resolve({ data: {} })); + const resp = await metadata(mockedSession, 'fakeHandle', {}, fakeSecurity); - it('should throw an error metadata and head options are provided', () => { - assert.throws(() => retrieve(session, filelink, { - metadata: true, - head: true, - })); + expect(resp).toEqual({ handle: 'fakeHandle' }); + }); }); - it('should get an ok response with a valid handle', (done) => { - retrieve(session, filelink) - .then((result) => { - assert.ok(result); - done(); - }) - .catch((err) => { - done(err); - }); - }); + describe('Remove', () => { + it('should call remove', async () => { + const deleteMocked = jest.fn(() => Promise.resolve({ data: {} })); - it('should get an ok response with a valid handle and options', (done) => { - retrieve(session, filelink, { metadata: true }) - .then((result) => { - assert.ok(result); - done(); - }) - .catch((err) => { - done(err); - }); - }); + // @ts-ignore + axios.delete.mockImplementation(deleteMocked); + const resp = await remove( + Object.assign({}, mockedSession, { + signature: 'fakeS', + policy: 'fakeP', + }), + 'fakeHandle' + ); - it('should get an ok response with a valid secure handle and options', (done) => { - retrieve(secureSession, secureFilelink, { metadata: true }) - .then((result) => { - assert.ok(result); - done(); - }) - .catch((err) => { - done(err); - }); - }); + expect(resp).toEqual({ data: {} }); + expect(deleteMocked).toHaveBeenCalledWith('fakeApiUrl/fakeHandle', { params: { key: 'fakeApikey', policy: 'fakeP', signature: 'fakeS' } }); + }); - it('should get an ok response with a head option', (done) => { - retrieve(session, filelink, { head: true }) - .then((result) => { - assert.ok(result); - done(); - }) - .catch((err) => { - done(err); - }); - }); + it('should respect skip storage option', async () => { + const methodMocked = jest.fn(() => Promise.resolve({ data: {} })); - it('should get an ok response with a extension option', (done) => { - retrieve(session, filelink, { extension: 'someextension.txt' }) - .then((result) => { - assert.ok(result); - done(); - }) - .catch((err) => { - done(err); - }); + // @ts-ignore + axios.delete.mockImplementation(methodMocked); + const resp = await remove( + Object.assign({}, mockedSession, { + signature: 'fakeS', + policy: 'fakeP', + }), + 'fakeHandle', + true + ); + + expect(resp).toEqual({ data: {} }); + expect(methodMocked).toHaveBeenCalledWith('fakeApiUrl/fakeHandle', { params: { key: 'fakeApikey', policy: 'fakeP', signature: 'fakeS', skip_storage: true } }); + }); + + it('should throw on empty handle', () => { + expect(() => remove(mockedSession)).toThrowError(); + }); + + it('should call remove with provided session', async () => { + const fakeSecurity = { + signature: 'fakeS', + policy: 'fakeP', + }; + + // @ts-ignore + axios.delete.mockImplementation(() => Promise.resolve({ data: {} })); + const resp = await remove(mockedSession, 'fakeHandle', false, fakeSecurity); + + expect(resp).toEqual({ data: {} }); + }); + + it('should throw on empty signature', async () => { + const fakeSecurity = { + signature: null, + policy: 'fakeP', + }; + + expect(() => remove(mockedSession, 'fakeHandle', false, fakeSecurity)).toThrowError(); + }); + + it('should throw on empty policy', async () => { + const fakeSecurity = { + signature: 'fakeS', + policy: null, + }; + + expect(() => remove(mockedSession, 'fakeHandle', false, fakeSecurity)).toThrowError(); + }); + + it('should throw on empty policy on session', async () => { + return expect(() => remove(mockedSession, 'fakeHandle')).toThrowError(); + }); }); - it('should call promise catch with error', (done) => { - const sessionClone = JSON.parse(JSON.stringify(session)); - sessionClone.urls.fileApiUrl = 'somebadurl'; - - retrieve(sessionClone, filelink, { extension: 'someextension.txt' }) - .then(() => { - done(new Error('Request passed')); - }) - .catch((err) => { - assert.ok(err instanceof Error); - done(); + describe('Retrieve', () => { + it('should make correct retrieve request (GET)', async () => { + const methodMocked = jest.fn(() => Promise.resolve({ data: {} })); + + // @ts-ignore + axios.mockImplementation(methodMocked); + const resp = await retrieve(mockedSession, 'fakeHandle'); + + expect(resp).toEqual({}); + expect(methodMocked).toHaveBeenCalledWith({ method: 'get', params: { key: 'fakeApikey' }, url: 'fakeApiUrl/fakeHandle' }); + }); + + it('should make correct retrieve request (HEAD)', async () => { + const methodMocked = jest.fn(() => Promise.resolve({ data: {}, headers: { type: 'test' } })); + + // @ts-ignore + axios.mockImplementation(methodMocked); + const resp = await retrieve(mockedSession, 'fakeHandle', { + head: true, }); - }); -}); -describe('remove', function removeFunc() { - this.timeout(60000); + expect(resp).toEqual({ type: 'test' }); + expect(methodMocked).toHaveBeenCalledWith({ method: 'head', params: { key: 'fakeApikey' }, url: 'fakeApiUrl/fakeHandle' }); + }); - it('should throw an error if no handle is set', () => { - assert.throws(() => remove(secureSession)); - }); + it('should make correct retrieve request with provided security', async () => { + const methodMocked = jest.fn(() => Promise.resolve({ data: {} })); - it('should throw an error if client is not secured', () => { - assert.throws(() => remove(session, 'fakehandle')); - }); + const fakeSecurity = { + signature: 'fakeS', + policy: 'fakeP', + }; + + // @ts-ignore + axios.mockImplementation(methodMocked); + const resp = await retrieve(mockedSession, 'fakeHandle', {}, fakeSecurity); - it('should get an ok response with a valid handle', (done) => { - // have to create a file before we can test deleting it - storeURL(secureSession, ENV.urls.testImageUrl) - .then((res: any) => { - const handle = res.handle; - remove(secureSession, handle) - .then((result: any) => { - assert.equal(result.statusCode, 200); - done(); - }) - .catch((err) => { - done(err); - }); - }) - .catch((err) => { - done(err); + expect(resp).toEqual({}); + expect(methodMocked).toHaveBeenCalledWith({ + method: 'get', + params: { key: 'fakeApikey', policy: 'fakeP', signature: 'fakeS' }, + url: 'fakeApiUrl/fakeHandle', }); - }); + }); + + it('should make correct retrieve request with extension', async () => { + const methodMocked = jest.fn(() => Promise.resolve({ data: {} })); - it('should get an ok response when skip_storage is true', (done) => { - // have to create a file before we can test deleting it - storeURL(secureSession, ENV.urls.testImageUrl) - .then((res: any) => { - const handle = res.handle; - remove(secureSession, handle, true) - .then((result: any) => { - assert.equal(result.statusCode, 200); - done(); - }) - .catch((err) => { - done(err); - }); - }) - .catch((err) => { - done(err); + // @ts-ignore + axios.mockImplementation(methodMocked); + const resp = await retrieve(mockedSession, 'fakeHandle', { + extension: 'txt', }); - }); - it('should call promise catch with error', (done) => { - const sessionClone = JSON.parse(JSON.stringify(secureSession)); - sessionClone.urls.fileApiUrl = 'somebadurl'; - - storeURL(secureSession, ENV.urls.testImageUrl) - .then((res: any) => { - const handle = res.handle; - - remove(sessionClone, handle) - .then(() => { - done(new Error('Request passed')); - }) - .catch((err) => { - assert.ok(err instanceof Error); - done(); - }); - }) - .catch((err) => { - done(err); + expect(resp).toEqual({}); + expect(methodMocked).toHaveBeenCalledWith({ method: 'get', params: { key: 'fakeApikey' }, url: 'fakeApiUrl/fakeHandle+txt' }); + }); + + it('should make correct retrieve request with metadata', async () => { + const methodMocked = jest.fn(() => Promise.resolve({ data: {} })); + + // @ts-ignore + axios.mockImplementation(methodMocked); + const resp = await retrieve(mockedSession, 'fakeHandle', { + metadata: true, }); + + expect(resp).toEqual({}); + expect(methodMocked).toHaveBeenCalledWith({ method: 'get', params: { key: 'fakeApikey' }, url: 'fakeApiUrl/fakeHandle/metadata' }); + }); + + it('should throw an error on empty handle', () => { + return expect(() => retrieve(mockedSession, '')).toThrowError(); + }); + + it('should throw an error worng options provided', () => { + return expect(() => retrieve(mockedSession, 'fakeHandle', { + // @ts-ignore + test: 123, + })).toThrowError('Invalid retrieve params'); + }); + + it('should not throw an error worng options provided', () => { + return expect(() => retrieve(mockedSession, 'fakeHandle', { + metadata: true, + })).not.toThrowError('Invalid retrieve params'); + }); + + it('should throw an error when metadata and head is provided', () => { + return expect(() => retrieve(mockedSession, 'fakeHandle', { + metadata: true, + head: true, + })).toThrowError(); + }); }); }); diff --git a/src/lib/api/file.ts b/src/lib/api/file.ts index 0a1d7aba..91c4ee6b 100644 --- a/src/lib/api/file.ts +++ b/src/lib/api/file.ts @@ -15,10 +15,11 @@ * limitations under the License. */ -import * as t from 'tcomb-validation'; import { Security, Session } from '../client'; import { request } from './request'; -import { checkOptions, removeEmpty } from '../utils'; +import { removeEmpty } from '../utils'; +import { FilestackError } from './../../filestack_error'; +import { getValidator, MetadataParamsSchema, RetrieveParamsSchema } from './../../schema'; /** * Remove given file @@ -30,11 +31,11 @@ import { checkOptions, removeEmpty } from '../utils'; */ export const remove = (session: Session, handle?: string, skipStorage?: boolean, security?: Security): Promise => { if (!handle || typeof handle !== 'string') { - throw new Error('A valid Filestack handle is required for remove'); + throw new FilestackError('A valid Filestack handle is required for remove'); } if (!(session.policy && session.signature) && (!security || !(security.policy && security.signature))) { - throw new Error('Security policy and signature are required for remove'); + throw new FilestackError('Security policy and signature are required for remove'); } const fileApiUrl = session.urls.fileApiUrl; @@ -49,17 +50,8 @@ export const remove = (session: Session, handle?: string, skipStorage?: boolean, options.skip_storage = true; } - return new Promise((resolve, reject) => { - request - .delete(baseURL) - .query(options) - .end((err: any, res: any) => { - if (err) { - reject(err); - } else { - resolve(res); - } - }); + return request.delete(baseURL, { + params: removeEmpty(options), }); }; @@ -96,32 +88,14 @@ export interface MetadataOptions { */ export const metadata = (session: Session, handle?: string, opts?: MetadataOptions, security?: Security): Promise => { if (!handle || typeof handle !== 'string') { - throw new Error('A valid Filestack handle is required for metadata'); + throw new FilestackError('A valid Filestack handle is required for metadata'); } - const allowed = [ - { name: 'size', type: t.Boolean }, - { name: 'mimetype', type: t.Boolean }, - { name: 'filename', type: t.Boolean }, - { name: 'width', type: t.Boolean }, - { name: 'height', type: t.Boolean }, - { name: 'uploaded', type: t.Boolean }, - { name: 'writeable', type: t.Boolean }, - { name: 'cloud', type: t.Boolean }, - { name: 'sourceUrl', type: t.Boolean }, - { name: 'md5', type: t.Boolean }, - { name: 'sha1', type: t.Boolean }, - { name: 'sha224', type: t.Boolean }, - { name: 'sha256', type: t.Boolean }, - { name: 'sha384', type: t.Boolean }, - { name: 'sha512', type: t.Boolean }, - { name: 'location', type: t.Boolean }, - { name: 'path', type: t.Boolean }, - { name: 'container', type: t.Boolean }, - { name: 'exif', type: t.Boolean }, - ]; - - checkOptions('metadata', allowed, opts); + const validateRes = getValidator(MetadataParamsSchema)(opts); + + if (validateRes.errors.length) { + throw new FilestackError(`Invalid metadata params`, validateRes.errors); + } const options: any = { ...opts }; options.source_url = options.sourceUrl; // source_url is snake_case @@ -131,18 +105,9 @@ export const metadata = (session: Session, handle?: string, opts?: MetadataOptio const baseURL = `${session.urls.fileApiUrl}/${handle}/metadata`; return new Promise((resolve, reject) => { request - .get(baseURL) - .query(removeEmpty(options)) - .end((err: Error, res: any) => { - if (err) { - return reject(err); - } - - resolve({ - ...res.body, - handle, - }); - }); + .get(baseURL, { params: removeEmpty(options) }) + .then(res => resolve({ ...res.data, handle })) + .catch(reject); }); }; @@ -179,38 +144,26 @@ export interface RetrieveOptions { * @param options * @param security */ -export const retrieve = (session: Session, - handle: string, - options: RetrieveOptions = {}, - security?: Security): Promise => { - if (!handle - || handle.length === 0 - || typeof handle !== 'string') { - - throw new Error('File handle is required'); +export const retrieve = (session: Session, handle: string, options: RetrieveOptions = {}, security?: Security): Promise => { + if (!handle || handle.length === 0 || typeof handle !== 'string') { + throw new FilestackError('File handle is required'); } - const allowed = [ - { name: 'metadata', type: t.Boolean }, - { name: 'head', type: t.Boolean }, - { name: 'dl', type: t.Boolean }, - { name: 'cache', type: t.Boolean }, - { name: 'extension', type: t.String }, - ]; + const validateRes = getValidator(RetrieveParamsSchema)(options); - checkOptions('retrieveOptions', allowed, options); + if (validateRes.errors.length) { + throw new FilestackError(`Invalid retrieve params`, validateRes.errors); + } const requestOptions: any = { ...options }; requestOptions.key = session.apikey; - requestOptions.policy = security && security.policy || session.policy; - requestOptions.signature = security && security.signature || session.signature; + requestOptions.policy = (security && security.policy) || session.policy; + requestOptions.signature = (security && security.signature) || session.signature; let method: ERequestMethod = ERequestMethod.get; - let responseType = EResponseType.blob; if (requestOptions.head) { method = ERequestMethod.head; - responseType = EResponseType.json; delete requestOptions.head; } @@ -224,10 +177,9 @@ export const retrieve = (session: Session, let metadata; if (requestOptions.metadata) { if (method === ERequestMethod.head) { - throw new Error('Head and metadata options cannot be used together'); + throw new FilestackError('Head and metadata options cannot be used together'); } - responseType = EResponseType.json; metadata = requestOptions.metadata; delete requestOptions.metadata; } @@ -235,19 +187,12 @@ export const retrieve = (session: Session, const baseURL = `${session.urls.fileApiUrl}/${handle}` + (extension ? `+${extension}` : '') + (metadata ? '/metadata' : ''); return new Promise((resolve, reject) => { - request[method](baseURL) - .query(requestOptions) - .responseType(responseType) - .end((err: Error, res: any) => { - if (err) { - return reject(err); - } - - if (method === ERequestMethod.head) { - return resolve(res.headers); - } - - resolve(res.body); - }); + request({ + url: baseURL, + method, + params: removeEmpty(requestOptions), + }) + .then(res => resolve(method === ERequestMethod.head ? res.headers : res.data)) + .catch(reject); }); }; diff --git a/src/lib/api/preview.spec.browser.ts b/src/lib/api/preview.spec.browser.ts new file mode 100644 index 00000000..b35c0dde --- /dev/null +++ b/src/lib/api/preview.spec.browser.ts @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { preview, getUrl } from './preview'; + +const mockAppendChild = jest.fn(); + +const defaultSession = { + 'apikey': 'TEST_API_KEY', + 'urls': { + 'fileApiUrl': 'https://www.filestackapi.com/api/file', + 'uploadApiUrl': 'https://upload.filestackapi.com', + 'cloudApiUrl': 'https://cloud.filestackapi.com', + 'cdnUrl': 'https://cdn.filestackcontent.com', + 'pickerUrl': 'https://static.filestackapi.com/picker/1.4.4/picker.js', + }, +}; + +describe('api:upload:preview', () => { + beforeEach(() => { + spyOn(window, 'open').and.returnValue(true); + + spyOn(document, 'createElement').and.returnValue({ + src: '', + width: '', + height: '', + }); + + spyOn(document, 'getElementById').and.callFake((id) => { + let obj; + + if (id === 'testId') { + obj = { appendChild: mockAppendChild }; + } + + return obj; + }); + }); + + describe('preview', () => { + it('should open a proper url with preview of a file', () => { + const handle = 'testHandle'; + preview(defaultSession, handle); + expect(window.open).toBeCalledTimes(1); + expect(window.open).toBeCalledWith('https://cdn.filestackcontent.com/preview/testHandle', 'testHandle'); + }); + + it('should open a proper url with preview of a file with src handle', () => { + const handle = 'src://test123/test.jpg'; + preview(defaultSession, handle); + + expect(window.open).toBeCalledTimes(1); + expect(window.open).toBeCalledWith('https://cdn.filestackcontent.com/TEST_API_KEY/preview/src://test123/test.jpg', 'src://test123/test.jpg'); + }); + + it('should open iframe inside provided options.id', () => { + const handle = 'src://test123/test.jpg'; + const options = { + id: 'testId', + css: 'customCss', + }; + + preview(defaultSession, handle, options); + const expected = { 'height': '100%', 'width': '100%', 'src': 'https://cdn.filestackcontent.com/TEST_API_KEY/preview=css:%22customCss%22/src://test123/test.jpg' }; + expect(mockAppendChild).toBeCalledTimes(1); + expect(mockAppendChild).toBeCalledWith(expected); + }); + + it('should throw an error when handle is not provided', () => { + expect(() => { preview(defaultSession); }).toThrow('A valid Filestack handle or storage alias is required for preview'); + }); + + it('should throw an error when id provided and dom element not found', () => { + const handle = 'src://test123/test.jpg'; + const options = { + id: 'testId2', + }; + expect(() => { preview(defaultSession, handle, options); }).toThrow('DOM Element with id "testId2" not found.'); + }); + + it('should throw an error on invalid preview params', () => { + const handle = 'src://test123/test.jpg'; + const options = { + id: {}, + test: 123, + }; + // @ts-ignore + expect(() => { preview(defaultSession, handle, options); }).toThrow('Invalid preview params'); + }); + }); + + describe('getUrl', () => { + it('should be able to get url with security', () => { + const handle = 'TEST_HANDLE'; + const options = { + id: 'testId2', + }; + + const security = { + policy: 'eyJleHBpcnkiOjE1MjM1OTU2MDAsImNhbGwiOlsicmVhZCIsImNvbnZlcnQiXSwiaGFuZGxlIjoiYmZUTkNpZ1JMcTBRTU9yc0ZLemIifQ==', + signature: 'ab1624c9f219ca0118f1af43d21ee87a09a07645c15c9fdbb7447818739c2b8b', + }; + + const result = getUrl(defaultSession, handle, options, security); + const expected = 'https://cdn.filestackcontent.com/preview/security=policy:eyJleHBpcnkiOjE1MjM1OTU2MDAsImNhbGwiOlsicmVhZCIsImNvbnZlcnQiXSwiaGFuZGxlIjoiYmZUTkNpZ1JMcTBRTU9yc0ZLemIifQ==,signature:ab1624c9f219ca0118f1af43d21ee87a09a07645c15c9fdbb7447818739c2b8b/TEST_HANDLE'; + expect(result).toBe(expected); + }); + }); +}); diff --git a/src/lib/api/preview.spec.ts b/src/lib/api/preview.spec.ts deleted file mode 100644 index 0999772c..00000000 --- a/src/lib/api/preview.spec.ts +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (c) 2018 by Filestack. - * Some rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as assert from 'assert'; -import * as sinon from 'sinon'; -import { preview } from './preview'; - -declare var ENV: any; - -const session = ENV.session; -const secureSession = ENV.secureSession; -const filelink = ENV.filelink; - -describe('preview', () => { - let appendChildSpy: sinon.SinonSpy; - let createElementSpy: sinon.SinonStub; - let documentSpy: sinon.SinonStub; - let windowOpenSpy: sinon.SinonStub; - - beforeEach(() => { - appendChildSpy = sinon.spy(); - createElementSpy = sinon.stub(document, 'createElement').returns({}); - documentSpy = sinon.stub(document, 'getElementById').returns({ - appendChild: appendChildSpy, - }); - windowOpenSpy = sinon.stub(window, 'open'); - }); - - afterEach(() => { - createElementSpy.restore(); - windowOpenSpy.restore(); - documentSpy.restore(); - }); - - it('should throw exception when handle is not provided', () => { - assert.throws(() => preview(session)); - }); - - it('should open window when no id specified', () => { - preview(session, filelink); - assert.ok(windowOpenSpy.calledWith(`${session.urls.cdnUrl}/preview/${filelink}`, filelink)); - }); - - it('should render to specified element', () => { - preview(session, filelink, { - id: 'someId', - }); - - assert.ok(createElementSpy.calledWith('iframe')); - assert.ok(documentSpy.calledWith('someId')); - assert.ok(appendChildSpy.calledWith({ - src: `${session.urls.cdnUrl}/preview/${filelink}`, - width: '100%', - height: '100%', - })); - }); - - it('should throw error when element with given id is not found', () => { - documentSpy.restore(); - documentSpy = sinon.stub(document, 'getElementById').returns(undefined); - - assert.throws(() => preview(session, filelink, { - id: 'someId', - })); - }); - - it('should add api key to url when storage alias is passed', () => { - const link = 'src:test'; - preview(session, link); - assert.ok(windowOpenSpy.calledWith(`${session.urls.cdnUrl}/${session.apikey}/preview/${link}`, link)); - }); - - it('should work with security {signature, policy}', () => { - preview(secureSession, filelink); - const urlSecure = `security=policy:${secureSession.policy},signature:${secureSession.signature}`; - assert.ok(windowOpenSpy.calledWith(`${session.urls.cdnUrl}/preview/${urlSecure}/${filelink}`, filelink)); - }); -}); diff --git a/src/lib/api/preview.ts b/src/lib/api/preview.ts index 3abc0688..f5733929 100644 --- a/src/lib/api/preview.ts +++ b/src/lib/api/preview.ts @@ -15,9 +15,10 @@ * limitations under the License. */ -import * as t from 'tcomb-validation'; import { Security, Session } from '../client'; -import { checkOptions, removeEmpty } from '../utils'; +import { removeEmpty } from '../utils'; +import { getValidator, PreviewParamsSchema } from './../../schema'; +import { FilestackError, FilestackErrorType } from './../../filestack_error'; export interface PreviewOptions { /** @@ -63,6 +64,7 @@ export const getUrl = ( if (hasSecurity) { baseUrl.push(`security=policy:${policy},signature:${signature}`); } + baseUrl.push(handle); return baseUrl.join('/'); }; @@ -79,17 +81,17 @@ export const preview = (session: Session, handle?: string, opts?: PreviewOptions if (!handle || typeof handle !== 'string') { throw new Error('A valid Filestack handle or storage alias is required for preview'); } - const allowed = [ - { name: 'id', type: t.String }, - { name: 'css', type: t.String }, - ]; - checkOptions('preview', allowed, opts); + const validateRes = getValidator(PreviewParamsSchema)(opts); + + if (validateRes.errors.length) { + throw new FilestackError(`Invalid preview params`, validateRes.errors, FilestackErrorType.VALIDATION); + } - const options = removeEmpty(opts); + const options = removeEmpty(opts || {}); const url = getUrl(session, handle, options); - if (options.id) { + if (options && options.id) { const id = options.id; const iframe = document.createElement('iframe'); const domElement = document.getElementById(id); diff --git a/src/lib/api/request.spec.ts b/src/lib/api/request.spec.ts index d99cc455..88d8a2db 100644 --- a/src/lib/api/request.spec.ts +++ b/src/lib/api/request.spec.ts @@ -15,21 +15,284 @@ * limitations under the License. */ -import * as assert from 'assert'; -import * as sinon from 'sinon'; -import { requestWithSource } from './request'; - -describe('requestWithSource', () => { - let server: any; - before(() => { - server = sinon.fakeServer.create(); +import axios from 'axios'; +import { requestWithSource, postWithRetry } from './request'; +import * as nock from 'nock'; + +const testHost = 'https://test.com'; + +const mockPost = jest.fn().mockName('mockPut'); + +describe('Request', () => { + beforeEach(() => { + nock(testHost) + .persist() + .post('/post') + .reply(200, function(url, data) { + return mockPost(url, JSON.parse(data), this.req.headers); + }); + + nock(testHost) + .post('/fail2') + .twice() + .reply(501, { + code: 'SERVER_ERROR', + message: 'Internal Server Error', + }) + .post('/fail2') + .once() + .reply(200, function(url, data) { + return mockPost(url, JSON.parse(data), this.req.headers); + }); + + mockPost.mockReturnValue({ + test: 123, + }); }); - after(() => { - server.restore(); + + afterEach(() => { + mockPost.mockClear(); + }); + + describe('requestWithSource', () => { + it('should set correct source', async () => { + const res = await requestWithSource().post(`${testHost}/post`, {}); + + expect(mockPost).toHaveBeenCalledWith( + '/post', + {}, + expect.objectContaining({ + 'filestack-source': 'JS-@{VERSION}', + 'filestack-trace-span': expect.any(String), + 'filestack-trace-id': expect.any(String), + }) + ); + + expect(res).toEqual(expect.objectContaining({ status: 200 })); + }); + + it('should respect retry config', async () => { + const onRetry = jest.fn().mockName('onRetry'); + + nock(testHost) + .post('/retrytest') + .twice() + .replyWithError({ + message: 'something awful happened', + code: 'ECONNRESET', + }) + .post('/retrytest') + .once() + .reply(200, function(url, data) { + return mockPost(url, JSON.parse(data), this.req.headers); + }); + + const res = await requestWithSource({ + retry: 2, + retryFactor: 2, + retryMaxTime: 1000, + onRetry, + }).post(`${testHost}/retrytest`, { + test: 1, + }); + + expect(onRetry).toHaveBeenCalledTimes(2); + expect(res).toEqual(expect.objectContaining({ status: 200 })); + }); + + it('should run request without params', async () => { + const onRetry = jest.fn().mockName('onRetry'); + + nock(testHost) + .post('/retrytest') + .twice() + .replyWithError({ + message: 'something awful happened', + code: 'ECONNRESET', + }) + .post('/retrytest') + .once() + .reply(200, {}); + + const res = await requestWithSource({ + retry: 2, + retryFactor: 2, + retryMaxTime: 1000, + onRetry, + }).post(`${testHost}/retrytest`); + + expect(onRetry).toHaveBeenCalledTimes(2); + expect(res).toEqual(expect.objectContaining({ status: 200 })); + }); }); - it('should insert the Filestack-Source header', () => { - const req = requestWithSource('post', 'http://testing'); - // @ts-ignore - assert.ok(req.header['Filestack-Source']); + + describe('postWithRetry', () => { + it('should respect user defined headers', async () => { + const fields = { + test: 1, + }; + + const headers = { + test: 1, + }; + + await postWithRetry(`${testHost}/post`, fields, { headers }); + + expect(mockPost).toHaveBeenCalledWith( + '/post', + fields, + expect.objectContaining({ + ...headers, + 'filestack-source': 'JS-@{VERSION}', + 'filestack-trace-span': expect.any(String), + 'filestack-trace-id': expect.any(String), + }) + ); + }); + + it('should add default headers if nothing is provided', async () => { + const fields = { + test: 1, + }; + + await postWithRetry(`${testHost}/post`, fields); + + expect(mockPost).toHaveBeenCalledWith( + '/post', + fields, + expect.objectContaining({ + 'filestack-source': 'JS-@{VERSION}', + 'filestack-trace-span': expect.any(String), + 'filestack-trace-id': expect.any(String), + }) + ); + }); + + it('should respect retry config', async () => { + const onRetry = jest.fn().mockName('onRetry'); + + const fields = { + test: 1, + }; + + const res = await postWithRetry( + `${testHost}/fail2`, + fields, + {}, + { + retry: 2, + retryFactor: 2, + retryMaxTime: 1000, + onRetry, + } + ); + + expect(mockPost).toHaveBeenCalledWith( + '/fail2', + fields, + expect.objectContaining({ + 'filestack-source': 'JS-@{VERSION}', + 'filestack-trace-span': expect.any(String), + 'filestack-trace-id': expect.any(String), + }) + ); + + expect(onRetry).toHaveBeenCalledTimes(2); + expect(res).toEqual(expect.objectContaining({ status: 200 })); + }); + + it('should reject on max retry count', () => { + return expect( + postWithRetry( + `${testHost}/fail2`, + {}, + {}, + { + retry: 1, + retryFactor: 2, + retryMaxTime: 1000, + } + ) + ).rejects.toEqual(expect.any(Error)); + }); + + it('should reject on 4xx errors (request errors)', async () => { + const onRetry = jest.fn().mockName('onRetry'); + nock(testHost) + .post('/401') + .reply(401, {}); + + await expect( + postWithRetry( + `${testHost}/401`, + {}, + {}, + { + retry: 1, + retryFactor: 2, + retryMaxTime: 1000, + onRetry, + } + ) + ).rejects.toEqual(expect.any(Error)); + + expect(onRetry).not.toHaveBeenCalled(); + }); + + it('should retry on network errors like (ECONNRESET)', async () => { + const onRetry = jest.fn().mockName('onRetry'); + nock(testHost) + .post('/fail3') + .twice() + .replyWithError({ + message: 'something awful happened', + code: 'ECONNRESET', + }) + .post('/fail3') + .once() + .reply(200, function(url, data) { + return mockPost(url, JSON.parse(data), this.req.headers); + }); + + await expect( + postWithRetry( + `${testHost}/fail3`, + {}, + {}, + { + retry: 3, + retryFactor: 2, + retryMaxTime: 1000, + onRetry, + } + ) + ).resolves.toEqual(expect.objectContaining({ status: 200 })); + + expect(onRetry).toHaveBeenCalledTimes(2); + }); + + it('should not retry on user cancel request', () => { + const onRetry = jest.fn().mockName('onRetry'); + const CancelToken = axios.CancelToken; + const source = CancelToken.source(); + + setTimeout(() => source.cancel('user_cancel'), 1); + + return expect( + postWithRetry( + `${testHost}/fail2`, + {}, + { + cancelToken: source.token, + }, + { + retry: 3, + retryFactor: 2, + retryMaxTime: 10000, + onRetry, + } + ) + ).rejects.toEqual({ message: 'user_cancel' }); + }); }); }); diff --git a/src/lib/api/request.ts b/src/lib/api/request.ts index 306d2e6f..c81dc792 100644 --- a/src/lib/api/request.ts +++ b/src/lib/api/request.ts @@ -14,8 +14,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import Debug from 'debug'; +import axios, { AxiosError, AxiosInstance, AxiosResponse, AxiosRequestConfig } from 'axios'; +import { uniqueId } from '../utils'; -import * as request from 'superagent'; +const debug = Debug('fs:request'); + +const RESPONSE_DEBUG_PREFIX = 'x-filestack-'; + +export interface RetryConfig { + retry: number; + onRetry?: (requestConfig: any) => void; + retryMaxTime: number; + retryFactor: number; +} /** * @@ -23,8 +35,139 @@ import * as request from 'superagent'; * @param method * @param url */ -const requestWithSource = (method: string, url: string): request.SuperAgentRequest => { - return request[method](url).set('Filestack-Source', 'JS-@{VERSION}'); +export const requestWithSource = (retryConfig?: RetryConfig): AxiosInstance => { + const axiosInstance = axios.create({ + headers: { + 'filestack-source': 'JS-@{VERSION}', + 'filestack-trace-id': `${Math.floor(Date.now() / 1000)}-${uniqueId()}`, + 'filestack-trace-span': `jssdk-${uniqueId()}`, + }, + }); + + if (retryConfig) { + useRetryPolicy(axiosInstance, retryConfig); + } + + useDebugInterceptor(axiosInstance); + return axiosInstance; +}; + +export const postWithRetry = (url: string, fields: Object, config: AxiosRequestConfig = {}, retryConfig?: RetryConfig): Promise => { + debug(`[RequestWithRetry] set fields %O for url ${url}`, fields); + + if (!config.headers) { + config.headers = {}; + } + + config.headers = Object.assign({}, config.headers, { + 'filestack-source': 'JS-@{VERSION}', + 'filestack-trace-id': `${Math.floor(Date.now() / 1000)}-${uniqueId()}`, + 'filestack-trace-span': `jssdk-${uniqueId()}`, + }); + + const axiosInstance = axios.create(); + + if (retryConfig) { + useRetryPolicy(axiosInstance, retryConfig); + } + + useDebugInterceptor(axiosInstance); + return axiosInstance.post(url, fields, config); +}; + +export const shouldRetry = (err: AxiosError) => { + // we always should retry on network failure + switch (err.code) { + case 'ECONNRESET': + case 'ETIMEDOUT': + case 'EADDRINUSE': + case 'ESOCKETTIMEDOUT': + case 'EPIPE': + return true; + } + + // if request was not made and there is no response - retry + if (!err.response) { + return true; + } + + // we should retry on all server errors (5xx) + if (500 <= err.response.status && err.response.status <= 599) { + return true; + } + + // we should not retry on other errors (4xx) ie: BadRequest etc + return false; +}; + +const useDebugInterceptor = (instance) => { + /* istanbul ignore next */ // this is internal debug method + instance.interceptors.response.use(resp => { + if (debug.enabled) { + for (let i in resp.headers) { + if (!resp.headers.hasOwnProperty(resp.headers) && i.indexOf(RESPONSE_DEBUG_PREFIX) === -1) { + continue; + } + + debug(`Filestack Response Debug Header - ${i}: ${resp.headers[i]}`); + } + } + + return resp; + }); +}; + +export const useRetryPolicy = (instance: AxiosInstance, retryConfig: RetryConfig) => { + instance.interceptors.request.use(config => { + const currentState = config['retry'] || {}; + currentState.retryCount = currentState.retryCount || 0; + config['retry'] = currentState; + return config; + }); + + return instance.interceptors.response.use(null, err => { + const requestConfig = err.config; + + if (axios.isCancel(err)) { + debug('[Retry] Upload canceled by user'); + return Promise.reject(err); + } + + debug(`[Retry] Start retry process code: ${err.code}, %O`, err); + + /* istanbul ignore next */ + if (!requestConfig) { + debug(`[Retry] Retry config not found, Rejecting request`); + return Promise.reject(err); + } + + const state = requestConfig.retry; + + if (!shouldRetry(err)) { + debug(`[Retry] Response code not allowing to retry`); + return Promise.reject(err); + } + + requestConfig.retry.retryCount += 1; + + if (requestConfig.retry.retryCount > retryConfig.retry) { + debug(`[Retry] Max retry count reached ${requestConfig.retry.retryCount}`); + return Promise.reject(err); + } + + const retryDelay = Math.max(Math.min(retryConfig.retryMaxTime, (retryConfig.retryFactor ** state.retryCount) * 1000), 1); + + debug(`[Retry] Retrying request to ${requestConfig.url}, count ${state.retryCount} of ${retryConfig.retry} - Delay: ${retryDelay}`); + return new Promise(resolve => setTimeout(() => { + if (typeof retryConfig.onRetry === 'function') { + retryConfig.onRetry.call(instance, requestConfig); + } + + resolve(instance(requestConfig)); + }, retryDelay)); + }); }; -export { request, requestWithSource }; +// set global debug inspector +useDebugInterceptor(axios); +export { axios as request }; diff --git a/src/lib/api/security.spec.browser.ts b/src/lib/api/security.spec.browser.ts new file mode 100644 index 00000000..33110e0f --- /dev/null +++ b/src/lib/api/security.spec.browser.ts @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getSecurity } from './security'; +import * as utils from './../utils'; + +describe('api/security', () => { + beforeAll(() => { + spyOn(utils, 'isNode').and.returnValue(false); + }); + + describe('getSecurity', () => { + it('should throw not supported error', () => { + const policy = { + expiry: 1523595600, + call: ['pick', 'read', 'stat', 'write', 'writeUrl', 'store', 'convert', 'remove', 'exif', 'runWorkflow'], + handle: 'TEST_HANDLE', + }; + const appSecret = 'testAppSecret'; + + expect(() => getSecurity(policy, appSecret)).toThrowError('getSecurity is only supported in nodejs'); + }); + }); +}); diff --git a/src/lib/api/security.spec.node.ts b/src/lib/api/security.spec.node.ts new file mode 100644 index 00000000..aa9de1bf --- /dev/null +++ b/src/lib/api/security.spec.node.ts @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getSecurity } from './security'; + +describe('api:security', () => { + describe('getSecurity', () => { + it('should create a proper object with policy & signature', () => { + const policy = { + expiry: 1523595600, + call: ['pick', 'read', 'stat', 'write', 'writeUrl', 'store', 'convert', 'remove', 'exif', 'runWorkflow'], + handle: 'TEST_HANDLE', + }; + const appSecret = 'testAppSecret'; + const result = getSecurity(policy, appSecret); + const expected = { + policy: 'eyJleHBpcnkiOjE1MjM1OTU2MDAsImNhbGwiOlsicGljayIsInJlYWQiLCJzdGF0Iiwid3JpdGUiLCJ3cml0ZVVybCIsInN0b3JlIiwiY29udmVydCIsInJlbW92ZSIsImV4aWYiLCJydW5Xb3JrZmxvdyJdLCJoYW5kbGUiOiJURVNUX0hBTkRMRSJ9', + signature: '7df0536104cdcc16370ad6494cdbda30c9773a62eec6e5153fa539544db6206e', + }; + expect(result).toEqual(expected); + }); + + it('should throw error on invalid security params', () => { + const policy = { + expiry: 'test', + call: ['pick1', 'read', 'stat', 'write', 'writeUrl', 'store', 'convert', 'remove', 'exif', 'runWorkflow'], + handle: 'TEST_HANDLE', + }; + const appSecret = 'testAppSecret'; + // @ts-ignore + expect(() => getSecurity(policy, appSecret)).toThrowError('Invalid security params'); + }); + }); +}); diff --git a/src/lib/api/security.ts b/src/lib/api/security.ts index 68b36943..aa48e6c7 100644 --- a/src/lib/api/security.ts +++ b/src/lib/api/security.ts @@ -15,10 +15,10 @@ * limitations under the License. */ -import * as crypto from 'crypto'; import { Security } from '../client'; -import { checkOptions } from '../utils'; -import * as t from 'tcomb-validation'; +import { FilestackError, FilestackErrorType } from './../../filestack_error'; +import { getValidator, SecurityParamsSchema } from './../../schema'; +import { isNode, requireNode } from '../utils'; /** * Configures a security policy @@ -26,7 +26,7 @@ import * as t from 'tcomb-validation'; * @see https://www.filestack.com/docs/concepts/security */ export interface SecurityOptions { - expiry?: number; + expiry: number; call?: any[]; handle?: string; url?: string; @@ -51,21 +51,18 @@ export interface SecurityOptions { * @param appSecret */ export const getSecurity = (policyOptions: SecurityOptions, appSecret: string): Security => { - const allowed = [ - { name: 'expiry', type: t.Integer }, - { name: 'call', type: t.list(t.enums.of('pick read stat write writeUrl store convert remove exif')) }, - { name: 'handle', type: t.String }, - { name: 'url', type: t.String }, - { name: 'maxSize', type: t.Integer }, - { name: 'minSize', type: t.Integer }, - { name: 'path', type: t.String }, - { name: 'container', type: t.String }, - ]; + if (!isNode()) { + throw new Error('getSecurity is only supported in nodejs'); + } - checkOptions('Policy options', allowed, policyOptions); + const validateRes = getValidator(SecurityParamsSchema)(policyOptions); - const policy = new Buffer(JSON.stringify(policyOptions)).toString('base64'); - const signature = crypto.createHmac('sha256', appSecret) + if (validateRes.errors.length) { + throw new FilestackError(`Invalid security params`, validateRes.errors, FilestackErrorType.VALIDATION); + } + + const policy = Buffer.from(JSON.stringify(policyOptions)).toString('base64'); + const signature = requireNode('crypto').createHmac('sha256', appSecret) .update(policy) .digest('hex'); diff --git a/src/lib/api/store.spec.ts b/src/lib/api/store.spec.ts index f1107f50..8d0db45b 100644 --- a/src/lib/api/store.spec.ts +++ b/src/lib/api/store.spec.ts @@ -15,146 +15,108 @@ * limitations under the License. */ -import * as assert from 'assert'; import { storeURL } from './store'; +import { Session } from '../client'; +import { Filelink } from './../filelink'; +import * as nock from 'nock'; + +const testHost = 'https://test.com'; +const testUrl = 'testurl'; +const mockGet = jest.fn().mockName('mockGet'); +const mockHandle = 'mockHandle'; + +jest.mock('./../filelink'); + +const mockedSession: Session = { + apikey: 'fakeApikey', + urls: { + cdnUrl: testHost, + fileApiUrl: 'fakeApiUrl', + uploadApiUrl: 'fakeUploadApiUrl', + cloudApiUrl: 'fakeCloudApiUrl', + pickerUrl: 'fakePickerUrl', + }, +}; + +const responseObj = { + filename: 'testFilename', + handle: 'testHandle', + url: 'testUrl', + type: 'testMimetype', + mimetype: 'testMimetype', + size: 1, +}; + +describe('StoreURL', () => { + beforeAll(() => { + spyOn(Filelink.prototype, 'toString').and.returnValue(`${testHost}/${testUrl}`); + mockGet.mockReturnValue(responseObj); + + nock(testHost) + .persist() + .get(`/${testUrl}`) + .reply(200, mockGet); + }); -declare var ENV: any; -const session = ENV.session; -const secureSession = ENV.secureSession; + it('should call correct store method', async () => { + expect(await storeURL(mockedSession, 'http://test.com')).toEqual(responseObj); + }); -describe('storeURL', function storeFunc() { - this.timeout(30000); + it('should respect passed security and policy', async () => { + const fakeSecurity = { + signature: 'fakeS', + policy: 'fakeP', + }; - it('should throw an error if no url is set', () => { - assert.throws(() => storeURL(session)); - }); + const res = await storeURL(mockedSession, mockHandle, {}, null, fakeSecurity); - it('should handle store without params', (done) => { - const options = {}; - storeURL(session, ENV.urls.testImageUrl, options) - .then((res) => { - assert.ok(res); - done(); - }) - .catch((err) => { - done(err); - }); + expect(Filelink.prototype.security).toBeCalledWith(fakeSecurity); + expect(res).toEqual(responseObj); }); - it('should support uppercase string options', (done) => { - const options = { location: 'S3' }; - storeURL(session, ENV.urls.testImageUrl, options) - .then((res) => { - assert.ok(res); - done(); - }) - .catch((err) => { - done(err); - }); + it('should throw error on wrong store params', () => { + expect(() => storeURL(mockedSession, mockHandle, { + // @ts-ignore + test: 123, + })).toThrowError('Invalid store params'); }); - it('should replace ":" and "," with "_" in url', (done) => { - const options = { filename: 'test:t,est.jpg' }; - storeURL(session, ENV.urls.testImageUrl, options) - .then((res) => { - assert.ok(res); - done(); - }) - .catch((err) => { - done(err); - }); - }); + it('should respect token cancel', () => { + const token = { + cancel: () => jest.fn(), + }; - it('should upload file correctly with "/" in path', (done) => { - const options = { filename: 'test.jpg' , path: 'test/path'}; - storeURL(session, ENV.urls.testImageUrl, options) - .then((res) => { - assert.ok(res); - done(); - }) - .catch((err) => { - done(err); - }); + setImmediate(() => token.cancel()); + return expect(storeURL(mockedSession, mockHandle, {}, token)).rejects.toEqual({}); }); - it('should get an ok response with a valid url', (done) => { - storeURL(session, ENV.urls.testImageUrl) - .then((res) => { - assert.ok(res); - done(); - }) - .catch((err) => { - done(err); - }); + it('should throw an error when missing url', async () => { + expect(() => storeURL(mockedSession)).toThrowError(); }); - it('should get an ok response with a valid url and security', (done) => { - storeURL(secureSession, ENV.urls.testImageUrl) - .then((res) => { - assert.ok(res); - done(); - }) - .catch((err) => { - done(err); - }); - }); + it('should rejects on request error', () => { + // @ts-ignore + Filelink.prototype.toString.and.returnValue(`${testHost}/${testUrl}/404`); - it('should return the handle and mimetype as part of the response', (done) => { - storeURL(session, ENV.urls.testImageUrl) - .then((res: any) => { - assert.ok(res.handle); - assert.equal(res.url.split('/').pop(), res.handle); - assert.equal(res.mimetype, res.type); - done(); - }) - .catch((err) => { - done(err); - }); - }); + nock(testHost) + .get(`/${testUrl}/404`) + .reply(404); - it('should reject on request error', (done) => { - const sessionCopy = JSON.parse(JSON.stringify(session)); - sessionCopy.urls.cdnUrl = 'http://www.somebadurl.com'; - - storeURL(sessionCopy, ENV.urls.testImageUrl) - .then(() => { - done(new Error('Success shouldnt be called')); - }) - .catch((err) => { - assert.ok(err instanceof Error); - done(); - }); + return expect(storeURL(mockedSession, mockHandle, {})).rejects.toEqual(expect.any(Error)); }); - it('should cancel request', (done) => { - const token = { - cancel: () => console.log('cancel not implemented'), - }; + it('should rejects on wrong body structure', async () => { + // @ts-ignore + Filelink.prototype.toString.and.returnValue(`${testHost}/${testUrl}/body`); - setTimeout(() => { - storeURL(session, ENV.urls.testImageUrl, {}, token) - .then(() => { - done(new Error('Success shouldnt be called')); - }) - .catch((err) => { - assert.ok(err instanceof Error); - done(); - }); - }, 10); - - setTimeout(() => token.cancel(), 12); - }); + mockGet.mockReturnValue({ + test: 123, + }); - it('should support workflows', (done) => { - const options = { workflows: ['test', { id: 'test' }] }; - storeURL(session, ENV.urls.testImageUrl, options) - .then((res) => { - assert.ok(res); - done(); - }) - .catch((err) => { - done(err); - }); - }); + nock(testHost) + .get(`/${testUrl}/body`) + .reply(200, mockGet); + return expect(storeURL(mockedSession, mockHandle, {})).rejects.toEqual(expect.any(Error)); + }); }); diff --git a/src/lib/api/store.ts b/src/lib/api/store.ts index 74407636..659fe7ff 100644 --- a/src/lib/api/store.ts +++ b/src/lib/api/store.ts @@ -1,4 +1,3 @@ -import { Filelink } from './../filelink'; /* * Copyright (c) 2018 by Filestack. * Some rights reserved. @@ -17,8 +16,10 @@ import { Filelink } from './../filelink'; */ import { request } from './request'; -import { Security, StoreOptions } from '../client'; -import { transform } from './transform'; +import { Security, Session } from '../client'; +import { Filelink, StoreParams } from './../filelink'; +import { FilestackError } from './../../filestack_error'; +import { getValidator, StoreParamsSchema } from './../../schema'; /** * @@ -30,26 +31,28 @@ import { transform } from './transform'; * @param security */ export const storeURL = ( - session: any, + session: Session, url?: string, - opts?: StoreOptions, + opts?: StoreParams, token?: any, security?: Security -): Promise<{}> => { +): Promise => { if (!url || typeof url !== 'string') { throw new Error('url is required for storeURL'); } + const validateRes = getValidator(StoreParamsSchema)(opts); + + if (validateRes.errors.length) { + throw new FilestackError(`Invalid store params`, validateRes.errors); + } + session.policy = security && security.policy || session.policy; session.signature = security && security.signature || session.signature; const baseURL = new Filelink(url, session.apikey); baseURL.setCname(session.cname); - // baseURL.setBase64(true); // Enable it after fix in mocks - - if (session.urls.cdnUrl.indexOf('localhost') > -1 || session.urls.cdnUrl.indexOf('badurl') > -1) { - baseURL.setCustomDomain(session.urls.cdnUrl); - } + baseURL.setBase64(true); if (session.policy && session.signature) { baseURL.security({ @@ -59,30 +62,21 @@ export const storeURL = ( } baseURL.store(opts); + let options: any = {}; - // const baseURL = transform(session, url, { - // store : opts || {}, - // }); - return new Promise((resolve, reject) => { - const req = request.get(baseURL.toString()); + if (token) { + const CancelToken = request.CancelToken; + const source = CancelToken.source(); + token.cancel = source.cancel; - if (token) { - token.cancel = () => { - req.abort(); - reject(new Error('Upload cancelled')); - }; - } + options.cancelToken = source.token; + } - return req.then((res: any) => { - if (res.body && res.body.url) { - const handle = res.body.url.split('/').pop(); - const response = { ...res.body, handle, mimetype: res.body.type }; - return resolve(response); - } + return request.get(baseURL.toString(), options).then((res) => { + if (res.data && res.data.handle) { + return { ...res.data, mimetype: res.data.type }; + } - return resolve(res.body); - }).catch((err) => { - reject(err); - }); + throw new FilestackError(`Invalid store response ${JSON.stringify(res.data)}`); }); }; diff --git a/src/lib/api/transform.spec.ts b/src/lib/api/transform.spec.ts index d5ff946d..88e4b20e 100644 --- a/src/lib/api/transform.spec.ts +++ b/src/lib/api/transform.spec.ts @@ -14,678 +14,124 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import * as assert from 'assert'; -import * as t from './transform'; -import { btoa } from 'abab'; - -declare var ENV: any; -const session = ENV.session; -const secureSession = ENV.secureSession; -const cdnUrl = session.urls.cdnUrl; - -describe('transform', () => { - const transform = (url: string, options: any, b64: boolean = false) => t.transform(session, url, options, b64); - const transformSecure = (url: string, options: any, b64: boolean = false) => t.transform(secureSession, url, options, b64); - - const url = ENV.filelink; - - it('should throw an error if invalid options are provided', () => { - assert.throws(() => transform(url, { invalidKey: 'ignored' })); - }); - - it('should construct URL parameters from specified transforms', () => { - const testConfig = { - vignette: { - amount: 100, - blurmode: 'linear', - }, - shadow: { - blur: 10, - opacity: 35, - vector: [25, 25], - }, - }; - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/vignette=amount:100,blurmode:linear/shadow=blur:10,opacity:35,vector:[25,25]/${url}`; - assert.equal(result, expected); - }); - - it('should construct URL parameters properly with primitive options', () => { - const testConfig = { - polaroid: true, - flip: false, - flop: true, - compress: false, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/polaroid/flop/${url}`; - assert.equal(result, expected); - }); - - it('should construct URL with security properly', () => { - const testConfig = { - polaroid: true, - }; - const result = transformSecure(url, testConfig); - const expected = `${cdnUrl}/${secureSession.apikey}/polaroid/security=policy:${secureSession.policy},signature:${secureSession.signature}/${url}`; - assert.equal(result, expected); - }); - - it('should return base url if there are no transforms', () => { - const testConfig = {}; - const result = transform(url, testConfig); - - assert.equal(result, `${cdnUrl}/${session.apikey}/${url}`); - }); - - it('should return flatten nested options array', () => { - const testConfig = { - partial_pixelate: { - objects: [[10, 20, 200, 250], [275, 91, 500, 557]], - }, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/partial_pixelate=objects:[[10,20,200,250],[275,91,500,557]]/${url}`; - assert.equal(result, expected); - }); - - it('should handle camelCased params', () => { - const testConfig = { - partialPixelate: { - objects: [[10, 20, 200, 250], [275, 91, 500, 557]], - }, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/partial_pixelate=objects:[[10,20,200,250],[275,91,500,557]]/${url}`; - assert.equal(result, expected); - }); - - it('should handle storage with url handle', () => { - const storeAlias = 'https://test.com/file.js'; - - const testConfig = { - polaroid: true, - flip: false, - flop: true, - }; - - const result = transform(storeAlias, testConfig); - const expected = `${cdnUrl}/${session.apikey}/polaroid/flop/"${storeAlias}"`; - assert.equal(result, expected); - }); - - it('should handle storage with http url handle', () => { - const storeAlias = 'http://test.com/file.js'; - - const testConfig = { - polaroid: true, - flip: false, - flop: true, - }; - - const result = transform(storeAlias, testConfig); - const expected = `${cdnUrl}/${session.apikey}/polaroid/flop/"${storeAlias}"`; - assert.equal(result, expected); - }); - - it('should throw exception when storage alias is provided without apikey', () => { - const sessionCopy = JSON.parse(JSON.stringify(session)); - sessionCopy.apikey = null; - const testConfig = {}; - - assert.throws(() => t.transform(sessionCopy, 'src:test', testConfig)); - }); - - it('should handle store aliases', () => { - const storeAlias = 'src://my-s3/mydoc.pdf'; - - const testConfig = { - polaroid: true, - flip: false, - flop: true, - }; - - const result = transform(storeAlias, testConfig); - const expected = `${cdnUrl}/${session.apikey}/polaroid/flop/"${storeAlias}"`; - assert.equal(result, expected); - }); - - it('should validate float ranges in options', () => { - const testConfig = { - detect_faces: { - minsize: 0.2, - }, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/detect_faces=minsize:0.2/${url}`; - assert.equal(result, expected); - }); - - it('should return base url with handle if there is empty transform option', () => { - const testConfig = { - polaroid: {}, - }; - - const result = transform(url, testConfig); - assert.equal(result, `${cdnUrl}/${session.apikey}/polaroid/${url}`); - }); - - it('should handle store without params', () => { - const options = {}; - const result = transform(url, { store: options }); - - assert.equal(result, `${cdnUrl}/${session.apikey}/store/${url}`); - }); - - it('should return correct store URL with "/" in path', () => { - const options = { filename: 'test.jpg' , path: 'test/path' }; - const result = transform(url, { store: options }); - - assert.equal(result, `${cdnUrl}/${session.apikey}/store=filename:test.jpg,path:"test/path"/${url}`); - }); - - it('should handle upper cased path', () => { - const options = { filename: 'test.jpg' , path: 'tEsT/path' }; - const result = transform(url, { store: options }); - - assert.equal(result, `${cdnUrl}/${session.apikey}/store=filename:test.jpg,path:"tEsT/path"/${url}`); - }); - - describe('blackwhite', () => { - it('should construct valid parameters', () => { - const testConfig = { - blackwhite: { - threshold: 100, - }, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/blackwhite=threshold:100/${url}`; - assert.equal(result, expected); - }); - }); - - describe('crop', () => { - it('should construct valid parameters', () => { - const testConfig = { - crop: { - dim: [0, 0, 200, 200], - }, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/crop=dim:[0,0,200,200]/${url}`; - assert.equal(result, expected); - }); - }); - - describe('rotate', () => { - it('should construct valid parameters', () => { - const testConfig: t.TransformOptions = { - rotate: { - deg: 'exif', - }, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/rotate=deg:exif/${url}`; - assert.equal(result, expected); - }); - }); - - describe('output', () => { - it('should construct valid parameters', () => { - const testConfig = { - output: { - background: 'black', - density: 250, - compress: true, - }, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/output=background:black,density:250,compress:true/${url}`; - assert.equal(result, expected); - }); - }); - - describe('cache', () => { - it('should construct valid parameters', () => { - const testConfig = { - cache: false, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/cache=false/${url}`; - assert.equal(result, expected); - - const testConfig2 = { - cache: { - expiry: 12345, - }, - }; - - const result2 = transform(url, testConfig2); - const expected2 = `${cdnUrl}/${session.apikey}/cache=expiry:12345/${url}`; - assert.equal(result2, expected2); - }); - }); - - describe('compress', () => { - it('should construct valid parameters', () => { - const testConfig = { - compress: true, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/compress/${url}`; - assert.equal(result, expected); - }); - }); -}); - -describe('transform b64', () => { - const transform = (url: string, options: any, b64: boolean = true) => t.transform(session, url, options, b64); - const transformSecure = (url: string, options: any, b64: boolean = true) => t.transform(secureSession, url, options, b64); - - const url = ENV.filelink; - - it('should throw an error if invalid options are provided', () => { - assert.throws(() => transform(url, { invalidKey: 'ignored' })); - }); - - it('should construct URL parameters from specified transforms', () => { - const testConfig = { - vignette: { - amount: 100, - blurmode: 'linear', - }, - shadow: { - blur: 10, - opacity: 35, - vector: [25, 25], - }, - }; - - const result = transform(url, testConfig, true); - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ - { - name: 'vignette', - params: { - amount: 100, - blurmode: 'linear', - }, - }, { - name: 'shadow', - params: { - blur: 10, - opacity: 35, - vector: [25, 25], - }, - }, - ]))}/b64://${btoa(url)}`; - assert.equal(result, expected); - }); - - it('should construct URL parameters properly with primitive options', () => { - const testConfig = { - polaroid: true, - flip: false, - flop: true, - compress: false, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ - { - name: 'polaroid', - }, - { - name: 'flop', - }, - ]))}/b64://${btoa(url)}`; - assert.equal(result, expected); - }); - - it('should construct URL with security properly', () => { - const testConfig = { - polaroid: true, - }; - - const result = transformSecure(url, testConfig); - const expected = `${cdnUrl}/${secureSession.apikey}/b64/${btoa(JSON.stringify([ - { - name: 'polaroid', - }, - { - name: 'security', - params: { - policy: secureSession.policy, - signature: secureSession.signature, - }, - }, - ]))}/b64://${btoa(url)}`; - - assert.equal(result, expected); - }); - - it('should return base url if there are no transforms', () => { - const testConfig = {}; - const result = transform(url, testConfig); - - const expected = `${cdnUrl}/${session.apikey}/b64://${btoa(url)}`; - - assert.equal(result, expected); - }); - - it('should return flatten nested options array', () => { - const testConfig = { - partial_pixelate: { - objects: [[10, 20, 200, 250], [275, 91, 500, 557]], - }, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ - { - name: 'partial_pixelate', - params: { - objects: [[10, 20, 200, 250], [275, 91, 500, 557]], - }, - }, - ]))}/b64://${btoa(url)}`; - - assert.equal(result, expected); - }); - - it('should handle camelCased params', () => { - const testConfig = { - partialPixelate: { - objects: [[10, 20, 200, 250], [275, 91, 500, 557]], - }, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ +import { transform } from './transform'; +import { config } from './../../config'; +import { Filelink } from './../filelink'; + +jest.mock('./../filelink'); + +const defaultApikey = 'EXAMPLE_API_KEY'; +const defaultHandle = 'EXAMPLE_HANDLE'; +const defaultSecurity = { + policy: 'examplePolicy', + signature: 'exampleSignature', +}; + +const sessionURls = config.urls; +const defaultSession = { + apikey: defaultApikey, + urls: sessionURls, +}; + +describe('OldTransforms', () => { + it('should pass params to Filelink class', () => { + transform( + defaultSession, + defaultHandle, { - name: 'partial_pixelate', - params: { - objects: [[10, 20, 200, 250], [275, 91, 500, 557]], + partial_pixelate: { + amount: 2, }, - }, - ]))}/b64://${btoa(url)}`; - - assert.equal(result, expected); - }); - - it('should handle transform with url handle', () => { - const storeAlias = 'https://test.com/file.js'; - - const testConfig = { - polaroid: true, - flip: false, - flop: true, - }; - - const result = transform(storeAlias, testConfig); - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ - { - name: 'polaroid', - }, { - name: 'flop', - }, - ]))}/b64://${btoa(storeAlias)}`; + } + ); - assert.equal(result, expected); + expect(Filelink.prototype.addTask).toHaveBeenCalledWith('partial_pixelate', { + amount: 2, + }); }); - it('should handle store aliases', () => { - const storeAlias = 'src://my-s3/mydoc.pdf'; - - const testConfig = { - polaroid: true, - flip: false, - flop: true, - }; - - const result = transform(storeAlias, testConfig); - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ + it('should respect security params', () => { + transform( { - name: 'polaroid', - }, { - name: 'flop', - }, - ]))}/b64://${btoa(storeAlias)}`; - - assert.equal(result, expected); - }); - - it('should validate float ranges in options', () => { - const testConfig = { - detect_faces: { - minsize: 0.2, + ...defaultSession, + ...defaultSecurity, }, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ + defaultHandle, { - name: 'detect_faces', - params: { - minsize: 0.2, + partial_pixelate: { + amount: 2, }, - }, - ]))}/b64://${btoa(url)}`; + } + ); - assert.equal(result, expected); + expect(Filelink.prototype.addTask).toHaveBeenCalledWith('security', defaultSecurity); }); - it('should return base url with handle if there is empty transform option', () => { - const testConfig = { - polaroid: {}, - }; - - const result = transform(url, testConfig); - - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ + it('should respect cache=false transformation', () => { + transform( + defaultSession, + defaultHandle, { - name: 'polaroid', - }, - ]))}/b64://${btoa(url)}`; - - assert.equal(result, expected); - }); - - it('should handle store without params', () => { - const options = {}; - const result = transform(url, { store: options }); - - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ - { - name: 'store', - }, - ]))}/b64://${btoa(url)}`; + // @ts-ignore + cache: false, + } + ); - assert.equal(result, expected); + expect(Filelink.prototype.addTask).toHaveBeenCalledWith('cache', false); }); - it('should return correct store URL with "/" in path', () => { - const options = { filename: 'test.jpg' , path: 'test/path' }; - const result = transform(url, { store: options }); - - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ + it('should remove falsy parameters transformation', () => { + transform( + defaultSession, + defaultHandle, { - name: 'store', - params: options, - }, - ]))}/b64://${btoa(url)}`; + flip: false, + } + ); - assert.equal(result, expected); + expect(Filelink.prototype.addTask).not.toHaveBeenCalledWith('flip', false); }); - it('should handle upper cased path', () => { - const options = { filename: 'test.jpg' , path: 'tEsT/path '}; - const result = transform(url, { store: options }); - - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ + it('should change cammel case to snake case transformations', () => { + transform( + defaultSession, + defaultHandle, { - name: 'store', - params: options, - }, - ]))}/b64://${btoa(url)}`; - - assert.equal(result, expected); - }); - - describe('blackwhite', () => { - it('should construct valid parameters', () => { - const testConfig = { - blackwhite: { - threshold: 100, + // @ts-ignore + partialPixelate: { + amount: 2, }, - }; + } + ); - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ - { - name: 'blackwhite', - params: { - threshold: 100, - }, - }, - ]))}/b64://${btoa(url)}`; - - assert.equal(result, expected); + expect(Filelink.prototype.addTask).toHaveBeenCalledWith('partial_pixelate', { + amount: 2, }); }); - describe('crop', () => { - it('should construct valid parameters', () => { - const testConfig = { - crop: { - dim: [0, 0, 200, 200], - }, - }; + it('return call toString on filelink when params are empty', () => { + const testUrl = 'nanana'; + spyOn(Filelink.prototype, 'toString').and.callFake(() => testUrl); - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ - { - name: 'crop', - params: { - dim: [0, 0, 200, 200], - }, - }, - ]))}/b64://${btoa(url)}`; - - assert.equal(result, expected); - }); + expect(transform( + defaultSession, + defaultHandle + )).toEqual(testUrl); }); - describe('rotate', () => { - it('should construct valid parameters', () => { - const testConfig: t.TransformOptions = { - rotate: { - deg: 'exif', - }, - }; - - const result = transform(url, testConfig); - - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ - { - name: 'rotate', - params: { - deg: 'exif', - }, - }, - ]))}/b64://${btoa(url)}`; - - assert.equal(result, expected); - }); - }); - - describe('output', () => { - it('should construct valid parameters', () => { - const testConfig = { - output: { - background: 'black', - density: 250, - compress: true, - }, - }; - - const result = transform(url, testConfig); - - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ - { - name: 'output', - params: { - background: 'black', - density: 250, - compress: true, - }, - }, - ]))}/b64://${btoa(url)}`; - - assert.equal(result, expected); - }); - }); - - describe('cache', () => { - it('should construct valid parameters', () => { - const testConfig = { - cache: false, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ - { - name: 'cache', - params: false, - }, - ]))}/b64://${btoa(url)}`; - - assert.equal(result, expected); - - const testConfig2 = { - cache: { - expiry: 12345, - }, - }; - - const result2 = transform(url, testConfig2); - const expected2 = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ - { - name: 'cache', - params: { - expiry: 12345, - }, - }, - ]))}/b64://${btoa(url)}`; - - assert.equal(result2, expected2); - }); - }); - - describe('compress', () => { - it('should construct valid parameters', () => { - const testConfig = { - compress: true, - }; - - const result = transform(url, testConfig); - const expected = `${cdnUrl}/${session.apikey}/b64/${btoa(JSON.stringify([ - { - name: 'compress', + it('should enable base64 on filelink', () => { + transform( + defaultSession, + defaultHandle, + { + // @ts-ignore + partialPixelate: { + amount: 2, }, - ]))}/b64://${btoa(url)}`; + }, + true + ); - assert.equal(result, expected); - }); + expect(Filelink.prototype.setBase64).toHaveBeenCalledWith(true); }); }); diff --git a/src/lib/api/transform.ts b/src/lib/api/transform.ts index 2e71c90b..d1692194 100644 --- a/src/lib/api/transform.ts +++ b/src/lib/api/transform.ts @@ -429,7 +429,7 @@ export interface TransformOptions { * result => https://cdn.filestackcontent.com/partial_pixelate=objects:[[10,20,200,250],[275,91,500,557]]/testfile * * ```js - * // snakeCase + * // snake_case * console.log(transform(session, { * partial_pixelate: { * objects: [[10, 20, 200, 250], [275, 91, 500, 557]], @@ -459,10 +459,6 @@ export const transform = (session: Session, url: string | string[], options: Tra filelink.setCname(session.cname); filelink.setBase64(b64); - if (session.urls.cdnUrl.indexOf('localhost') > -1) { - filelink.setCustomDomain(session.urls.cdnUrl); - } - Object.keys(options).forEach((key: keyof TransformOptions) => { if (typeof options[key] === 'boolean' && !options[key] && key !== 'cache') { return; diff --git a/src/lib/api/upload/file.spec.ts b/src/lib/api/upload/file.spec.ts new file mode 100644 index 00000000..019517e1 --- /dev/null +++ b/src/lib/api/upload/file.spec.ts @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { FileInstance, File } from './file'; + +describe('Api/Upload/File', () => { + const testBuff = Buffer.from('test'); + const fileName = 'text.txt'; + const type = 'text/plain'; + + const fi: FileInstance = { + name: fileName, + type, + size: testBuff.byteLength, + buffer: testBuff, + }; + + let file; + + beforeEach(() => { + file = new File(Object.assign({}, fi)); + }); + + it('Should load correct file without errors', () => { + expect(file.filename).toEqual(fileName); + expect(file.name).toEqual(fileName); + + expect(file.type).toEqual(type); + expect(file.mimetype).toEqual(type); + + expect(file.size).toEqual(testBuff.byteLength); + }); + + it('should allow to set new name with with sanitization', () => { + file.name = 'test123//.txt'; + + expect(file.name).toEqual('test123//.txt'); + }); + + it('should set custom name by string and sanitize it', () => { + file.customName = 'test123##.txt'; + + expect(file.name).toEqual('test123--.txt'); + }); + + it('should set custom name by function and sanitize it', () => { + file.customName = () => { + return 'test123 ##.txt'; + }; + + expect(file.name).toEqual('test123 --.txt'); + }); + + it('should throw an error when custom name function is not returning string', () => { + expect(() => { + file.customName = () => { + return {}; + }; + }).toThrow(); + }); + + it('should return file md5', () => { + expect(file.md5).toEqual('CY9rzUYh03PK3k6DJie09g=='); + }); + + it('should return correct parts count for given size', () => { + expect(file.getPartsCount(1)).toEqual(file.size); + }); + + it('should return correct part metadata', () => { + expect(file.getPartMetadata(0, 2)).toEqual({ endByte: 2, partNumber: 0, size: 2, startByte: 0 }); + expect(file.getPartMetadata(1, 2)).toEqual({ endByte: 4, partNumber: 1, size: 2, startByte: 2 }); + expect(file.getPartMetadata(0, 6)).toEqual({ endByte: 4, partNumber: 0, size: 4, startByte: 0 }); + + }); + + it('should throw an error when start part is higher than part size ', () => { + expect(() => { + file.getPartMetadata(1, 6); + }).toThrow(); + }); + + it('should return part by part metadata', () => { + const meta = file.getPartMetadata(0, 2); + const part = file.getPartByMetadata(meta); + + expect(part.buffer.byteLength).toEqual(2); + expect(part.md5).toEqual('Vp73JkK+D63XEdakaNaO4Q=='); + }); + + it('should return chunk by part metadata and offset', () => { + const meta = file.getPartMetadata(0, 4); + const chunk = file.getChunkByMetadata(meta, 1, 2); + + expect(chunk.size).toEqual(2); + expect(chunk.md5).toEqual('EkcP5AbUQBfZbqs33WX8FA=='); + expect(chunk.startByte).toEqual(1); + expect(chunk.endByte).toEqual(3); + }); + + it('should release file buffer', () => { + file.release(); + + expect(file.buffer).toEqual(undefined); + }); + + it('should return json representation of the file', () => { + const json = JSON.parse(JSON.stringify(file)); + + expect(json).toEqual({ + name: fileName, + type, + size: file.size, + }); + }); +}); diff --git a/src/lib/api/upload/file.ts b/src/lib/api/upload/file.ts new file mode 100644 index 00000000..bd3c7fd6 --- /dev/null +++ b/src/lib/api/upload/file.ts @@ -0,0 +1,283 @@ +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { md5, sanitizeName, SanitizeOptions } from './../../utils'; + +export interface FileInstance { + buffer?: Buffer | ArrayBuffer; + name: string; + type: string; + size: number; +} + +export const enum FileState { + INIT = 'Initialized', + PROGRESS = 'Progress', + STORED = 'Stored', + INTRANSIT = 'InTransit', + FAILED = 'Failed', +} + +export interface FilePartMetadata { + startByte: number; + endByte: number; + partNumber: number; + size: number; +} + +export interface FilePart extends FilePartMetadata { + buffer: Buffer | ArrayBuffer; + md5: string; +} + +export interface FileChunk extends FilePart { + offset: number; // offset for chunk - from part start +} + +/** + * File representation to unify file object in nodejs and browser + * + * @export + * @class File + */ +export class File { + + private _md5: string; + + public status: FileState; + + public handle: string; + + public url: string; + + public container: string; + + public key: string; + + public workflows: any[]; + + constructor(private readonly _file: FileInstance, private readonly _sanitizeOptions?: SanitizeOptions) { + this._file.name = sanitizeName(this._file.name, this._sanitizeOptions); + } + + /** + * Returns file name + * + * @returns {string} + * @memberof File + */ + public get name(): string { + return this._file.name; + } + + /** + * Alias for name getter + * + * @readonly + * @type {string} + * @memberof File + */ + public get filename(): string { + return this.name; + } + + /** + * Sets new file name and cleanup extra chars + * + * @memberof File + */ + public set name(val: string) { + this._file.name = sanitizeName(val, this._sanitizeOptions); + } + + /** + * Sets custom name using string or function + * Name will be sanitized + * + * @memberof File + */ + public set customName(val: ((file: this) => string) | string) { + switch (typeof val) { + case 'string': + this.name = val; + break; + case 'function': + const newName = val(this); + if (typeof newName !== 'string') { + throw new Error(`Name function must return a string. Current return type is ${typeof val}`); + } + + this.name = val(this); + break; + } + } + + /** + * Returns file type + * + * @default 'application/octet-stream' + * @returns {string} + * @memberof File + */ + public get type(): string { + /* istanbul ignore next */ + return this._file.type || 'application/octet-stream'; + } + + /** + * Alias for file type + * + * @readonly + * @type {string} + * @memberof File + */ + public get mimetype(): string { + return this.type; + } + + /** + * Returns file buffer + * + * @returns {(Buffer | ArrayBuffer)} + * @memberof File + */ + public get buffer(): Buffer | ArrayBuffer { + return this._file.buffer; + } + + /** + * Returns file size + * + * @returns {number} + * @memberof File + */ + public get size(): number { + return this._file.size; + } + + /** + * Returns file md5 checksum + * + * @returns {string} + * @memberof File + */ + public get md5(): string { + if (!this._md5) { + // cache md5 file value + this._md5 = md5(this._file.buffer); + } + + return this._md5; + } + + /** + * Returns number of parts according to part size + * + * @param {number} size - part size in bytes + * @returns {number} + * @memberof File + */ + public getPartsCount (size: number): number { + return Math.ceil(this._file.buffer.byteLength / size); + } + + /** + * Returns part metadata + * + * @param {number} [partNum=0] + * @param {*} size + * @returns {FilePartMetadata} + * @memberof File + */ + public getPartMetadata (partNum: number, size): FilePartMetadata { + const startByte = size * partNum; + + if (startByte > this._file.buffer.byteLength) { + throw new Error(`Start byte of the part is higher than buffer size`); + } + + const endByte = Math.min(startByte + size, this._file.buffer.byteLength); + + return { + partNumber: partNum, + startByte, + endByte, + size: endByte - startByte, + }; + } + + /** + * Returns part metadata + buffer + * + * @param {FilePartMetadata} meta + * @returns {FilePart} + * @memberof File + */ + public getPartByMetadata(meta: FilePartMetadata): FilePart { + let slice = this._file.buffer.slice(meta.startByte, meta.endByte); + + return { + ...meta, + buffer: slice, + md5: md5(slice), + }; + } + + /** + * Returns part chunk + * + * @param {FilePartMetadata} meta + * @param {number} offset + * @param {number} chunkSize + * @returns {FilePart} + * @memberof File + */ + public getChunkByMetadata(meta: FilePartMetadata, offset: number, chunkSize: number): FileChunk { + const startByte = meta.startByte + offset; + const endByte = Math.min(startByte + chunkSize, meta.endByte); + + let slice = this._file.buffer.slice(startByte, endByte); + + return { + ...meta, + buffer: slice, + md5: md5(slice), + size: slice.byteLength, + startByte, + endByte, + offset, + }; + } + /** + * Cleanup file buffer to release memory + * + * @memberof File + */ + public release() { + delete this._file.buffer; + } + + public toJSON() { + return { + name: this.name, + status: this.status, + type: this.type, + size: this.size, + url: this.url, + handle: this.handle, + }; + } +} diff --git a/src/lib/api/upload/file_tools.spec.browser.ts b/src/lib/api/upload/file_tools.spec.browser.ts new file mode 100644 index 00000000..1b18c7fe --- /dev/null +++ b/src/lib/api/upload/file_tools.spec.browser.ts @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { getFile } from './file_tools'; +import * as utils from './../../utils'; + +const createFile = (size = 44320, name = 'test.png', type = 'image/png') => new File([new ArrayBuffer(size)], name , { type: type }); + +const sanitizeOptions = jest.fn().mockName('sanitizeOptions'); + +const base64Svg = 'PHN2ZyBoZWlnaHQ9IjEwMCIgd2lkdGg9IjEwMCI+CiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNDAiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0icmVkIiAvPgogIFNvcnJ5LCB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBpbmxpbmUgU1ZHLiAgCjwvc3ZnPiA='; +const base64Png = 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=='; +const base64Gif = 'R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw=='; + +describe('Api/Upload/FileTools', () => { + beforeAll(() => { + spyOn(utils, 'isNode').and.returnValue(false); + + spyOn(utils, 'sanitizeName').and.callFake((val, opts) => { + sanitizeOptions(opts); + return val; + }); + }); + + describe('getFileBrowser', () => { + + it('Should handle base64 encoded string (svg)', async () => { + return expect((await getFile(base64Svg)).mimetype).toEqual('image/svg+xml'); + }); + + it('Should handle base64 encoded string (png)', async () => { + return expect((await getFile(base64Png)).mimetype).toEqual('image/png'); + }); + + it('Should handle base64 encoded string (gif)', async () => { + return expect((await getFile(base64Gif)).mimetype).toEqual('image/gif'); + }); + + it('Should handle base64 encoded string with b64 prefix (gif)', async () => { + return expect((await getFile(`data:image/gif;base64,${base64Gif}`)).mimetype).toEqual('image/gif'); + }); + + it('Should pass sanitize options to file instance', async () => { + const soptions = { + replacement: '=', + }; + + const fileRes = await getFile({ + file: base64Png, + name: 'test<.jpg', + }, soptions); + + expect(sanitizeOptions).toHaveBeenCalledWith(soptions); + }); + + it('Should throw error when random string is provided', () => { + return expect(getFile('asdasdfasdf')).rejects.toEqual(new Error('Unsupported input file type')); + }); + + it('Should handle base64 named file (gif)', async () => { + const file = await getFile({ + file: base64Gif, + name: 'test.gif', + }); + expect(file.mimetype).toEqual('image/gif'); + expect(file.name).toEqual('test.gif'); + }); + + it('Should handle File input type', async () => { + const file = await getFile(createFile()); + expect(file.mimetype).toEqual('image/png'); + expect(file.name).toEqual('test.png'); + expect(file.size).toEqual(44320); + }); + + it('Should handle blob input type', async () => { + const file = await getFile(new Blob([new ArrayBuffer(100)], { + type: 'image/jpg', + })); + + expect(file.mimetype).toEqual('image/jpg'); + expect(file.name).toEqual(undefined); + expect(file.size).toEqual(100); + }); + }); +}); diff --git a/src/lib/api/upload/file_tools.spec.node.ts b/src/lib/api/upload/file_tools.spec.node.ts new file mode 100644 index 00000000..2b4feb12 --- /dev/null +++ b/src/lib/api/upload/file_tools.spec.node.ts @@ -0,0 +1,113 @@ + +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { getFile } from './file_tools'; +import * as fs from 'fs'; +import { File as FsFile } from './file'; + +jest.mock('fs'); + +const mockedTestFile = Buffer.from('text text'); +const base64Svg = 'PHN2ZyBoZWlnaHQ9IjEwMCIgd2lkdGg9IjEwMCI+CiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgcj0iNDAiIHN0cm9rZT0iYmxhY2siIHN0cm9rZS13aWR0aD0iMyIgZmlsbD0icmVkIiAvPgogIFNvcnJ5LCB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBpbmxpbmUgU1ZHLiAgCjwvc3ZnPiA='; + +describe('Api/Upload/FileTools', () => { + describe('getFileNode', () => { + + it('Should return file instance for nodejs loaded file from path', async () => { + spyOn(fs, 'existsSync').and.returnValue(true); + spyOn(fs, 'readFile').and.callFake((path, cb) => { + cb(null, mockedTestFile); + }); + + const file = await getFile('/testfile.txt'); + + expect(file.name).toEqual('testfile.txt'); + expect(file.mimetype).toEqual('text/plain'); + expect(file.size).toEqual(9); + }); + + it('Should reject if provided file cannot be read', () => { + spyOn(fs, 'existsSync').and.returnValue(true); + spyOn(fs, 'readFile').and.callFake((path, cb) => { + cb('error'); + }); + + return expect(getFile('/testfile.txt')).rejects.toEqual('error'); + }); + + it('Should return correct mimetype', async () => { + jest.unmock('fs'); + + const file = await getFile('./package.json'); + expect(file.mimetype).toEqual('text/plain'); + }); + + it('Should return correct file instance from buffer', async () => { + const file = await getFile(mockedTestFile); + + expect(file.size).toEqual(9); + expect(file.mimetype).toEqual('text/plain'); + }); + + it('Should handle base64 encoded string', async () => { + const file = await getFile(base64Svg); + expect(file.mimetype).toEqual('image/svg+xml'); + }); + + it('Should throw error when random string is provided', async () => { + return expect(getFile('asdasdfasdf')).rejects.toEqual(new Error('Unsupported input file type')); + }); + + it('Should pass sanitize options to file instance (buffer)', async () => { + const fileRes = await getFile({ + file: mockedTestFile, + name: 'test<.jpg', + }, { + replacement: '=', + }); + + expect(fileRes.name).toEqual('test=.jpg'); + }); + + it('Should pass sanitize options to file instance path', async () => { + const fileRes = await getFile({ + file: './package.json', + name: 'test<.jpg', + }, { + replacement: '=', + }); + + expect(fileRes.name).toEqual('test=.jpg'); + }); + + it('Should handle named file input', async () => { + const file = await getFile({ + name: '123.jpg', + file: mockedTestFile, + }); + + expect(file.name).toEqual('123.jpg'); + expect(file.size).toEqual(9); + expect(file.mimetype).toEqual('text/plain'); + }); + + it('Should reject on unsupported input file type', () => { + // @ts-ignore + return expect(getFile({})).rejects.toEqual(new Error('Unsupported input file type')); + }); + }); +}); diff --git a/src/lib/api/upload/file_tools.ts b/src/lib/api/upload/file_tools.ts new file mode 100644 index 00000000..84213ce8 --- /dev/null +++ b/src/lib/api/upload/file_tools.ts @@ -0,0 +1,258 @@ +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { File as FsFile } from './file'; +import { isNode, SanitizeOptions, requireNode, getMimetype } from './../../utils'; +import { FilestackError } from './../../../filestack_error'; + +export type RawFile = Blob | Buffer | File | string; +export type NamedInputFile = { + name?: string; + file: RawFile; +}; + +export type InputFile = RawFile | NamedInputFile; + +const base64Regexp = /data:([a-zA-Z]*\/[a-zA-Z]*);base64,([^\"]*)/i; + +/** + * Check if file is buffer + * + * @node + * @param input + */ +const isFileBuffer = (input: InputFile): input is Buffer => Buffer.isBuffer(input); + +/** + * Check if file is blob + * @param input + */ +const isFileBlob = (input: InputFile): input is Blob => input.toString() === '[object Blob]'; + +/** + * Check if input is instance of browser file + * + * @browser + * @param input + */ +const isFileBrowser = (input: InputFile): input is File => input instanceof File; + +/** + * Check if file is base64 string + * + * @param input + */ +const isFileBase = (input: InputFile): input is string => { + if (typeof input !== 'string') { + return false; + } + + if (input.indexOf('base64') > -1) { + input = input.match(base64Regexp).pop(); + } + + if (isNode()) { + if (Buffer.from(input, 'base64').toString('base64') === input) { + return true; + } + + return false; + } + + try { + return btoa(atob(input)) === input; + } catch (err) { + /* istanbul ignore next */ + return false; + } +}; + +/** + * Check if file is instance of named interface + * + * @param input + */ +const isFileNamed = (input: InputFile): input is NamedInputFile => input && input['file'] && input['name']; + +/** + * Check if input is a valid file path + * + * @node + * @param input + */ +const isFilePath = (input: InputFile): input is string => requireNode('fs').existsSync(input); + +/** + * Convert encoded base64 string or dataURI to blob + * + * @browser + * @param b64data String to decode + * @param sliceSize Byte quantity to split data into + * @private + * @returns {Blob} + */ +const b64toBlob = (b64Data: string, sliceSize = 512): Blob => { + let contentType = ''; + + if (b64Data.indexOf('base64') > -1) { + const matches = b64Data.match(base64Regexp); + b64Data = matches.pop(); + contentType = matches[1]; + } + + const byteCharacters = atob(b64Data); + const byteArrays: any[] = []; + + for (let offset = 0; offset < byteCharacters.length; offset += sliceSize) { + const slice = byteCharacters.slice(offset, offset + sliceSize); + const byteNumbers = new Array(slice.length); + for (let i = 0; i < slice.length; i += 1) { + byteNumbers[i] = slice.charCodeAt(i); + } + + byteArrays.push(new Uint8Array(byteNumbers)); + } + + return new Blob(byteArrays, { type: contentType }); +}; + +/** + * Read file as array buffer + * + * @browser + * @private + * @param blob + * @returns {Boolean} + */ +const readFile = (file): Promise => { + return new Promise((resolve, reject) => { + /* istanbul ignore next */ + if (!File || !FileReader || !Blob) { + return reject(new FilestackError('The File APIs are not fully supported by your browser')); + } + + const reader = new FileReader(); + + reader.onloadend = () => resolve(reader.result); + reader.onerror = reject; + reader.readAsArrayBuffer(file); + }); +}; + +// =================== BROWSER UTILS =================== +/** + * Accepts b64string or blob file + * + * @browser + * @param {*} fileOrString + * @returns {Promise} + */ +const getFileBrowser = (input: InputFile, sanitizeOptions?: SanitizeOptions): Promise => { + let filename; + let file: Blob; + + if (isFileNamed(input)) { + filename = input.name; + input = input.file; + } + + if (isFileBrowser(input)) { + file = input; + filename = input.name; + } else if (isFileBase(input)) { + file = b64toBlob(input); + } else if (isFileBlob(input)) { + file = input; + } else { + return Promise.reject(new FilestackError('Unsupported input file type')); + } + + return readFile(file).then( + buffer => + new FsFile( + { + buffer, + name: filename, + size: buffer.byteLength, + type: file.type || getMimetype(new Uint8Array(buffer)), + }, + sanitizeOptions + ) + ); +}; + +// =================== NODE UTILS =================== +/** + * Accepts Buffer or filepath or base64 string + * + * @node + * @param {*} inputFile + * @returns {Promise} + */ +const getFileNode = (input: InputFile, sanitizeOptions?: SanitizeOptions): Promise => { + let filename; + + if (isFileNamed(input)) { + filename = input.name; + input = input.file; + } + + if (isFilePath(input)) { + let path = input; + + return new Promise((resolve, reject) => + requireNode('fs').readFile(path, (err, buffer) => { + if (err) { + return reject(err); + } + + return resolve( + new FsFile( + { + buffer, + name: filename || requireNode('path').basename(path), + size: buffer.byteLength, + type: getMimetype(buffer), + }, + sanitizeOptions + ) + ); + }) + ); + } + + if (isFileBase(input)) { + input = Buffer.from(input, 'base64'); + } + + if (isFileBuffer(input)) { + return Promise.resolve( + new FsFile( + { + buffer: input, + name: filename, + size: input.byteLength, + type: getMimetype(input), + }, + sanitizeOptions + ) + ); + } + + return Promise.reject(new FilestackError('Unsupported input file type')); +}; + +export const getFile = (input: InputFile, sanitizeOptions?: SanitizeOptions) => (isNode() ? getFileNode(input, sanitizeOptions) : getFileBrowser(input, sanitizeOptions)); diff --git a/src/lib/api/upload/file_utils.ts b/src/lib/api/upload/file_utils.ts deleted file mode 100644 index 67674ad1..00000000 --- a/src/lib/api/upload/file_utils.ts +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2018 by Filestack. - * Some rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as fs from 'fs'; -import * as path from 'path'; -// import * as mime from 'mime'; -import * as mimetype from 'file-type'; -import { calcMD5 } from './md5'; -import { Context, PartObj, FileObj } from './types'; -import * as isutf8 from 'isutf8'; -import * as isSvg from 'is-svg'; - -/** - * Given a file with a valid descriptor this will return a part object - * The part object represents a chunk of the file - * @private - * @param file File object that contains a descriptor - * @param part Part object that contains a number field - * @param config Current upload configuration settings - */ -export const getPart = (part: PartObj, { config, file }: Context): Promise => { - return new Promise((resolve) => { - let length = config.partSize; - const start = config.partSize * part.number; - - if (file.buffer.byteLength < start + length) { - length = file.buffer.byteLength - start; - } - - const filePart = file.buffer.slice(start, start + length); - const partObj: PartObj = { - ...part, - buffer: filePart, - size: filePart.byteLength, - md5: calcMD5(filePart), - }; - - return resolve(partObj); - }); -}; - -/** - * Given a file path, returns a file object - * @private - * @param inputFile A valid path to a file on your filesystem or buffer. - */ -export const getFile = (inputFile: string | Buffer): Promise => { - if (inputFile instanceof Buffer) { - return Promise.resolve({ - buffer: inputFile, - name: undefined, - size: inputFile.byteLength, - type: getMimetype(inputFile) - } as FileObj); - } - - return new Promise((resolve, reject) => { - fs.readFile(inputFile, (err, buffer) => { - if (err) return reject(err); - const stats = fs.statSync(inputFile); - const file = { - buffer, - name: path.basename(inputFile), - size: stats.size, - type: getMimetype(buffer), - } as FileObj; - return resolve(file); - }); - }); -}; - -const getMimetype = (buffer) => { - const meta = mimetype(buffer); - if (meta) { - return meta.mime; - } - - if (isSvg(buffer)) { - return 'image/svg+xml'; - } - - if (isutf8(buffer)) { - return 'text/plain'; - } - - return 'application/octet-stream'; -}; diff --git a/src/lib/api/upload/index.ts b/src/lib/api/upload/index.ts index b05e45d6..c939f50c 100644 --- a/src/lib/api/upload/index.ts +++ b/src/lib/api/upload/index.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 by Filestack. + * Copyright (c) 2019 by Filestack. * Some rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,5 +15,7 @@ * limitations under the License. */ +export * from './file_tools'; export * from './upload'; +export * from './file'; export * from './types'; diff --git a/src/lib/api/upload/intelligent.ts b/src/lib/api/upload/intelligent.ts deleted file mode 100644 index d8b0599b..00000000 --- a/src/lib/api/upload/intelligent.ts +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (c) 2018 by Filestack. - * Some rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { requestWithSource } from '../request'; -import { getLocationURL, getFormData, getHost, getS3PartData, uploadToS3 } from './network'; -import { calcMD5 } from './md5'; -import { PartObj, Context } from './types'; -import { throttle } from '../../utils'; - -/** - * Slice a part into smaller chunks - * @private - * @param part Part buffer to slice. - * @param size Size of slices. - * @returns List of chunks. - */ -export const slicePartIntoChunks = (part: PartObj, size: number): any[] => { - let offset = 0; - const chunks: any[] = []; - while (offset < part.size) { - const end = Math.min(offset + size, part.size); - const buf = part.buffer.slice(offset, end); - const chunk = { - buffer: buf, - offset, - size: buf.byteLength, - number: part.number, - md5: calcMD5(buf), - }; - chunks.push(chunk); - offset += size; - } - return chunks; -}; - -/** - * Get chunk (of part) metadata and PUT chunk to S3 - * @private - * @param chunk Chunk object, has offset information - * @param startParams Parameters returned from start call - * @param config Upload config - * @returns {Promise} - */ -export const uploadChunk = async (chunk: any, ctx: Context): Promise => { - const { body: s3Data } = await getS3PartData(chunk, ctx); - let onProgress; - if (ctx.config.onProgress) { - /* istanbul ignore next */ - onProgress = throttle((evt: ProgressEvent) => { - /* istanbul ignore next */ - if (evt.loaded > chunk.loaded) { - chunk.loaded = evt.loaded; - } - }, ctx.config.progressInterval); - } - chunk.request = uploadToS3(chunk.buffer, s3Data, onProgress, ctx.config); - await chunk.request; - chunk.loaded = chunk.size; - return chunk.request; -}; - -/** - * Commits single part (/commit) for intelligent ingestion (only called after all chunks have been uploaded) - * @private - * @param file File being uploaded - * @param part Part object - * @param startParams Parameters returned from start call - * @param config Upload config - * @returns {Promise} - */ -export const commitPart = (part: PartObj, ctx: Context): Promise => { - const cfg = ctx.config; - /* istanbul ignore next */ - const host = getHost(cfg.host) || getLocationURL(ctx.params.location_url); - const fields = { - apikey: cfg.apikey, - part: part.number + 1, - size: ctx.file.size, - ...ctx.params, - }; - const formData = getFormData(fields, cfg); - return requestWithSource('post', `${host}/multipart/commit`) - .timeout(cfg.timeout) - .field(formData); -}; diff --git a/src/lib/api/upload/is_mobile.ts b/src/lib/api/upload/is_mobile.ts deleted file mode 100644 index adad1392..00000000 --- a/src/lib/api/upload/is_mobile.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2018 by Filestack. - * Some rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Check is browser is mobile (only browser) - * returns false in nodejs env - * - * @private - */ -export const isMobile = () => false; diff --git a/src/lib/api/upload/network.ts b/src/lib/api/upload/network.ts deleted file mode 100644 index f5f38b8c..00000000 --- a/src/lib/api/upload/network.ts +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (c) 2018 by Filestack. - * Some rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { requestWithSource, request } from '../request'; -import { getName } from './utils'; -import { Context, PartObj, UploadConfig } from './types'; - -/** - * @private - */ -/* istanbul ignore next */ -export const getHost = (host?: string) => { - return process.env.TEST_ENV === 'unit' && host; -}; - -/** - * @private - */ -/* istanbul ignore next */ -export const getLocationURL = (url: string) => { - return url && `https://${url}`; -}; - -/** - * Generates multi-part fields for all requests - * @private - * @param fields Object containing form data keys - * @param config Upload config - */ -export const getFormData = (fields: any, { store }: UploadConfig): {} => { - const fd: any = {}; - Object.keys(fields).forEach((key: string) => { - if (typeof fields[key] === 'object') { - fields[key] = JSON.stringify(fields[key]); - } - - if (fields[key]) { - fd[key] = fields[key]; - } - }); - - Object.keys(store).forEach((key: string) => { - if (typeof store[key] === 'object') { - store[key] = JSON.stringify(store[key]); - } - - if (store[key]) { - fd[key] = store[key]; - } - }); - return fd; -}; - -/** - * Starts the multi-part upload flow (/multipart/start) - * @private - * @param file Valid File instance - * @param config Upload config - * @returns {Promise} - */ -export const start = ({ config, file }: Context): Promise => { - - const fields: any = { - apikey: config.apikey, - filename: getName(file, config), - mimetype: config.mimetype || file.type || 'application/octet-stream', - size: file.size, - }; - // Security - if (config.policy && config.signature) { - fields.policy = config.policy; - fields.signature = config.signature; - } - // Intelligent Ingestion - if (config.intelligent) { - fields.multipart = true; - } - const formData = getFormData(fields, config); - return requestWithSource('post', `${config.host}/multipart/start`) - .timeout(config.timeout) - .field(formData); -}; - -/** - * Gets the S3 upload params for current part (/multipart/upload) - * @private - * @param startParams Parameters returned from start call - * @param partNumber Current part number (1 - 10000) - * @param size Size of current part in bytes - * @param md5 MD5 hash of part - * @param config Upload config - * @param offset Current offset if chunking a part. - */ -export const getS3PartData = (part: PartObj, { config, params }: Context): Promise => { - /* istanbul ignore next */ - const host = getHost(config.host) || getLocationURL(params.location_url); - const locationRegion = params.location_region; - - const fields = { - apikey: config.apikey, - part: part.number + 1, - size: part.size, - md5: part.md5, - ...params, - }; - - // Intelligent Ingestion - if (part.offset !== undefined) { - fields.multipart = true; - fields.offset = part.offset === 0 ? '0' : part.offset; - } - const formData = getFormData(fields, config); - const req = requestWithSource('post', `${host}/multipart/upload`); - /* istanbul ignore next */ - if (locationRegion) { - req.set('Filestack-Upload-Region', locationRegion); - } - req.timeout(config.timeout); - req.field(formData); - return new Promise((resolve, reject) => { - req.end((err: Error, res: any) => { - if (err) return reject(err); - return resolve(res); - }); - }); -}; - -/** - * Uploads bytes directly to S3 with HTTP PUT - * @private - * @param part ArrayBuffer with part data - * @param params Params for this part returned by getS3PartData response - * @param onProgress A function to be called on progress event for this part - * @param config - */ -export const uploadToS3 = (part: ArrayBuffer, params: any, onProgress: any, cfg: UploadConfig): Promise => { - /* istanbul ignore next */ - const host = getHost(`${cfg.host}/fakeS3`) || params.url; - const timeout = cfg.timeout || (part.byteLength / 100); - // console.log(part.byteLength ); - const req = request - .put(host) - .set(params.headers) - .timeout(timeout) - .send(part); - - // Don't call progress handler if user didn't specify a callback - if (onProgress) { - return req.on('progress', onProgress); - } - return req; -}; - -/** - * Convert array of Etags into format for /multipart/complete call - * @private - * @param etags Array of Etag strings - */ -const formatETags = (etags: any): string => etags.map((tag: string, idx: number) => `${idx + 1}:${tag}`).join(';'); - -/** - * Completes upload flow (/multipart/complete) - * @private - * @param file File being uploaded - * @param etags An array of etags from each S3 part - * @param startParams Parameters returned from start call - * @param config Upload config - */ -export const complete = (etags: string, { config, file, params }: Context): Promise => { - /* istanbul ignore next */ - const host = getHost(config.host) || getLocationURL(params.location_url); - const locationRegion = params.location_region; - - const fields = { - apikey: config.apikey, - size: file.size, - filename: getName(file, config), - mimetype: config.mimetype || file.type || 'application/octet-stream', - parts: formatETags(etags), - ...params, - }; - - // Intelligent Ingestion - if (config.intelligent) { - fields.multipart = true; - delete fields.parts; - } - - // Security - if (config.policy && config.signature) { - fields.policy = config.policy; - fields.signature = config.signature; - } - - const formData = getFormData(fields, config); - - const req = requestWithSource('post', `${host}/multipart/complete`); - /* istanbul ignore next */ - if (locationRegion) { - req.set('Filestack-Upload-Region', locationRegion); - } - req.timeout(config.timeout); - - return req.field(formData); -}; diff --git a/src/lib/api/upload/types.ts b/src/lib/api/upload/types.ts index 66569632..e3aca83e 100644 --- a/src/lib/api/upload/types.ts +++ b/src/lib/api/upload/types.ts @@ -15,42 +15,10 @@ * limitations under the License. */ -/** - * @private - */ -export interface FileObj extends File { - buffer: Buffer; - name: string; - size: number; - type: string; -} - -/** - * @private - */ -export interface PartObj { - buffer: any; - chunks: any[]; - chunkSize: number; - intelligentOverride: boolean; - loaded: number; - number: number; - request: any; - size: number; - md5?: string; - offset?: number; -} +import { StoreBaseParams } from 'src/lib/filelink'; +import { SanitizeOptions } from './../../utils/index'; export interface UploadOptions { - host?: string; - /** - * Node only. Treat the file argument as a path string. - */ - path?: boolean; - /** - * Set the MIME type of the uploaded file. - */ - mimetype?: string; /** * Maximum size for file slices. Is overridden when intelligent=true. Default is `6 * 1024 * 1024` (6MB). */ @@ -70,7 +38,7 @@ export interface UploadOptions { /** * Callback for retry events. */ - onRetry?: (evt: FSRetryEvent) => void; + onRetry?: () => void; /** * Retry limit. Default is 10. */ @@ -93,78 +61,45 @@ export interface UploadOptions { * Passing true/false toggles the global intelligent flow (all parts are chunked and committed). * Passing `'fallback'` will only use FII when network conditions may require it (only failing parts will be chunked). */ - intelligent?: boolean | string; + intelligent?: boolean | 'fallback'; /** * Set the default intiial chunk size for Intelligent Ingestion. Defaults to 8MB on desktop and 1MB on mobile. */ intelligentChunkSize?: number; } -export interface FSProgressEvent { - totalPercent: number; - totalBytes: number; -} - -export interface FSRetryEvent { - location: string; - parts: PartsMap; - filename: string; - attempt: number | undefined; - chunkSize?: number; -} - -/** - * @private - */ -export interface UploadConfig extends UploadOptions { - apikey: string; - store: any; - concurrency: number; - partSize: number; - retryFactor: number; - retryMaxTime: number; - progressInterval: number; - policy?: string; - signature?: string; - customName?: string; - mimetype?: string; -} +export type StoreUploadOptions = StoreBaseParams & { + /** + * Filename or function that returns custom filename for stored file + */ + filename?: ((file: File) => string) | string; -/** - * @private - */ -export const enum Status { - INIT = 'init', - RUNNING = 'running', - DONE = 'done', - FAILED = 'failed', - PAUSED = 'paused', -} + /** + * Workflows ids to run after upload + */ + workflows?: (string | WorkflowConfig)[]; -/** - * @private - */ -export interface PartsMap { - [part: string]: PartObj; -} + /** + * Fielname sanitizer for cleanup before upload + * + * @see https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html + * @default { + * exclude: ['\\', '{', '}','|', '%', '`', '"', "'", '~', '[', ']', '#', '|', '^', '<', '>'] + * replacement: '-' + * } + * @type {((boolean | { + * exclude: string[], + * replacement: string, + * }))} + */ + sanitizer?: SanitizeOptions +}; -/** - * @private - */ -export interface State { - progressTick: any; - previousPayload: any; - status: Status; - retries: any; - parts: PartsMap; +export interface WorkflowConfig { + id: string; } -/** - * @private - */ -export interface Context { - config: UploadConfig; - state: State; - file: FileObj; - params?: any; +export interface FSProgressEvent { + totalPercent: number; + totalBytes: number; } diff --git a/src/lib/api/upload/upload.spec.ts b/src/lib/api/upload/upload.spec.ts index b4ea71c2..65db6f78 100644 --- a/src/lib/api/upload/upload.spec.ts +++ b/src/lib/api/upload/upload.spec.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 by Filestack. + * Copyright (c) 2019 by Filestack. * Some rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,478 +15,338 @@ * limitations under the License. */ -import * as assert from 'assert'; -import * as sinon from 'sinon'; -import { upload } from './index'; -import * as fs from 'fs'; +import { Upload } from './upload'; +import { FileState } from './file'; +import { S3Uploader } from './uploaders/s3'; +import { config } from './../../../config'; +import { StoreUploadOptions } from './types'; +import { UploadMode } from './uploaders/abstract'; -declare var ENV: any; +const testBuffer = Buffer.from('test test test'); -const testFilePath = './test/data/testfile.txt'; -const testImageFilePath = './test/data/fish.gif'; -const session = ENV.session; -const secureSession = ENV.secureSession; -const makeFile = (data: string, type: string = 'image/gif') => { - return ENV.isNode ? testFilePath : new Blob([data], { type }); +const customNameMocked = jest.fn(); + +const mockedFsFile = {}; +Object.defineProperty(mockedFsFile, 'customName', { + set: customNameMocked, +}); + +jest.useFakeTimers(); + +jest.mock('./uploaders/s3'); +jest.mock('./file_tools', () => ({ + getFile: jest.fn().mockImplementation(() => mockedFsFile), +})); + +const mockedFileResponse = { + status: 'stored', }; -const makeEmptyFile = () => { - return ENV.isNode ? './test/data/emptyfile.txt' : new Blob([''], { type: 'application/text' }); + +const sessionURls = config.urls; +const defaultSession = { + apikey: 'test', + policy: 'p', + signature: 's', + urls: sessionURls, }; -const smallFile = makeFile('helloworld'); -const emptyFile = makeEmptyFile(); -const noFile = ENV.isNode ? './Idonotexist' : undefined; - -const dataURI = `data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xL - jEvIgogICB4bWxuczpjYz0iaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbnMjIgogICB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy5 - 3My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxuc - zppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgd2lkdGg9IjI0OC4yMjE2OSIKICAgaGVpZ2h0PSI2Ny4wODg0MzIiCiAgIHZpZXdCb3g9IjAgMCAyNDguMjIxNjkgNjcuMDg4NDM - yIgogICB2ZXJzaW9uPSIxLjEiCiAgIGlkPSJzdmczNzYwIgogICBzb2RpcG9kaTpkb2NuYW1lPSJmaWxlc3RhY2suc3ZnIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjkyLjEgciI+CiAgPG1ldGFkYXRhCiAgICAgaWQ9Im1ldGFkYXRhM - zc2NCI+CiAgICA8cmRmOlJERj4KICAgICAgPGNjOldvcmsKICAgICAgICAgcmRmOmFib3V0PSIiPgogICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2Uvc3ZnK3htbDwvZGM6Zm9ybWF0PgogICAgICAgIDxkYzp0eXBlCiAgICAgICAgICAgcmR - mOnJlc291cmNlPSJodHRwOi8vcHVybC5vcmcvZGMvZGNtaXR5cGUvU3RpbGxJbWFnZSIgLz4KICAgICAgICA8ZGM6dGl0bGU+Y29sb3I8L2RjOnRpdGxlPgogICAgICA8L2NjOldvcms+CiAgICA8L3JkZjpSREY+CiAgPC9tZXRhZGF0Y - T4KICA8c29kaXBvZGk6bmFtZWR2aWV3CiAgICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICAgIGJvcmRlcmNvbG9yPSIjNjY2NjY2IgogICAgIGJvcmRlcm9wYWNpdHk9IjEiCiAgICAgb2JqZWN0dG9sZXJhbmNlPSIxMCIKICAgICBncml - kdG9sZXJhbmNlPSIxMCIKICAgICBndWlkZXRvbGVyYW5jZT0iMTAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAiCiAgICAgaW5rc2NhcGU6cGFnZXNoYWRvdz0iMiIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjMxOTAiC - iAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iMTc2MiIKICAgICBpZD0ibmFtZWR2aWV3Mzc2MiIKICAgICBzaG93Z3JpZD0iZmFsc2UiCiAgICAgaW5rc2NhcGU6em9vbT0iNC4xNzgxNzY4IgogICAgIGlua3NjYXBlOmN4PSIxMTg - uMzM2NjgiCiAgICAgaW5rc2NhcGU6Y3k9IjMzLjM0Njc1MyIKICAgICBpbmtzY2FwZTp3aW5kb3cteD0iMCIKICAgICBpbmtzY2FwZTp3aW5kb3cteT0iMjgiCiAgICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMCIKICAgICBpb - mtzY2FwZTpjdXJyZW50LWxheWVyPSJzdmczNzYwIgogICAgIGlua3NjYXBlOmxvY2tndWlkZXM9ImZhbHNlIiAvPgogIDwhLS0gR2VuZXJhdG9yOiBTa2V0Y2ggNDIgKDM2NzgxKSAtIGh0dHA6Ly93d3cuYm9oZW1pYW5jb2RpbmcuY29 - tL3NrZXRjaCAtLT4KICA8dGl0bGUKICAgICBpZD0idGl0bGUzNzQyIj5jb2xvcjwvdGl0bGU+CiAgPGRlc2MKICAgICBpZD0iZGVzYzM3NDQiPkNyZWF0ZWQgd2l0aCBTa2V0Y2guPC9kZXNjPgogIDxkZWZzCiAgICAgaWQ9ImRlZnMzN - zQ2IiAvPgogIDxnCiAgICAgaWQ9IlBhZ2UtMSIKICAgICBzdHlsZT0iZmlsbDpub25lO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lO3N0cm9rZS13aWR0aDoxIgogICAgIHRyYW5zZm9ybT0ic2NhbGUoMS4zOTkzODYyKSI+CiA - gICA8ZwogICAgICAgaWQ9ImNvbG9yIj4KICAgICAgPHBhdGgKICAgICAgICAgZD0iTSAzNy40OTg4NzMsMzIuOTU5NjY1IFYgNC40OTQ0OTk3IEggNC40OTk4NjQ4IFYgNDMuNDQ2ODMxIEggMjYuOTk5MTg5IFYgNDcuOTQxMzMgSCA0M - S45OTg3MzggViAzMi45NTk2NjUgWiBNIDAsMCBIIDQxLjk5ODczOCBWIDQ3Ljk0MTMzIEggMCBaIE0gMjkuOTk5MDk5LDM1Ljk1NTk5OCBIIDQxLjk5ODczOCBMIDI5Ljk5OTA5OSw0Ny45NDEzMyBaIE0gMTMuNDk5NTk0LDEzLjQ4MzQ - 5OSBoIDE0Ljk5OTU1IHYgNC40OTQ1IGggLTE0Ljk5OTU1IHogbSAwLDcuNDkwODMzIGggMTEuOTk5NjQgdiA0LjQ5NDUgaCAtMTEuOTk5NjQgeiBtIDAsNy40OTA4MzMgaCA0LjQ5OTg2NSB2IDQuNDk0NSBoIC00LjQ5OTg2NSB6IgogI - CAgICAgICBpZD0iUmVjdGFuZ2xlLTM1NiIKICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgc3R5bGU9ImZpbGw6I2VmNDkyNSIgLz4KICAgIDwvZz4KICA8L2c+CiAgPHRleHQKICAgICB4bWw - 6c3BhY2U9InByZXNlcnZlIgogICAgIHN0eWxlPSJmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2ZvbnQtc2l6ZTozMy4zMzMzMzIwNnB4O2xpb - mUtaGVpZ2h0OjEuMjU7Zm9udC1mYW1pbHk6TW9udHNlcnJhdDstaW5rc2NhcGUtZm9udC1zcGVjaWZpY2F0aW9uOidNb250c2VycmF0LCBOb3JtYWwnO2ZvbnQtdmFyaWFudC1saWdhdHVyZXM6bm9ybWFsO2ZvbnQtdmFyaWFudC1jYXB - zOm5vcm1hbDtmb250LXZhcmlhbnQtbnVtZXJpYzpub3JtYWw7Zm9udC1mZWF0dXJlLXNldHRpbmdzOm5vcm1hbDt0ZXh0LWFsaWduOnN0YXJ0O2xldHRlci1zcGFjaW5nOjBweDt3b3JkLXNwYWNpbmc6MHB4O3dyaXRpbmctbW9kZTpsc - i10Yjt0ZXh0LWFuY2hvcjpzdGFydDtmaWxsOiMwMDAwMDA7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmUiCiAgICAgeD0iNzQuMDE5MjI2IgogICAgIHk9IjQ2LjM4MTEyNiIKICAgICBpZD0idGV4dDM3MDAiPjx0c3BhbgogICAgICA - gc29kaXBvZGk6cm9sZT0ibGluZSIKICAgICAgIGlkPSJ0c3BhbjM3MDIiCiAgICAgICB4PSI3NC4wMTkyMjYiCiAgICAgICB5PSI0Ni4zODExMjYiCiAgICAgICBzdHlsZT0iZm9udC1zdHlsZTpub3JtYWw7Zm9udC12YXJpYW50Om5vc - m1hbDtmb250LXdlaWdodDpub3JtYWw7Zm9udC1zdHJldGNoOm5vcm1hbDtmb250LXNpemU6MzMuMzMzMzMyMDZweDtmb250LWZhbWlseTpNb250c2VycmF0Oy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246J01vbnRzZXJyYXQsIE5 - vcm1hbCc7Zm9udC12YXJpYW50LWxpZ2F0dXJlczpub3JtYWw7Zm9udC12YXJpYW50LWNhcHM6bm9ybWFsO2ZvbnQtdmFyaWFudC1udW1lcmljOm5vcm1hbDtmb250LWZlYXR1cmUtc2V0dGluZ3M6bm9ybWFsO3RleHQtYWxpZ246c3Rhc - nQ7d3JpdGluZy1tb2RlOmxyLXRiO3RleHQtYW5jaG9yOnN0YXJ0Ij5maWxlc3RhY2stanM8L3RzcGFuPjwvdGV4dD4KPC9zdmc+Cg==`; - -const b64string = 'dGVzdA=='; // b64 for "test" - -describe('upload', function uploadTest() { - this.timeout(120000); - - it('should reject if a file is not a blob', (done) => { - upload(session, 5).catch((err: Error) => { - assert.ok(err); - done(); - }); + +const mockExecute = jest.fn(); + +describe('Api/Upload/upload', () => { + beforeAll(() => { + spyOn(S3Uploader.prototype, 'execute').and.callFake(mockExecute); }); - it('should reject if file is empty', (done) => { - upload(session, emptyFile).catch((err: Error) => { - assert.ok(err); - done(); + describe('Settings', () => { + it('should handle constructor options', () => { + const u = new Upload({ + partSize: 5 * 1024 * 1024, + intelligentChunkSize: 5 * 1024 * 1024, + }); + + expect(S3Uploader.prototype.setPartSize).toHaveBeenCalledWith(5 * 1024 * 1024); + expect(S3Uploader.prototype.setIntelligentChunkSize).toHaveBeenCalledWith(5 * 1024 * 1024); }); - }); - it('should reject if file does not exist', (done) => { - upload(session, noFile).catch((err: Error) => { - assert.ok(err); - done(); + it('should throw error on wrong upload options', () => { + // @ts-ignore + expect(() => new Upload({ intelligent1: true })).toThrowError('Invalid upload params'); }); - }); - it('(node) should upload file (buffer) successfully and return a handle (gif)', (done) => { - if (!ENV.isNode) { - return done(); - } - - const file = fs.readFileSync(testImageFilePath); - - upload(session, file, { - retry: 0, - partSize: 2000, - }, { - filename: 'filestack.gif', - }) - .then((res: any) => { - assert.ok(res.handle); - assert.ok(res.url); - done(); - }) - .catch((err: Error) => { - done(err); + it('should accept sanitizer settings', () => { + expect(() => new Upload({}, { + // @ts-ignore + sanitizer: false, + })).not.toThrowError('Invalid upload params'); + + expect(() => new Upload({}, { + // @ts-ignore + sanitizer: { + exclude: ['1'], + replacement: '-', + }, + })).not.toThrowError('Invalid upload params'); }); - }); - it('(node) should upload (buffer) file successfully and return a handle (txt)', (done) => { - if (!ENV.isNode) { - return done(); - } - - const file = fs.readFileSync(testFilePath); - - upload(session, file, { - retry: 0, - partSize: 2000, - }, { - filename: 'filestack.txt', - }) - .then((res: any) => { - assert.ok(res.handle); - assert.ok(res.url); - done(); - }) - .catch((err: Error) => { - done(err); + it('should throw error on wrong store options', () => { + // @ts-ignore + expect(() => new Upload({ intelligent: true }, { test: 123 })).toThrowError('Invalid store upload params'); }); - }); - it('(node) should upload file (buffer) successfully without name and return a handle (txt)', (done) => { - if (!ENV.isNode) { - return done(); - } - - const file = fs.readFileSync(testFilePath); - - upload(session, file, { - retry: 0, - partSize: 2000, - }) - .then((res: any) => { - assert.ok(res.handle); - assert.ok(res.url); - done(); - }) - .catch((err: Error) => { - done(err); + it('should set intelligent upload mode', () => { + const u = new Upload({ intelligent: true }); + expect(S3Uploader.prototype.setUploadMode).toHaveBeenCalledWith(UploadMode.INTELLIGENT); }); - }); - it('should upload a dataURI successfully and return a handle', (done) => { - if (ENV.isNode) { - return done(); - } - upload(session, dataURI, { - retry: 0, - }, { - filename: 'filestack.svg', - }) - .then((res: any) => { - assert.ok(res.handle); - assert.ok(res.url); - done(); - }) - .catch((err: Error) => { - done(err); + it('should fallback upload mode', () => { + const u = new Upload({ intelligent: 'fallback' }); + + expect(S3Uploader.prototype.setUploadMode).toHaveBeenCalledWith(UploadMode.FALLBACK); }); - }); - it('should upload a file successfully and return a handle', (done) => { - upload(session, smallFile, { - retry: 0, - mimetype: 'image/gif', - }, { - filename: 'dutton.gif', - }) - .then((res: any) => { - assert.ok(res.handle); - assert.ok(res.url); - done(); - }) - .catch((err: Error) => { - done(err); + it('should pass store options to uploader class', () => { + const storeOptions: StoreUploadOptions = { + location: 's3', + }; + + const u = new Upload({}, storeOptions); + expect(S3Uploader.prototype.constructor).toHaveBeenCalledWith(storeOptions, undefined); }); - }); - it('should pause and resume upload', (done) => { - const token: any = {}; - upload(session, smallFile, { - retry: 0, - mimetype: 'image/gif', - }, { - filename: 'dutton.gif', - }, token) - .then((res: any) => { - assert.ok(res.handle); - assert.ok(res.url); - done(); - }) - .catch((err: Error) => { - done(err); + it('should respect concurrency param in upload options', () => { + const uploadOptions = { + concurrency: 4, + }; + + const u = new Upload(uploadOptions); + expect(S3Uploader.prototype.constructor).toHaveBeenCalledWith({}, 4); }); - setTimeout(() => { - token.pause(); - setTimeout(() => token.resume(), 10); - }, 10); - }); + it('should set correct security to uploader', () => { + const security = { + policy: 'p', + signature: 's', + }; + + const u = new Upload(); + u.setSecurity(security); - it('should upload a file and report progress', (done) => { - const onProgress = sinon.spy(); - upload(session, smallFile, { - retry: 0, - onProgress, - progressInterval: 10, - mimetype: 'image/gif', - }, { - filename: 'dutton.gif', - }) - .then((res: any) => { - assert.ok(res.handle); - assert.ok(res.url); - assert.ok(onProgress.called); - assert.equal(onProgress.lastCall.args[0].totalPercent, 100); - done(); - }) - .catch((err: Error) => { - done(err); + expect(S3Uploader.prototype.setSecurity).toHaveBeenCalledWith(security); }); - }); - it('should upload a file with intelligent ingestion', (done) => { - upload(ENV.intelligentSession, smallFile, { - intelligent: true, - retry: 0, - }) - .then((res: any) => { - assert.ok(res.handle); - assert.ok(res.url); - done(); - }) - .catch((err: Error) => { - done(err); + it('should pass session variable to uploader', () => { + const u = new Upload(); + u.setSession(defaultSession); + + expect(S3Uploader.prototype.setUrl).toHaveBeenCalledWith(defaultSession.urls.uploadApiUrl); + expect(S3Uploader.prototype.setApikey).toHaveBeenCalledWith(defaultSession.apikey); + expect(S3Uploader.prototype.setSecurity).toHaveBeenCalledWith({ policy: defaultSession.policy, signature: defaultSession.signature }); }); - }); - it('should upload a file with intelligent ingestion and report progress', (done) => { - const onProgress = sinon.spy(); - upload(ENV.intelligentSession, smallFile, { - retry: 0, - onProgress, - progressInterval: 10, - intelligent: true, - mimetype: 'image/gif', - }, { - filename: 'dutton.gif', - }) - .then((res: any) => { - assert.ok(res.handle); - assert.ok(res.url); - assert.ok(onProgress.called); - assert.equal(onProgress.lastCall.args[0].totalPercent, 100); - done(); - }) - .catch((err: Error) => { - done(err); + it('should set storeOption filename to class', async () => { + mockExecute.mockReturnValue(Promise.resolve([mockedFileResponse])); + const filenameFn = () => 'test'; + + const u = new Upload( + {}, + { + filename: filenameFn, + } + ); + + await u.upload(testBuffer); + expect(customNameMocked).toHaveBeenCalledWith(filenameFn); }); - }); - it('should upload a file with intelligent ingestion fallback and report progress', (done) => { - const onProgress = sinon.spy(); - upload(ENV.intelligentSession, smallFile, { - retry: 0, - onProgress, - progressInterval: 10, - intelligent: 'fallback', - mimetype: 'image/gif', - }, { - filename: 'dutton.gif', - }) - .then((res: any) => { - assert.ok(res.handle); - assert.ok(res.url); - assert.ok(onProgress.called); - assert.equal(onProgress.lastCall.args[0].totalPercent, 100); - done(); - }) - .catch((err: Error) => { - console.log(err); - done(err); + it('should assign methods to user provided token', () => { + let token = {}; + + const u = new Upload(); + u.setToken(token); + + expect(token['cancel']).toBeTruthy(); + expect(token['resume']).toBeTruthy(); + expect(token['pause']).toBeTruthy(); + + token['cancel'](); + token['pause'](); + token['resume'](); }); - }); - it('should upload a file with store options', (done) => { - upload(session, smallFile, { - retry: 0, - }, { - location: 's3', - region: 'eu-west-1', - container: 'filestack-uploads-staging-eu-west-1', - filename: 'dutton.gif', - }) - .then((res: any) => { - assert.ok(res.handle); - assert.ok(res.url); - done(); - }) - .catch((err: Error) => { - done(err); + it('should set token with methods that pause,cancel or resume uploads', () => { + let token = {}; + + const u = new Upload(); + u.setToken(token); + + token['cancel'](); + token['pause'](); + token['resume'](); + + expect(S3Uploader.prototype.abort).toHaveBeenCalled(); + expect(S3Uploader.prototype.pause).toHaveBeenCalled(); + expect(S3Uploader.prototype.resume).toHaveBeenCalled(); }); - }); - it('should upload a file to a secured application', (done) => { - upload(secureSession, smallFile, { - retry: 0, - }, { - filename: 'dutton.gif', - }) - .then((res: any) => { - assert.ok(res.handle); - assert.ok(res.url); - done(); - }) - .catch((err: Error) => { - done(err); + it('should throw an error if token is not an object', () => { + const token = '123123'; + + const u = new Upload(); + expect(() => { + u.setToken(token); + }).toThrowError(); }); + }); - it('should cancel uploading if token.cancel is called', (done) => { - const token: any = {}; - - upload(session, smallFile, { - retry: 0, - host: ENV.urls.proxySlow, - }, {}, token) - .then((res: any) => { - done(res); - }) - .catch((err: Error) => { - assert.ok(err); - done(); + describe('Upload', () => { + beforeEach(() => { + mockExecute.mockReturnValue(Promise.resolve([mockedFileResponse, mockedFileResponse])); }); - // wait until upload will start - setTimeout(() => token.cancel(), 10); - }); + it('should execute normal upload without errors and return single file response', async () => { + const u = new Upload(); + const res = await u.upload(testBuffer); + expect(res).toEqual(mockedFileResponse); + }); + + it('should execute normal upload with errors and return rejected promise', () => { + const u = new Upload(); + + mockExecute.mockReturnValue( + Promise.resolve([ + { + status: FileState.FAILED, + }, + ]) + ); + + return expect(u.upload(testBuffer)).rejects.toEqual({ + status: FileState.FAILED, + }); + }); - it('should upload a file successfully with provided workflows ids', (done) => { - upload(session, smallFile, { - mimetype: 'image/gif', - }, { - filename: 'dutton.gif', - workflows: ['test', { - id: 'test', - }] - }) - .then((res: any) => { - assert.ok(res.handle); - assert.ok(res.url); - done(); - }) - .catch((err: Error) => { - done(err); + it('should execute multiupload without errors and return single file response', async () => { + const u = new Upload(); + const res = await u.multiupload([testBuffer, testBuffer]); + expect(res).toEqual([mockedFileResponse, mockedFileResponse]); }); }); -}); -// Retry with failure simulation via toxy - -if (ENV.testEnv === 'unit') { - - describe('upload failure simulation', () => { - describe('4xx response', function retryFailures() { - this.timeout(60000); - it('should fail immediately', (done) => { - const onRetry = sinon.spy(); - upload(session, smallFile, { - host: ENV.urls.proxy400, - retry: 0, - onRetry, - }) - .then(() => done('Error was not thrown')) - .catch((err: any) => { - assert.ok(!onRetry.called, 'onRetry was called'); - assert.ok(err); - done(); - }); + describe('Progress', () => { + const progress1 = { + totalBytes: 1, + totalPercent: 1, + files: [ + { + totalBytes: 1, + totalPercent: 1, + }, + ], + }; + + const progress50 = { + totalBytes: 5, + totalPercent: 50, + files: [ + { + totalBytes: 50, + totalPercent: 50, + }, + ], + }; + + const progress100 = { + totalBytes: 100, + totalPercent: 100, + files: [ + { + totalBytes: 100, + totalPercent: 100, + }, + ], + }; + + it('should handle correct progress event', async () => { + spyOn(S3Uploader.prototype, 'on').and.callFake((ev, cb) => { + cb(progress1); + cb(progress100); }); - }); - describe('5xx response', function retryFailures() { - this.timeout(60000); - it('should retry and increment retry count', (done) => { - const onRetry = sinon.spy(); - upload(session, smallFile, { - host: ENV.urls.proxy500, - onRetry, - retry: 1, - }) - .then(() => done('Retry was not called')) - .catch((err: any) => { - assert.equal(onRetry.firstCall.args[0].attempt, 1); - assert.ok(err); - done(); - }); + const progressMock = jest.fn(); + + const u = new Upload({ + onProgress: progressMock, }); + + await u.upload(testBuffer); + + expect(progressMock).toHaveBeenCalledWith(progress100); + expect(progressMock).toHaveBeenCalledTimes(1); }); - describe('intelligent ingestion server error', function intelligentSrvErr() { - this.timeout(80000); - it('should retry on server error and increment retry amount', (done) => { - const onRetry = sinon.spy(); - upload(ENV.intelligentSession, smallFile, { - host: ENV.urls.proxy500, - onRetry, - retry: 2, - intelligent: true, - }) - .then(() => done('Retry was not called.')) - .catch((err: any) => { - assert.equal(onRetry.firstCall.args[0].attempt, 1); - assert.equal(onRetry.secondCall.args[0].attempt, 2); - assert.ok(err); - done(); + it('should call progress event on given interval', async () => { + let progressCb; + + mockExecute.mockImplementation(() => { + return new Promise(resolve => { + setTimeout(() => progressCb(progress1), 1); + setTimeout(() => progressCb(progress50), 2); + setTimeout(() => progressCb(progress100), 3); + setTimeout(() => resolve([]), 4); + + jest.advanceTimersByTime(4); }); }); + + spyOn(S3Uploader.prototype, 'on').and.callFake((ev, cb) => { + progressCb = cb; + }); + + const progressMock = jest.fn(); + + const u = new Upload({ + progressInterval: 1, + onProgress: progressMock, + }); + + await u.multiupload([testBuffer]); + + expect(progressMock).toHaveBeenCalledWith(progress1); + expect(progressMock).toHaveBeenCalledWith(progress50); + expect(progressMock).toHaveBeenCalledWith(progress100); }); - describe('intelligent ingestion S3 network error', function intelligentNetErr() { - this.timeout(60000); - it('should retry and halve chunk size each time', (done) => { - const onRetry = sinon.spy(); - const defaultChunkSize = (1 * 1024 * 1024) / 4; - upload(ENV.intelligentSession, smallFile, { - host: ENV.urls.proxyAbort, - onRetry, - intelligent: true, - intelligentChunkSize: defaultChunkSize, - }) - .then(() => done('Retry was not called.')) - .catch((err: any) => { - assert.equal(onRetry.firstCall.args[0].chunkSize, defaultChunkSize / 2); - assert.equal(onRetry.secondCall.args[0].chunkSize, defaultChunkSize / 4); - assert.ok(err); - done(); + it('should stay at the same progress when uploader goes back with file progress', async () => { + let progressCb; + + mockExecute.mockImplementation(() => { + return new Promise(resolve => { + setTimeout(() => progressCb(progress50), 1); + setTimeout(() => progressCb(progress1), 2); + setTimeout(() => progressCb(progress100), 3); + setTimeout(() => resolve([]), 4); + + jest.advanceTimersByTime(4); }); }); - it('should fail when minimum chunk size is reached', (done) => { - const onRetry = sinon.spy(); - const minChunkSize = 32 * 1024; - upload(ENV.intelligentSession, smallFile, { - host: ENV.urls.proxyAbort, - onRetry, - intelligent: true, - intelligentChunkSize: minChunkSize * 2, - }) - .then(() => done('Retry was not called.')) - .catch((err: any) => { - assert.equal(onRetry.lastCall.args[0].chunkSize, minChunkSize); - assert.ok(err); - done(); - }); + spyOn(S3Uploader.prototype, 'on').and.callFake((ev, cb) => { + progressCb = cb; }); - it('should set intelligentOverride on part when in fallback mode', (done) => { - const onRetry = sinon.spy(); - const minChunkSize = 32 * 1024; - upload(ENV.intelligentSession, smallFile, { - host: ENV.urls.proxyAbort, - onRetry, - intelligent: 'fallback', - intelligentChunkSize: minChunkSize * 2, - }) - .then(() => done('Did not fail')) - .catch((err: any) => { - assert.equal(onRetry.lastCall.args[0].parts[0].intelligentOverride, true); - assert.ok(err); - done(); - }); + const progressMock = jest.fn(); + + const u = new Upload({ + progressInterval: 1, + onProgress: progressMock, }); + + await u.multiupload([testBuffer]); + + expect(progressMock).toHaveBeenCalledWith(progress50); + expect(progressMock).toHaveBeenCalledWith(progress50); + expect(progressMock).toHaveBeenCalledWith(progress100); }); }); -} +}); diff --git a/src/lib/api/upload/upload.ts b/src/lib/api/upload/upload.ts index e2a8d23a..0e8d6a74 100644 --- a/src/lib/api/upload/upload.ts +++ b/src/lib/api/upload/upload.ts @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 by Filestack. + * Copyright (c) 2019 by Filestack. * Some rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,557 +15,254 @@ * limitations under the License. */ -import * as t from 'tcomb-validation'; -import { getPart, getFile } from './file_utils'; -import { isMobile } from './is_mobile'; -import { getName } from './utils'; -import { commitPart, slicePartIntoChunks, uploadChunk } from './intelligent'; -import { start, getS3PartData, uploadToS3, complete } from './network'; -import { - Context, - FileObj, - PartObj, - State, - Status, - UploadConfig, - UploadOptions -} from './types'; -import { checkOptions, range, throat, throttle } from '../../utils'; -import { Security, Session, StoreOptions } from '../../client'; +import * as EventEmitter from 'eventemitter3'; +import { Session, Security } from '../../client'; +import { S3Uploader } from './uploaders/s3'; +import { FilestackError, FilestackErrorType } from './../../../filestack_error'; +import { SanitizeOptions } from './../../utils'; -/** - * @private - */ -const MIN_CHUNK_SIZE = 32 * 1024; +import { UploadOptions, StoreUploadOptions } from '../upload/types'; +import { getFile, InputFile } from './file_tools'; +import { FileState } from './file'; +import { UploadMode } from './uploaders/abstract'; +import { getValidator, UploadParamsSchema, StoreParamsSchema } from './../../../schema'; -/** - * @private - */ -const statuses = { - INIT: Status.INIT, - RUNNING: Status.RUNNING, - DONE: Status.DONE, - FAILED: Status.FAILED, - PAUSED: Status.PAUSED, -}; +export interface ProgressEvent { + totalPercent: number; + totalBytes: number; + files?: { (key: string): ProgressEvent }; +} -/** - * Returns a Promise based on the flow state - * If the flow is paused it will return a Promise that resolves when resumed - * If the flow failed it will resolve harmlessly - * - * @private - * @param func function that returns a Promise - */ -const flowControl = (ctx: Context, func: any) => { - // console.log(ctx.state); - return (...args: any[]) => { - if (ctx.state.status === statuses.FAILED) { - return Promise.resolve(); - } - return new Promise((resolve) => { - const check = () => { - if (ctx.state.status === statuses.PAUSED) { - setTimeout(() => check(), 100); - } else { - resolve(func(...args)); - } - }; - check(); - }); - }; +const DEFAULT_PROGRESS_INTERVAL = 1000; + +const normalizeProgress = (current, last) => { + current.totalBytes = Math.max(current.totalBytes, last.totalBytes); + current.totalPercent = Math.max(current.totalPercent, last.totalPercent); + + return current; }; /** + * Uploader main class for now its supporting only s3 upload type * - * @private - * @param num - * @param ctx + * @export + * @class Upload */ -const makePart = (num: number, ctx: Context): PartObj => { - return { - buffer: null, - chunks: [], - chunkSize: ctx.config.intelligentChunkSize - ? ctx.config.intelligentChunkSize - : isMobile() - ? 1 * 1024 * 1024 - : 8 * 1024 * 1024, - intelligentOverride: false, - loaded: 0, - number: num, - request: null, - size: 0, +export class Upload extends EventEmitter { + private uploader: S3Uploader; + + private overwriteFileName; + + private lastProgress: ProgressEvent = { + totalBytes: 0, + totalPercent: 0, }; -}; -/** - * - * @private - * @param part - * @param ctx - */ -const uploadPart = async (part: PartObj, ctx: Context): Promise => { - const cfg = ctx.config; - // Intelligent flow commits a part only when all chunks have been uploaded - if (cfg.intelligent === true || part.intelligentOverride) { - const goChunk = flowControl(ctx, (chunk: any) => uploadChunk(chunk, ctx)); - part.chunks = slicePartIntoChunks(part, part.chunkSize); - - await Promise.all(part.chunks.map(throat(cfg.concurrency, goChunk))); - return commitPart(part, ctx); - } + private progressIntervalHandler; + private sanitizerOptions: SanitizeOptions; - // Or we upload the whole part (default flow) - const { body: s3Data } = await getS3PartData(part, ctx); - let onProgress; - if (cfg.onProgress) { - /* istanbul ignore next */ - onProgress = throttle((evt: ProgressEvent) => { - /* istanbul ignore next */ - if (evt.loaded > part.loaded) { - part.loaded = evt.loaded; - } - }, cfg.progressInterval); - } - part.request = uploadToS3(part.buffer, s3Data, onProgress, cfg); - return part.request; -}; + constructor(private readonly options: UploadOptions = {}, private storeOptions: StoreUploadOptions = {}) { + super(); -/** - * Clean up array buffers in memory - * Because promises aren't streams - * @private - */ -const gc = (part: PartObj) => { - part.buffer = undefined; - part.request = undefined; - if (part.chunks && part.chunks.length) { - part.chunks.forEach(gc); - } -}; + // do not delete filename from original options reference - copy it first + this.storeOptions = Object.assign({}, storeOptions); -/** - * Helpers to calculate total progress of file upload in bytes and percent - * @private - */ -const sumBytes = (bytes: number[]) => bytes.reduce((a, b) => a + b, 0); -/** - * - * @private - * @param bytes - * @param file - */ -const percentOfFile = (bytes: number, file: FileObj) => Math.round((bytes / file.size) * 100); + const validateRes = getValidator(UploadParamsSchema)(options); -/** - * - * @private - * @param param0 - */ -const getProgress = ({ config, state, file }: Context) => { - const parts = Object.keys(state.parts).map((k: string) => state.parts[k]); - const partsLoaded = parts.map((p: PartObj) => p.loaded); - const chunksLoaded = parts - .map((p: PartObj) => p.chunks) - .reduce((a: any[], b: any[]) => a.concat(b), []) - .map((c: any) => c.loaded) - .filter((n: any) => n); - let loaded = partsLoaded; - if (config.intelligent === true) { - loaded = chunksLoaded; - } - if (config.intelligent === 'fallback') { - const partsWithoutChunks = parts - .filter((p: PartObj) => !p.intelligentOverride) - .map((p: PartObj) => p.loaded); - loaded = partsWithoutChunks.concat(chunksLoaded); - } - const totalBytes = sumBytes(loaded); - const totalPercent = percentOfFile(totalBytes, file); - const payload = { - totalBytes, - totalPercent, - }; - const prev = state.previousPayload || {}; - /* istanbul ignore next */ - if (totalPercent < prev.totalPercent) { - payload.totalBytes = prev.totalBytes; - payload.totalPercent = prev.totalPercent; - } - state.previousPayload = payload; - return payload; -}; + if (validateRes.errors.length) { + throw new FilestackError(`Invalid upload params`, validateRes.errors, FilestackErrorType.VALIDATION); + } -/** - * Entry point for multi-part upload flow - * - * @private - * @param file File to upload - * @param config Upload config - * @param token Control token - */ -const uploadFile = async (ctx: Context, token: any): Promise => { - const { file, state, config } = ctx; - - const startProgress = (onProgress?: any): void => { - if (onProgress) { - state.progressTick = setInterval(() => { - const payload = getProgress(ctx); - if (payload.totalPercent === 100) { - clearInterval(state.progressTick); - } - onProgress(payload); - }, config.progressInterval); + const storeValidateRes = getValidator(StoreParamsSchema)(storeOptions); + if (storeValidateRes.errors.length) { + throw new FilestackError(`Invalid store upload params`, storeValidateRes.errors, FilestackErrorType.VALIDATION); } - }; - const finishProgress = (onProgress?: any): void => { - if (onProgress) { - onProgress({ - totalBytes: file.size, - totalPercent: 100, - }); - clearInterval(state.progressTick); + if (storeOptions.filename) { + this.overwriteFileName = storeOptions.filename; + delete this.storeOptions.filename; } - }; - /** - * Will pause progress tick and set state - */ - token.pause = (): void => { - if (state.status === statuses.RUNNING) { - state.status = statuses.PAUSED; - clearInterval(state.progressTick); + if (this.storeOptions.sanitizer) { + this.sanitizerOptions = this.storeOptions.sanitizer; + delete this.storeOptions.sanitizer; } - }; - /** - * Will resume flow and start progress tick again - */ - token.resume = (): void => { - if (state.status === statuses.PAUSED) { - state.status = statuses.RUNNING; - startProgress(config.onProgress); + this.uploader = new S3Uploader(this.storeOptions, options.concurrency); + + this.uploader.setRetryConfig({ + retry: options.retry || 10, + onRetry: options.onRetry, // @todo bind file to retry in s3 uploader + retryFactor: options.retryFactor || 2, + retryMaxTime: options.retryMaxTime || 15000, + }); + + this.uploader.setTimeout(options.timeout || 120000); + + if (options.partSize) { + this.uploader.setPartSize(options.partSize); + } + + if (options.intelligentChunkSize) { + this.uploader.setIntelligentChunkSize(options.intelligentChunkSize); } - }; + + if (options.intelligent) { + this.uploader.setUploadMode(options.intelligent === 'fallback' ? UploadMode.FALLBACK : UploadMode.INTELLIGENT); + } + + this.uploader.on('error', (e) => this.emit('error', e)); + this.uploader.on('progress', this.handleProgress.bind(this)); + } /** - * Iterate over all parts and abort their requests - * @private + * Set session object to uploader + * + * @deprecated + * @param {Session} session + * @memberof Upload */ - const cancelAllRequests = (): void => { - const parts = Object.keys(state.parts).map(k => state.parts[k]); - parts.forEach((part: any) => { - if (part.request) part.request.abort(); - part.chunks.forEach((chunk: any) => { - if (chunk.request) chunk.request.abort(); + setSession(session: Session) { + this.uploader.setApikey(session.apikey); + + if (session.policy && session.signature) { + this.uploader.setSecurity({ + policy: session.policy, + signature: session.signature, }); - gc(part); - }); - }; + } + + this.uploader.setUrl(session.urls.uploadApiUrl); + } /** - * Set failure status, clean up - * @private + * Set cancel token to controll upload flow + * + * @param {*} token + * @returns + * @memberof Upload */ - const failAndCleanUp = (): void => { - cancelAllRequests(); - clearInterval(state.progressTick); - state.status = statuses.FAILED; - - if (file.buffer) { - file.buffer = null; + public setToken(token: any) { + if (!token || token !== Object(token)) { + throw new Error('Incorrect upload token. Must be instance of object'); } - }; - const cancel = new Promise((_, reject) => { - token.cancel = (): void => { - if (state.status === statuses.RUNNING || state.status === statuses.PAUSED) { - failAndCleanUp(); - reject(new Error('Upload cancelled')); - } - }; - }); + token.pause = () => this.uploader.pause(); + token.resume = () => this.uploader.resume(); + token.cancel = () => this.uploader.abort(); - const cancellable = (p: Promise): Promise => { - return Promise.race([cancel, p]); - }; + return token; + } /** - * Retries a function up to the retry limit. For intelligent ingestion it halves chunk size before retrying part - * @private - * @param location A name for the function being retried - * @param func The function to retry - * @param err An Error whose message will be used if the retry limit is met. - * @param part Part object for FII retries (each part tracks its own chunkSize) - * @returns {Promise} + * Sets security to uploader instance + * + * @param {Security} security + * @memberof Upload */ - const retry = (location: string, func: any, err: any, part?: PartObj): Promise => { - let attempt = state.retries[location] || 0; - - // console.error(`Cannot upload file ${err}, Method: ${err.method}, Status: ${err.status}, Timeout: ${err.timeout}`); - - const waitTime = Math.min(config.retryMaxTime, (config.retryFactor ** attempt) * 1000); - const promise = new Promise((resolve, reject) => { - if (attempt === config.retry - || (err.status === 400 && err.method !== 'PUT') - || err.status === 401 - || err.status === 403 - || err.status === 404 - || part && part.chunkSize <= MIN_CHUNK_SIZE - ) { - failAndCleanUp(); - return reject(err); - } - const exec = () => setTimeout(() => resolve(func()), waitTime); - // FII S3 retry (resize chunk) - if (part && (config.intelligent || part.intelligentOverride) && ( - // Browser S3 network error - (err.method === 'PUT' && (err.crossDomain || err.status === 400)) - - // if connection is aborted we dont have request method - || (err.code === 'ECONNABORTED' && err.timeout) - // Node S3 network error - || (err.code === 'ECONNRESET' || err.code === 'ETIMEDOUT') - )) { - - part.chunkSize /= 2; - - if (config.onRetry) { - config.onRetry({ - location, - parts: state.parts, - filename: getName(file, config), - chunkSize: part.chunkSize, - attempt: undefined, - }); - } - if (config.intelligent === 'fallback') { - part.intelligentOverride = true; - } - return exec(); - } - // Normal retry (with retry limit) - attempt += 1; - state.retries[location] = attempt; - if (config.onRetry) { - config.onRetry({ - location, - parts: state.parts, - filename: getName(file, config), - attempt, - }); - } - return exec(); - }); + public setSecurity(security: Security) { + this.uploader.setSecurity(security); + } - return cancellable(promise); - }; + /** + * Upload single file + * + * @param {(InputFile)} file + * @returns {Promise} + * @memberof Upload + */ + async upload(input: InputFile): Promise { - // Here we go - state.status = statuses.RUNNING; + const f = await getFile(input, this.sanitizerOptions); + f.customName = this.overwriteFileName; + this.uploader.addFile(f); - const { body: params } = await cancellable(start(ctx)); - ctx.params = params; + this.startProgressInterval(); + const res = (await this.uploader.execute()).shift(); + this.stopProgressInterval(); - const goPart = flowControl(ctx, async (partObj: PartObj) => { - const part = await getPart(partObj, ctx); + this.uploader.removeAllListeners(); - if (part.size === 0) { - return Promise.reject(new Error('Upload aborted due to empty chunk.')); - } - const location = `upload part ${part.number + 1}`; - state.parts[part.number] = part; - try { - const { headers: { etag }, status } = await uploadPart(part, ctx); - if (status === 206) { - const err = new Error('Intelligent part failed to commit'); - return retry(location, () => goPart(part), err, part); - } - part.loaded = part.size; - gc(part); - if (!config.intelligent && !etag) { - return Promise.reject(new Error('Response from S3 is missing ETag header.')); - } - return etag; - } catch (err) { - return retry(location, () => goPart(part), err, part); + if (res.status === FileState.FAILED) { + return Promise.reject(res); } - }); - - const totalParts = Math.ceil(file.size / config.partSize); - const allParts = range(0, totalParts).map((p: any) => makePart(p, ctx)); - - const partsFlow = Promise.all(allParts.map(throat(config.concurrency, goPart))); - startProgress(config.onProgress); - const etags = await cancellable(partsFlow); - - const goComplete = flowControl(ctx, async () => { - try { - const res = await complete(etags, ctx); - if (res.status === 202) { - return new Promise((resolve) => { - setTimeout(() => resolve(goComplete()), 1000); - }); - } - state.status = statuses.DONE; - finishProgress(config.onProgress); - if (file.buffer) { - file.buffer = null; - } + return Promise.resolve(res); + } - if (res.body && res.body.error && res.body.error.text) { - return Promise.reject(new Error(`File upload error: ${res.body.error.text}`)); + /** + * Upload multiple files at once + * + * @param {(InputFile[])} input + * @returns {Promise} + * @memberof Upload + */ + async multiupload(input: InputFile[]): Promise { + for (let i in input) { + /* istanbul ignore next */ + if (!input.hasOwnProperty(i)) { + continue; } - return res.body; - } catch (err) { - return retry('complete', goComplete, err); + const f = await getFile(input[i], this.sanitizerOptions); + f.customName = this.overwriteFileName; + this.uploader.addFile(f); } - }); - return cancellable(goComplete()); -}; -/** - * User facing method to upload a single file - * @private - * @param session Session object that contains apikey - * @param file A valid file path (in Node). In browsers a File, Blob, or base64 encoded string - * @param options Configures the uploader - * @param storeOptions Storage options for the backend - * @param token Control token - */ -export const upload = ( - session: Session, - fileOrString: any, - options: UploadOptions = {}, - storeOptions: StoreOptions = {}, - token: any = {}, - security?: Security -): Promise => { - return getFile(fileOrString).then((file: any) => { - if ((file.size !== undefined && file.size === 0) || file.length === 0) { - return Promise.reject(new Error('file has a size of 0.')); - } + this.startProgressInterval(); + const res = await this.uploader.execute(); + this.stopProgressInterval(); - const allowedOptions = [ - { name: 'host', type: t.String }, - { name: 'path', type: t.Boolean }, - { name: 'mimetype', type: t.String }, - { name: 'partSize', type: t.Number }, - { name: 'concurrency', type: t.refinement(t.Integer, n => n > 0) }, - { name: 'onProgress', type: t.Function }, - { name: 'progressInterval', type: t.Integer }, - { name: 'onRetry', type: t.Function }, - { name: 'retry', type: t.Integer }, - { name: 'retryFactor', type: t.Integer }, - { name: 'retryMaxTime', type: t.Integer }, - { name: 'timeout', type: t.Integer }, - { name: 'intelligent', type: t.union([t.Boolean, t.enums.of('fallback')]) }, - { name: 'intelligentChunkSize', type: t.Number }, - ]; - - const wString = t.String; - const wStruct = t.struct({ - id: t.String, - }); + return Promise.resolve(res); + } - const workflowsUniton = t.union([ - wString, - wStruct, - ]); - - workflowsUniton.dispatch = function (x) { - return x.id ? wStruct : wString; - }; - - const allowedStoreOptions = [ - { name: 'location', type: t.enums.of('s3 gcs rackspace azure dropbox') }, - { name: 'region', type: t.String }, - { name: 'path', type: t.String }, - { name: 'container', type: t.String }, - { name: 'filename', type: t.String }, - { name: 'access', type: t.enums.of('public private') }, - { name: 'workflows', type: t.list(workflowsUniton) }, - ]; - - // Throw if any options are invalid - checkOptions('upload (options)', allowedOptions, options); - checkOptions('upload (storeOptions)', allowedStoreOptions, storeOptions); - - // Custom filename option - const storeOpts = { ...storeOptions }; - const opts = { ...options }; - let customName; - - if (storeOpts.filename) { - customName = storeOpts.filename; - } else if (file.name === undefined) { - // Blobs and buffers don't have names, Files do. Give a placeholder name for blobs. - if (file.type) { - const ext = file.type.split('/').pop(); - customName = `untitled.${ext}`; - } else { - customName = 'untitled'; - } + /** + * RUn progress with userdefined interval + * + * @private + * @returns + * @memberof Upload + */ + private startProgressInterval() { + if (typeof this.options.onProgress !== 'function') { + return; } + this.progressIntervalHandler = setInterval(() => { + this.options.onProgress(this.lastProgress); + }, this.options.progressInterval || DEFAULT_PROGRESS_INTERVAL); - // Default location param - if (storeOpts.location === undefined) { - storeOpts.location = 's3'; - } + this.options.onProgress(this.lastProgress); + } + + /** + * Stop progress interval after upload + * + * @private + * @memberof Upload + */ + private stopProgressInterval() { + clearInterval(this.progressIntervalHandler); + } - // Intelligent Ingestion requires part size of exactly 8MB - if (opts.intelligent) { - opts.partSize = 8 * 1024 * 1024; + /** + * Handle upload interval and normalize values + * + * @private + * @param {ProgressEvent} progress + * @memberof Upload + */ + private handleProgress(progress: ProgressEvent) { + // get max progress data to avoid progress jumps on any part error + progress = normalizeProgress(progress, this.lastProgress); + + if (this.lastProgress.files) { + for (let i in progress.files) { + if (this.lastProgress.files[i]) { + progress.files[i] = normalizeProgress(progress.files[i], this.lastProgress.files[i]); + } + } } - // Set security if on session or override - const policy = security && security.policy || session.policy; - const signature = security && security.signature || session.signature; - - // Configurables - const config: UploadConfig = { - host: session.urls.uploadApiUrl, - apikey: session.apikey, - policy, - signature, - partSize: 6 * 1024 * 1024, - concurrency: 3, - progressInterval: 1000, - retry: 10, - retryFactor: 2, - retryMaxTime: 15000, - customName, - mimetype: options.mimetype, - store: { - workflows: storeOpts.workflows, - store_location: storeOpts.location, - store_region: storeOpts.region, - store_container: storeOpts.container, - store_path: storeOpts.path, - store_access: storeOpts.access, - }, - timeout: 120000, - ...opts, - }; - - const initialState: State = { - parts: {}, - progressTick: null, - previousPayload: null, - retries: {}, - status: statuses.INIT, - }; - - const context: Context = { - file, - config, - state: initialState, - }; - - return uploadFile(context, token); - }); -}; + this.lastProgress = progress; + } +} diff --git a/src/lib/api/upload/uploaders/abstract.ts b/src/lib/api/upload/uploaders/abstract.ts new file mode 100644 index 00000000..2a44c1e5 --- /dev/null +++ b/src/lib/api/upload/uploaders/abstract.ts @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import Debug from 'debug'; +import * as EventEmitter from 'eventemitter3'; + +import { File } from './../file'; +import { StoreUploadOptions } from './../types'; +import { Security } from './../../../client'; +import { RetryConfig } from './../../request'; +import { isMobile } from './../../../utils'; +import { FilestackError } from './../../../../filestack_error'; + +// regular part size +export const DEFAULT_PART_SIZE = 6 * 1024 * 1024; + +// Minimum part size for upload by multipart +export const MIN_PART_SIZE = 5 * 1024 * 1024; + +// when mode is set to fallback or intelligent, this part size is required +export const INTELLIGENT_CHUNK_SIZE = 8 * 1024 * 1024; + +// Mobile Chunk size for ii +export const INTELLIGENT_MOBILE_CHUNK_SIZE = 1024 * 1024; + +// minimum intelligent chunk size +export const MIN_CHUNK_SIZE = 32 * 1024; + +export const DEFAULT_STORE_LOCATION = 's3'; + +const debug = Debug('fs:upload:abstract'); + +export const enum UploadMode { + DEFAULT = 'default', + INTELLIGENT = 'intelligent', + FALLBACK = 'fallback', +} + +export abstract class UploaderAbstract extends EventEmitter { + // Parts size options + protected partSize: number = DEFAULT_PART_SIZE; + + // chunk size for ii uploads + protected intelligentChunkSize: number = isMobile() ? INTELLIGENT_MOBILE_CHUNK_SIZE : INTELLIGENT_CHUNK_SIZE; + + // upload options + protected url: string; + protected timeout: number = 30 * 1000; + protected uploadMode: UploadMode = UploadMode.DEFAULT; + + // application settings + protected apikey: string; + protected security: Security; + + protected isModeLocked: boolean = false; // if account does not support ii in fallback mode we should abort + protected retryConfig: RetryConfig; + + constructor(protected readonly storeOptions: StoreUploadOptions, protected readonly concurrency: number = 3) { + super(); + } + + public setSecurity(security: Security): void { + debug('Set security %O', security); + this.security = security; + } + + public setApikey(apikey: string): void { + debug(`Set apikey to ${apikey}`); + this.apikey = apikey; + } + + public setTimeout(timeout: number): void { + debug(`Set request timeout to ${timeout}`); + this.timeout = timeout; + } + + public setRetryConfig(cfg: RetryConfig) { + this.retryConfig = cfg; + } + + public setUrl(url: string): void { + this.url = url; + } + + /** + * Sets upload mode + * + * @param {UploadMode} mode + * @param {boolean} [lock=false] + * @returns + * @memberof MultipartUploader + */ + public setUploadMode(mode: UploadMode, lock: boolean = false): void { + // this shouldnt happend but for safety reasons if will stay + /* istanbul ignore next */ + if (this.isModeLocked === true) { + debug(`Cannot switch mode to ${mode}. Locked! Probably mode is not supported at this apikey`); + return; + } + + this.isModeLocked = lock; + + debug(`Set upload mode to ${mode}`); + + this.uploadMode = mode; + } + + /** + * Set upload part size + * if part size is smaller than minimum 5mb it will throw error + * + * @param {number} size + * @returns {void} + * @memberof S3Uploader + */ + public setPartSize(size: number): void { + if (this.uploadMode !== UploadMode.DEFAULT) { + debug('Cannot set part size because upload mode is other than default. '); + return; + } + + debug(`Set part size to ${size}`); + + if (size < MIN_PART_SIZE) { + throw new FilestackError('Minimum part size is 5MB'); + } + + this.partSize = size; + } + + /** + * Returns current part size + */ + public getPartSize() { + return this.partSize; + } + + /** + * Set start part size for ii + * + * @param {number} size + * @memberof S3Uploader + */ + public setIntelligentChunkSize(size: number): void { + debug(`Set inteligent chunk size to ${size}`); + if (size < MIN_CHUNK_SIZE) { + throw new FilestackError(`Minimum intelligent chunk size is ${MIN_CHUNK_SIZE}`); + } + this.intelligentChunkSize = size; + } + + /** + * Returns intelligent chunk size + */ + public getIntelligentChunkSize(): number { + return this.intelligentChunkSize; + } + + /** + * Returns filestack upload url + * + * @private + * @returns + * @memberof MultipartUploader + */ + public getUrl(): string { + if (!this.url) { + throw new FilestackError('Upload url not set'); + } + + return this.url; + } + + /** + * Pause upload queue + * + * @memberof MultipartUploader + */ + public abstract pause(): void; + /** + * resume upload queue if its paused + * + * @memberof MultipartUploader + */ + public abstract resume(): void; + + /** + * Aborts queue (all pending requests with will be aborted) + * + * @memberof MultipartUploader + */ + public abstract abort(msg?: string): void; + + public abstract addFile(file: File): string; + + public abstract async execute(): Promise; +} diff --git a/src/lib/api/upload/uploaders/s3.spec.ts b/src/lib/api/upload/uploaders/s3.spec.ts new file mode 100644 index 00000000..ea2be0ae --- /dev/null +++ b/src/lib/api/upload/uploaders/s3.spec.ts @@ -0,0 +1,903 @@ +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { S3Uploader } from './s3'; +import { File } from './../file'; +import * as nock from 'nock'; +import { UploadMode, DEFAULT_STORE_LOCATION, INTELLIGENT_CHUNK_SIZE, DEFAULT_PART_SIZE, INTELLIGENT_MOBILE_CHUNK_SIZE } from './abstract'; +import * as utils from '../../../utils'; + +const testBufferSize = 1024 * 1024 * 9; +const testSmallBufferSize = 1024 * 1024 * 2; +let testBuff = Buffer.alloc(testBufferSize).fill('t', 0, testBufferSize); +let smallTestBuff = Buffer.alloc(testSmallBufferSize).fill('t', 0, testSmallBufferSize); + +let scope; +let interceptorS3; +let interceptorStart; +let interceptorCommit; +let interceptorUpload; +let interceptorComplete; + +const getTestFile = () => + new File({ + buffer: testBuff, + type: 'text/plain', + // @ts-ignore + size: testBuff.length, + name: 'test.txt', + }); + +const getSmallTestFile = () => + new File({ + buffer: smallTestBuff, + type: 'text/plain', + // @ts-ignore + size: smallTestBuff.length, + name: 'test.txt', + }); + +const testApikey = 'testapikey'; +const testHost = 'https://filestack-test.com'; +const mockUploadId = '123132123'; +const mockRegion = 'test-region'; +const mockedUri = '/sometest'; +const s3Url = testHost + '/fakes3'; + +const mockStart = jest.fn().mockName('multipart/start'); +const mockUpload = jest.fn().mockName('multipart/upload'); +const mockPut = jest.fn().mockName('s3/put'); +const mockCommit = jest.fn().mockName('multipart/commit'); +const mockComplete = jest.fn().mockName('multipart/complete'); + +const s3Callback = function(url) { + return mockPut(url, this.req.headers); +}; + +describe('Api/Upload/Uploaders/S3', () => { + beforeEach(() => { + scope = nock(testHost); + scope.persist(); + + interceptorStart = scope.post('/multipart/start'); + interceptorUpload = scope.post('/multipart/upload'); + interceptorCommit = scope.post('/multipart/commit'); + interceptorComplete = scope.post('/multipart/complete'); + interceptorS3 = scope.put('/fakes3'); + + interceptorStart.reply(200, (_, data) => mockStart(JSON.parse(data))); + interceptorUpload.twice().reply(200, (_, data) => mockUpload(JSON.parse(data))); + interceptorCommit.reply(200, (_, data) => mockCommit(JSON.parse(data))); + interceptorComplete.reply(200, (_, data) => mockComplete(JSON.parse(data))); + interceptorS3.twice().reply(201, s3Callback, { etag: 'test' }); + + mockStart.mockReturnValue({ + uri: mockedUri, + region: mockRegion, + upload_id: mockUploadId, + location_url: testHost, + }); + + mockUpload.mockReturnValue({ + url: s3Url, + headers: { + test: 'test', + }, + location_url: testHost, + }); + + mockPut.mockReturnValue({}); + mockCommit.mockReturnValue({}); + + mockComplete.mockReturnValue({ + handle: 'test_handle', + url: 'test_url', + filename: 'test_filename', + size: 123, + mimetype: 'test_mimetype', + status: 'test_status', + }); + }); + + afterEach(() => { + nock.cleanAll(); + nock.enableNetConnect(); + jest.clearAllMocks(); + }); + + describe('Standart tests', () => { + it('should initialize class without errors', () => { + expect(() => { + const u = new S3Uploader({}); + const uu = new S3Uploader({}, 10); + }).not.toThrowError(); + }); + + it('should allow adding files', () => { + const u = new S3Uploader({}); + u.addFile(getTestFile()); + }); + + it('should not allow to set min part size lower than defined', () => { + const u = new S3Uploader({}); + expect(() => u.setPartSize(10)).toThrowError(); + }); + + it('should throw an error when setting to small intelligent chunk size', () => { + const u = new S3Uploader({}); + expect(() => u.setIntelligentChunkSize(10)).toThrowError(); + }); + + it('should throw an error when trying to get host when it is undefined', () => { + const u = new S3Uploader({}); + expect(() => u.getUrl()).toThrowError(); + }); + + it('should set intelligent mobile chunk size on mobile devices', () => { + spyOn(utils, 'isMobile').and.returnValue(true); + const u = new S3Uploader({}); + return expect(u.getIntelligentChunkSize()).toEqual(INTELLIGENT_MOBILE_CHUNK_SIZE); + }); + + it('should allow to set part size on other mode thant regular', () => { + const u = new S3Uploader({}); + u.setUploadMode(UploadMode.INTELLIGENT); + + const partSize = 1024 * 1024; + u.setPartSize(partSize); + + expect(u.getPartSize()).toEqual(DEFAULT_PART_SIZE); + }); + + it('should retry complete request on 202 status code', async () => { + const mock202 = jest + .fn() + .mockName('202 mock') + .mockReturnValue(''); + + nock.removeInterceptor(interceptorComplete); + scope.persist(false); + scope.post('/multipart/complete').reply(202, () => mock202()); + scope.post('/multipart/complete').reply(200, (_, data) => mockComplete(JSON.parse(data))); + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.addFile(getTestFile()); + + const res = await u.execute(); + + expect(res[0].handle).toEqual('test_handle'); + expect(res[0].status).toEqual('test_status'); + + expect(mock202).toHaveBeenCalledTimes(1); + expect(mockComplete).toHaveBeenCalledTimes(1); + }); + + it('should respect provided store options and add prefix to them', async () => { + const storeOption = { + container: 'test', + location: DEFAULT_STORE_LOCATION, + workflows: [{ + id: 'test', + }], + }; + + const u = new S3Uploader(storeOption); + u.setUrl(testHost); + u.setApikey(testApikey); + u.addFile(getSmallTestFile()); + + const res = await u.execute(); + + const testFile = getSmallTestFile(); + expect(mockStart).toHaveBeenCalledWith({ + filename: testFile.name, + mimetype: testFile.mimetype, + size: testFile.size, + store: storeOption, + apikey: testApikey, + }); + + expect(mockComplete).toHaveBeenCalledWith({ + filename: testFile.name, + mimetype: testFile.mimetype, + size: testFile.size, + store: storeOption, + apikey: testApikey, + parts: [{ part_number: 1, etag: 'test' }], + region: mockRegion, + upload_id: mockUploadId, + uri: mockedUri, + }); + }); + + it('should add https protocol to location_url', async () => { + mockStart.mockReturnValue({ + uri: mockedUri, + region: mockRegion, + upload_id: mockUploadId, + location_url: testHost.replace('https://', ''), + }); + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.addFile(getSmallTestFile()); + + const res = await u.execute(); + + expect(res[0].handle).toEqual('test_handle'); + expect(res[0].status).toEqual('test_status'); + + expect(mockPut).toHaveBeenCalled(); + }); + + it('should add Filestack-Upload-Region header on location_region param', async () => { + mockStart.mockReturnValue({ + uri: mockedUri, + region: mockRegion, + upload_id: mockUploadId, + location_region: 'test', + location_url: testHost.replace('https://', ''), + }); + + interceptorUpload.reply(200, function(_, data) { + return mockUpload(JSON.parse(data), this.req.headers); + }); + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.addFile(getSmallTestFile()); + + const res = await u.execute(); + + expect(res[0].handle).toEqual('test_handle'); + expect(res[0].status).toEqual('test_status'); + + const testFile = getSmallTestFile(); + expect(mockUpload).toHaveBeenCalledWith( + { + md5: testFile.md5, + size: testFile.size, + apikey: testApikey, + region: mockRegion, + store: { + location: DEFAULT_STORE_LOCATION, + }, + uri: mockedUri, + upload_id: mockUploadId, + part: 1, + }, + expect.objectContaining({ 'filestack-upload-region': 'test' }) + ); + + expect(mockPut).toHaveBeenCalled(); + }); + + it('should respect pause() and resume() command', async () => { + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.addFile(getTestFile()); + + setImmediate(() => u.pause()); + setTimeout(() => u.resume(), 10); + + const res = await u.execute(); + + expect(res[0].handle).toEqual('test_handle'); + expect(res[0].status).toEqual('test_status'); + }); + + it('should respect abort() command', (done) => { + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.addFile(getTestFile()); + + setImmediate(() => u.abort()); + u.execute().then((res) => { + expect(res[0].status).toEqual('Failed'); + done(); + }).catch(() => { + done('Execution failed'); + }); + }); + + it('should send correct security', async () => { + const testSecurity = { + policy: 'test_p', + signature: 'test_s', + }; + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.setSecurity(testSecurity); + u.addFile(getSmallTestFile()); + + const res = await u.execute(); + expect(res[0].status).toEqual('test_status'); + + expect(mockStart).toHaveBeenCalledWith(expect.objectContaining(testSecurity)); + expect(mockUpload).toHaveBeenCalledWith(expect.objectContaining(testSecurity)); + expect(mockComplete).toHaveBeenCalledWith(expect.objectContaining(testSecurity)); + + }); + }); + + describe('Upload modes', () => { + describe('Intelligent ingession', () => { + beforeEach(() => { + mockStart.mockReturnValue({ + uri: mockedUri, + region: mockRegion, + upload_id: mockUploadId, + location_url: testHost, + upload_type: 'intelligent_ingestion', + }); + }); + + it('should upload file', async () => { + const chunkSize = 1024 * 1024; + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.setUploadMode(UploadMode.INTELLIGENT); + u.setIntelligentChunkSize(chunkSize); + u.addFile(getSmallTestFile()); + + const res = await u.execute(); + expect(res[0].handle).toEqual('test_handle'); + + const testFile = getSmallTestFile(); + expect(mockStart).toHaveBeenCalledWith({ + filename: testFile.name, + mimetype: testFile.mimetype, + size: testFile.size, + store: { + location: DEFAULT_STORE_LOCATION, + }, + apikey: testApikey, + fii: true, + }); + + const firstPartOffset = 0; + const firstPartMetadata = testFile.getPartMetadata(0, INTELLIGENT_CHUNK_SIZE); + const firstPartChunk = testFile.getChunkByMetadata(firstPartMetadata, firstPartOffset, chunkSize); + + expect(mockUpload).toHaveBeenCalledWith({ + md5: firstPartChunk.md5, + size: firstPartChunk.size, + apikey: testApikey, + region: mockRegion, + store: { + location: DEFAULT_STORE_LOCATION, + }, + uri: mockedUri, + upload_id: mockUploadId, + offset: firstPartOffset, + fii: true, + part: 1, + }); + + expect(mockPut).toHaveBeenCalledWith('/fakes3', expect.any(Object)); + + const secondPartOffset = chunkSize; + const firstPartSecondChunk = testFile.getChunkByMetadata(firstPartMetadata, secondPartOffset, chunkSize); + + expect(mockUpload).toHaveBeenCalledWith({ + md5: firstPartSecondChunk.md5, + size: firstPartSecondChunk.size, + apikey: testApikey, + region: mockRegion, + store: { + location: DEFAULT_STORE_LOCATION, + }, + uri: mockedUri, + upload_id: mockUploadId, + offset: secondPartOffset, + fii: true, + part: 1, + }); + + expect(mockPut).toHaveBeenCalledWith('/fakes3', expect.any(Object)); + + expect(mockCommit).toHaveBeenCalledWith({ + apikey: testApikey, + part: 1, + size: testFile.size, + region: mockRegion, + uri: mockedUri, + upload_id: mockUploadId, + store: { + location: DEFAULT_STORE_LOCATION, + }, + }); + + expect(mockComplete).toHaveBeenCalledWith({ + apikey: testApikey, + filename: testFile.name, + mimetype: testFile.mimetype, + size: testFile.size, + region: mockRegion, + upload_id: mockUploadId, + store: { + location: DEFAULT_STORE_LOCATION, + }, + fii: true, + uri: mockedUri, + }); + }); + + it('should lower chunk size on network error', async () => { + const putRequestTimeout = 300; + + let delayApplied = false; + interceptorS3.reply( + function(url, _, cb) { + if (!delayApplied) { + delayApplied = true; + setTimeout(() => { + cb(); + }, putRequestTimeout + 10); + } else { + cb(null, mockPut(url, this.req.headers)); + } + }, + { + etag: 'test', + } + ); + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.setTimeout(putRequestTimeout); + u.setUploadMode(UploadMode.INTELLIGENT); + + u.addFile(getSmallTestFile()); + const res = await u.execute(); + expect(res[0].handle).toEqual('test_handle'); + expect(res[0].status).toEqual('test_status'); + + const testFile = getSmallTestFile(); + const firstPartMetadata = testFile.getPartMetadata(0, INTELLIGENT_CHUNK_SIZE); + const firstPartChunk = testFile.getChunkByMetadata(firstPartMetadata, 0, INTELLIGENT_CHUNK_SIZE); + + // this request will be aborted but called on mock upload + expect(mockUpload).toHaveBeenNthCalledWith(1, { + md5: firstPartChunk.md5, + size: firstPartChunk.size, + apikey: testApikey, + region: mockRegion, + fii: true, + store: { + location: DEFAULT_STORE_LOCATION, + }, + uri: mockedUri, + upload_id: mockUploadId, + offset: 0, + part: 1, + }); + + // split part size by a half and retry request (thats give us 2 chunks so 2 upload requests needed) + const chunkSize = Math.min(INTELLIGENT_CHUNK_SIZE, testFile.size) / 2; + const chunk1 = testFile.getChunkByMetadata(firstPartMetadata, 0, chunkSize); + + expect(mockUpload).toHaveBeenNthCalledWith(2, { + md5: chunk1.md5, + size: chunk1.size, + apikey: testApikey, + region: mockRegion, + store: { + location: DEFAULT_STORE_LOCATION, + }, + fii: true, + uri: mockedUri, + upload_id: mockUploadId, + offset: 0, + part: 1, + }); + + const chunk2 = testFile.getChunkByMetadata(firstPartMetadata, chunkSize / 2, chunkSize); + + expect(mockUpload).toHaveBeenNthCalledWith(3, { + md5: chunk2.md5, + size: chunk2.size, + apikey: testApikey, + region: mockRegion, + store: { + location: DEFAULT_STORE_LOCATION, + }, + fii: true, + uri: mockedUri, + upload_id: mockUploadId, + offset: chunkSize, + part: 1, + }); + }); + + it('should exit when chunk size reaches min chunk size', async () => { + interceptorS3.reply((url, _, cb) => cb('Error')); + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.setTimeout(100); + u.setUploadMode(UploadMode.INTELLIGENT); + + u.addFile(getSmallTestFile()); + const res = await u.execute(); + expect(res[0].status).toEqual('Failed'); + }); + + it('should exit on 4xx errors', async () => { + mockStart.mockReturnValue({ + uri: mockedUri, + region: mockRegion, + upload_id: mockUploadId, + location_url: testHost, + upload_type: 'intelligent_ingestion', + }); + + interceptorS3.reply(400, { + message: 'something awful happened', + code: 'bad_request', + }); + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.setTimeout(100); + u.setUploadMode(UploadMode.INTELLIGENT); + + u.addFile(getSmallTestFile()); + const res = await u.execute(); + expect(res[0].status).toEqual('Failed'); + }); + + it('should nor process upload on multipart/upload network error', async () => { + interceptorUpload.reply(400, { + message: 'something awful happened', + code: 'bad_request', + }); + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.setUploadMode(UploadMode.INTELLIGENT); + u.addFile(getSmallTestFile()); + + const res = await u.execute(); + + expect(res[0].status).toEqual('Failed'); + + expect(mockStart).toHaveBeenCalled(); + expect(mockPut).not.toHaveBeenCalled(); + expect(mockCommit).not.toHaveBeenCalled(); + expect(mockComplete).not.toHaveBeenCalled(); + }); + }); + + describe('Fallback mode', () => { + it('should switch to fallback mode if regular upload fails', async () => { + mockStart.mockReturnValue({ + uri: mockedUri, + region: mockRegion, + upload_id: mockUploadId, + location_url: testHost, + upload_type: 'intelligent_ingestion', + }); + + let networkFail = true; + interceptorS3.reply( + function(url, _, cb) { + if (networkFail) { + networkFail = false; + return cb('Error'); + } + + cb(null, mockPut(url, this.req.headers)); + }, + { + etag: 'test', + } + ); + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.setUploadMode(UploadMode.FALLBACK); + u.addFile(getSmallTestFile()); + + const res = await u.execute(); + + expect(res[0].handle).toEqual('test_handle'); + expect(res[0].status).toEqual('test_status'); + + const testFile = getSmallTestFile(); + const firstPartMeta = testFile.getPartMetadata(0, DEFAULT_PART_SIZE); + const firstPart = testFile.getPartByMetadata(firstPartMeta); + + expect(mockUpload).toHaveBeenNthCalledWith(1, { + md5: firstPart.md5, + size: firstPart.size, + apikey: testApikey, + region: mockRegion, + store: { + location: DEFAULT_STORE_LOCATION, + }, + uri: mockedUri, + upload_id: mockUploadId, + part: 1, + }); + + expect(mockUpload).toHaveBeenNthCalledWith(2, { + md5: firstPart.md5, + size: firstPart.size, + fii: true, + apikey: testApikey, + region: mockRegion, + store: { + location: DEFAULT_STORE_LOCATION, + }, + uri: mockedUri, + offset: 0, + upload_id: mockUploadId, + part: 1, + }); + }); + + it('should exit if intelligent ingestion is not enabled in account settings', async () => { + mockStart.mockReturnValue({ + uri: mockedUri, + region: mockRegion, + upload_id: mockUploadId, + location_url: testHost, + }); + + let networkFail = true; + interceptorS3.reply( + function(url, _, cb) { + if (networkFail) { + networkFail = false; + return cb({ + message: 'ConnectionError', + code: 'ETIMEDOUT', + }); + } + + cb(null, mockPut(url, this.req.headers)); + }, + { + etag: 'test', + } + ); + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.setUploadMode(UploadMode.FALLBACK); + u.addFile(getSmallTestFile()); + + const res = await u.execute(); + + expect(res[0].status).toEqual('Failed'); + expect(mockCommit).not.toHaveBeenCalled(); + expect(mockComplete).not.toHaveBeenCalled(); + }); + }); + }); + + describe('Regular upload', () => { + it('should upload file', async () => { + const partSize = 1024 * 1024 * 7; + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.setPartSize(partSize); + u.addFile(getTestFile()); + + const res = await u.execute(); + + const testFile = getTestFile(); + + expect(mockStart).toHaveBeenCalledWith({ + filename: testFile.name, + mimetype: testFile.mimetype, + size: testFile.size, + store: { + location: DEFAULT_STORE_LOCATION, + }, + apikey: testApikey, + }); + + const firstPartMeta = testFile.getPartMetadata(0, partSize); + const firstPart = testFile.getPartByMetadata(firstPartMeta); + + expect(mockUpload).toHaveBeenNthCalledWith(1, { + md5: firstPart.md5, + size: firstPart.size, + apikey: testApikey, + region: mockRegion, + store: { + location: DEFAULT_STORE_LOCATION, + }, + uri: mockedUri, + upload_id: mockUploadId, + part: 1, + }); + + const secondPartMeta = testFile.getPartMetadata(1, partSize); + const secondPart = testFile.getPartByMetadata(secondPartMeta); + + expect(mockUpload).toHaveBeenNthCalledWith(2, { + md5: secondPart.md5, + size: secondPart.size, + apikey: testApikey, + region: mockRegion, + store: { + location: DEFAULT_STORE_LOCATION, + }, + uri: mockedUri, + upload_id: mockUploadId, + part: 2, + }); + + expect(mockPut).toHaveBeenCalledWith('/fakes3', expect.any(Object)); + expect(mockComplete).toHaveBeenCalledWith({ + apikey: testApikey, + filename: testFile.name, + mimetype: testFile.mimetype, + size: testFile.size, + parts: [{ part_number: 1, etag: 'test' }, { part_number: 2, etag: 'test' }], + region: mockRegion, + upload_id: mockUploadId, + store: { + location: DEFAULT_STORE_LOCATION, + }, + uri: mockedUri, + }); + + expect(res[0].handle).toEqual('test_handle'); + expect(res[0].status).toEqual('test_status'); + }); + + it('should not process upload on multipart/upload network error', async () => { + interceptorUpload.reply(400, { + message: 'something awful happened', + code: 'bad_request', + }); + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.addFile(getSmallTestFile()); + + const res = await u.execute(); + + expect(res[0].status).toEqual('Failed'); + + expect(mockStart).toHaveBeenCalled(); + expect(mockPut).not.toHaveBeenCalled(); + expect(mockCommit).not.toHaveBeenCalled(); + expect(mockComplete).not.toHaveBeenCalled(); + }); + + it('should repsect retry config', async () => { + // simulate first request network fail + let networkFail = true; + nock.removeInterceptor(interceptorS3); + scope.persist(false); + + interceptorS3.twice().reply( + function(url, _, cb) { + if (networkFail) { + networkFail = false; + return cb('Error'); + } + + cb(null, mockPut(url, this.req.headers)); + }, + { + etag: 'test', + } + ); + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.addFile(getSmallTestFile()); + u.setRetryConfig({ + retry: 1, + retryFactor: 2, + retryMaxTime: 10, + }); + + const res = await u.execute(); + expect(res[0].status).toEqual('test_status'); + }); + }); + + describe('Common network errors', () => { + it('should not process upload on wrong start response', async () => { + mockStart.mockReset(); + mockStart.mockReturnValue({ + test: 123, + }); + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.addFile(getSmallTestFile()); + + const res = await u.execute(); + + expect(res[0].status).toEqual('Failed'); + expect(mockPut).not.toHaveBeenCalled(); + expect(mockUpload).not.toHaveBeenCalled(); + expect(mockCommit).not.toHaveBeenCalled(); + expect(mockComplete).not.toHaveBeenCalled(); + }); + + it('should not process upload on start error', async () => { + interceptorStart.reply(400, { + message: 'something awful happened', + code: 'bad_request', + }); + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.addFile(getSmallTestFile()); + + const res = await u.execute(); + + expect(res[0].status).toEqual('Failed'); + + expect(mockPut).not.toHaveBeenCalled(); + expect(mockUpload).not.toHaveBeenCalled(); + expect(mockCommit).not.toHaveBeenCalled(); + expect(mockComplete).not.toHaveBeenCalled(); + }); + + it('should nor process upload on multipart/complete network error', async () => { + interceptorComplete.reply(400, { + message: 'something awful happened', + code: 'bad_request', + }); + + const u = new S3Uploader({}); + u.setUrl(testHost); + u.setApikey(testApikey); + u.addFile(getSmallTestFile()); + + const res = await u.execute(); + + expect(res[0].status).toEqual('Failed'); + + expect(mockStart).toHaveBeenCalled(); + expect(mockPut).toHaveBeenCalled(); + expect(mockCommit).not.toHaveBeenCalled(); + }); + }); +}); diff --git a/src/lib/api/upload/uploaders/s3.ts b/src/lib/api/upload/uploaders/s3.ts new file mode 100644 index 00000000..29c67cd7 --- /dev/null +++ b/src/lib/api/upload/uploaders/s3.ts @@ -0,0 +1,774 @@ +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import PQueue from 'p-queue'; +import Debug from 'debug'; +import { CancelTokenSource, AxiosResponse } from 'axios'; + +import { File, FilePart, FilePartMetadata, FileState } from './../file'; +import { StoreUploadOptions } from './../types'; +import { postWithRetry, request, useRetryPolicy, shouldRetry } from './../../request'; +import { uniqueTime, uniqueId, filterObject } from './../../../utils'; +import { UploaderAbstract, UploadMode, INTELLIGENT_CHUNK_SIZE, MIN_CHUNK_SIZE, DEFAULT_STORE_LOCATION } from './abstract'; +import { FilestackError, FilestackErrorType } from './../../../../filestack_error'; + +const debug = Debug('fs:upload:s3'); + +const COMPLETE_TIMEOUT = 1000 * 1; + +export interface UploadPart extends FilePartMetadata { + etag?: string; + offset?: number; + progress?: number; +} + +export interface UploadPayload { + file: File; + parts: UploadPart[]; + handle?: string; + uri?: string; + region?: string; + upload_id?: number; + location_url?: string; + location_region?: string; +} + +export class S3Uploader extends UploaderAbstract { + private partsQueue; + private cancelToken: CancelTokenSource; // global cancel token for all requests + + private payloads: { [key: string]: UploadPayload } = {}; + + constructor(storeOptions: StoreUploadOptions, concurrency?) { + super(storeOptions, concurrency); + + this.partsQueue = new PQueue({ + autoStart: false, + concurrency: this.concurrency, + }); + + // setup cancel token + const CancelToken = request.CancelToken; + this.cancelToken = CancelToken.source(); + } + + /** + * Pause upload queue + * + * @memberof S3Uploader + */ + public pause(): void { + this.partsQueue.pause(); + } + + /** + * resume upload queue if its paused + * + * @memberof S3Uploader + */ + public resume(): void { + /* istanbul ignore next */ + if (this.partsQueue.isPaused) { + this.partsQueue.start(); + } + } + + /** + * Aborts queue (all pending requests with will be aborted) + * + * @memberof S3Uploader + */ + public abort(msg?: string): void { + this.cancelToken.cancel(msg || 'Aborted by user'); + this.partsQueue.clear(); + } + + /** + * Execute all queued files + * + * @returns {Promise} + * @memberof S3Uploader + */ + public async execute(): Promise { + const tasks = Object.keys(this.payloads).map( + id => + new Promise(async resolve => { + try { + await this.startRequest(id); + await this.prepareParts(id); + await this.startPartsQueue(id); + await this.completeRequest(id); + } catch (e) { + /* istanbul ignore next */ + this.emit('error', e); + debug(`[${id}] File upload failed. %O, \nDetails: %O `, e.message, e.details); + } + + const file = this.getPayloadById(id).file; + + // release file buffer + file.release(); + + // cleanup payloads + delete this.payloads[id]; + + resolve(file); + }) + ); + + return Promise.all(tasks).then((res) => { + // prevent cancel token memory leak + try { + this.cancelToken.cancel(); + } catch (e) { + /* istanbul ignore next */ + debug(`Cannot cleanup cancel token %O`, e.message); + } + + return res; + }); + } + + /** + * Add file to upload queue + * + * @param {File} file + * @returns + * @memberof S3Uploader + */ + public addFile(file: File): string { + debug('Add file to queue: \n %o', file); + + const id = `${uniqueId(15)}_${uniqueTime()}`; + + file.status = FileState.INIT; + + // split file into parts and set it as waiting + this.payloads[id] = { + file, + parts: [], + }; + + return id; + } + + /** + * Returns host for upload (region based) + * + * @private + * @returns + * @memberof S3Uploader + */ + private getUploadUrl(id: string): string { + const { location_url } = this.getDefaultFields(id, ['location_url']); + return location_url.indexOf('http') === 0 ? location_url : `https://${location_url}`; + } + + /** + * Returns formatted store options + * + * @private + * @returns + * @memberof S3Uploader + */ + private getStoreOptions() { + return { + location: DEFAULT_STORE_LOCATION, // this parameter is required, if not set use default one + ...this.storeOptions, + }; + } + + /** + * Returns all default fields for filestack requests + * + * @private + * @returns + * @memberof S3Uploader + */ + private getDefaultFields(id: string, requiredFields: string[], fiiFallback: boolean = false) { + const payload = this.getPayloadById(id); + + let fields = { + ...this.security, + apikey: this.apikey, + uri: payload.uri, + location_url: payload.location_url, + upload_id: payload.upload_id, + region: payload.region, + }; + + if (this.uploadMode === UploadMode.INTELLIGENT || (this.uploadMode === UploadMode.FALLBACK && fiiFallback)) { + fields['fii'] = true; + } + + return { + ...filterObject(fields, requiredFields), + store: this.getStoreOptions(), + }; + } + + /** + * Returns default headers needed for filestack request + * + * @private + * @returns + * @memberof S3Uploader + */ + private getDefaultHeaders(id: string) { + let headers = {}; + const file = this.getPayloadById(id); + + if (file.location_region) { + headers['Filestack-Upload-Region'] = file.location_region; + } + + return headers; + } + + private getPayloadById(id: string): UploadPayload { + return this.payloads[id]; + } + + /** + * Split file onto parts for uploading with multipart mechanism and setup start + * + * @private + * @memberof S3Uploader + */ + private prepareParts(id: string): Promise { + const file = this.getPayloadById(id).file; + + // for intelligent or fallback mode we cant overwrite part size - requires 8MB + if ([UploadMode.INTELLIGENT, UploadMode.FALLBACK].indexOf(this.uploadMode) > -1) { + this.partSize = INTELLIGENT_CHUNK_SIZE; + } + + const partsCount = file.getPartsCount(this.partSize); + + const parts = []; + + for (let i = 0; i < partsCount; i++) { + parts[i] = { + ...file.getPartMetadata(i, this.partSize), + offset: 0, + }; + } + + // split file into parts and set it as waiting + this.payloads[id].parts = parts; + + return Promise.resolve(); + } + + /** + * Make start request for getting needed upload fields + * + * @private + * @returns {Promise} + * @memberof S3Uploader + */ + private startRequest(id: string): Promise { + const payload = this.getPayloadById(id); + + debug(`[${id}] Make start request`); + + return postWithRetry( + `${this.getUrl()}/multipart/start`, + { + filename: payload.file.name, + mimetype: payload.file.type, + size: payload.file.size, + ...this.getDefaultFields(id, ['apikey', 'policy', 'signature', 'fii'], true), + }, + { + timeout: this.timeout, + cancelToken: this.cancelToken.token, + headers: this.getDefaultHeaders(id), + }, + this.retryConfig + ) + .then(({ data }) => { + if (!data || !data.location_url || !data.region || !data.upload_id || !data.uri) { + debug(`[${id}] Incorrect start response: \n%O\n`, data); + this.setPayloadStatus(id, FileState.FAILED); + return Promise.reject(new FilestackError('Incorrect start response', data, FilestackErrorType.REQUEST)); + } + + debug(`[${id}] Assign payload data: \n%O\n`, data); + + this.updatePayload(id, data); + + // ii is not enabled in backend switch back to default upload mode + if ([UploadMode.INTELLIGENT, UploadMode.FALLBACK].indexOf(this.uploadMode) > -1 && (!data.upload_type || data.upload_type !== 'intelligent_ingestion')) { + debug(`[${id}] Intelligent Ingestion is not enabled on account, switch back to regular upload and lock mode change`); + this.setUploadMode(UploadMode.DEFAULT, true); + } + + return data; + }) + .catch(err => { + debug(`[${id}] Start request error %O`, err); + this.setPayloadStatus(id, FileState.FAILED); + return Promise.reject(new FilestackError('Cannot upload file', err.data, FilestackErrorType.REQUEST)); + }); + } + + /** + * Enqueue file parts to upload + * + * @private + * @returns + * @memberof S3Uploader + */ + private async startPartsQueue(id: string): Promise { + const payload = this.getPayloadById(id); + const parts = payload.parts; + const waitingLength = parts.length; + + debug(`[${id}] Create uploading queue from file. parts count - %d`, waitingLength); + parts.forEach(part => + this.partsQueue + .add(() => this.startPart(id, part.partNumber)) + .catch(e => { + this.setPayloadStatus(id, FileState.FAILED); + debug(`[${id}] Failed to upload part %s`, e.message); + }) + ); + + debug(`[${id}] All tasks for %s enqueued. Start processing main upload queue`, id); + this.partsQueue.start(); + + return this.partsQueue.onIdle(); + } + + /** + * Decide if upload should be made using ii or regular upload + * It allows change upload mode during upload queue + * + * @private + * @param {number} partNumber + * @returns {Promise} + * @memberof S3Uploader + */ + private startPart(id: string, partNumber: number): Promise { + debug(`[${id}] Start processing part ${partNumber} with mode ${this.uploadMode}`); + + let payload = this.getPayloadById(id); + + payload.file.status = FileState.PROGRESS; + return (this.uploadMode !== UploadMode.INTELLIGENT ? this.uploadRegular : this.uploadIntelligent).apply(this, [id, partNumber]); + } + + /** + * Returns part data needed for upload + * + * @private + * @param {string} id - id of a currently uploading file + * @param {FilePart} part + * @returns + * @memberof S3Uploader + */ + private getS3PartMetadata(id: string, part: FilePart, offset?: number): Promise { + const url = this.getUploadUrl(id); + + debug(`[${id}] Get data for part ${part.partNumber}, url ${url}, Md5: ${part.md5}, Size: ${part.size}`); + + return postWithRetry( + `${url}/multipart/upload`, + { + ...this.getDefaultFields(id, ['apikey', 'uri', 'region', 'signature', 'policy', 'upload_id', 'fii']), + // method specific keys + part: part.partNumber + 1, + md5: part.md5, + size: part.size, + offset, + }, + { + headers: this.getDefaultHeaders(id), + cancelToken: this.cancelToken.token, + timeout: this.timeout, + }, + this.retryConfig + ).catch(err => { + this.setPayloadStatus(id, FileState.FAILED); + return Promise.reject(new FilestackError('Cannot get part metadata', err.data, FilestackErrorType.REQUEST)); + }); + } + + /** + * Regular multipart request to amazon + * + * @private + * @param {number} partNumber + * @returns {Promise} + * @memberof S3Uploader + */ + private async uploadRegular(id: string, partNumber: number): Promise { + let payload = this.getPayloadById(id); + const partMetadata = payload.parts[partNumber]; + let part = payload.file.getPartByMetadata(partMetadata); + + const { data, headers } = await this.getS3PartMetadata(id, part); + debug(`[${id}] Received part ${partNumber} info body: \n%O\n headers: \n%O\n`, data, headers); + + // retry only in regular upload mode + if (this.retryConfig && this.uploadMode !== UploadMode.FALLBACK) { + useRetryPolicy(request, this.retryConfig); + } + + return request + .put(data.url, part.buffer, { + cancelToken: this.cancelToken.token, + timeout: this.timeout, + headers: data.headers, + // for now we cant test progress callback from upload + /* istanbul ignore next */ + onUploadProgress: (pr: ProgressEvent) => this.onProgressUpdate(id, partNumber, pr.loaded), + }) + .then(res => { + if (res.headers.etag) { + this.setPartETag(id, partNumber, res.headers.etag); + } + + debug(`[${id}] S3 Upload response headers for ${partNumber}: \n%O\n`, res.headers); + + this.onProgressUpdate(id, partNumber, part.size); + + return res; + }) + .catch(err => { + // reset upload progress on failed part + this.onProgressUpdate(id, partNumber, 0); + + // if fallback, set upload mode to intelligent and restart current part + if ((this.uploadMode === UploadMode.FALLBACK && !this.isModeLocked) || this.uploadMode === UploadMode.INTELLIGENT) { + debug(`[${id}] Regular upload failed. Switching to intelligent ingestion mode`); + this.setUploadMode(UploadMode.INTELLIGENT); + // restart part + return this.startPart(id, partNumber); + } + + return Promise.reject(new FilestackError('Cannot upload file part', err.data, FilestackErrorType.REQUEST)); + }); + } + + /** + * Upload file using intelligent mechanism + * + * @private + * @param {string} id + * @param {number} partNumber + * @returns {Promise} + * @memberof S3Uploader + */ + private async uploadIntelligent(id: string, partNumber: number): Promise { + return this.uploadNextChunk(id, partNumber).then(() => this.commitPart(id, partNumber)); + } + + /** + * Recursively upload file in chunk mode (intelligent ingession) + * + * @private + * @param {string} id + * @param {number} partNumber + * @param {number} chunkSize + * @returns + * @memberof S3Uploader + */ + private async uploadNextChunk(id: string, partNumber: number, chunkSize: number = this.intelligentChunkSize) { + const payload = this.getPayloadById(id); + let part = payload.parts[partNumber]; + chunkSize = Math.min(chunkSize, part.size - part.offset); + + let chunk = payload.file.getChunkByMetadata(part, part.offset, chunkSize); + + debug( + `[${id}] PartNum: ${partNumber}, PartSize: ${part.size}, StartByte: ${part.startByte}, Offset: ${part.offset}, ChunkSize: ${chunk.size}, + Left: ${part.size - part.offset - chunk.size}` + ); + + // catch error for debug purposes + const { data } = await this.getS3PartMetadata(id, chunk, part.offset).catch(err => { + debug(`[${id}] Getting chunk data for ii failed %O, Chunk size: ${chunkSize}, offset ${part.offset}, part ${partNumber}`, err); + return Promise.reject(err); + }); + + return request + .put(data.url, chunk.buffer, { + cancelToken: this.cancelToken.token, + timeout: this.timeout, + headers: data.headers, + // for now we cant test progress callback from upload + /* istanbul ignore next */ + onUploadProgress: (pr: ProgressEvent) => this.onProgressUpdate(id, partNumber, part.offset + pr.loaded), + }) + .then(res => { + this.onProgressUpdate(id, partNumber, part.offset + chunk.size); + const newOffset = Math.min(part.offset + chunkSize, part.size); + + debug(`[${id}] S3 Chunk uploaded! offset: ${part.offset}, part ${partNumber}! response headers for ${partNumber}: \n%O\n`, res.headers); + + this.setPartData(id, partNumber, 'offset', newOffset); + + // if all chunks was uploaded then return resolve + if (newOffset === part.size) { + return Promise.resolve(res); + } + + return this.uploadNextChunk(id, partNumber, chunkSize); + }) + .catch(err => { + // reset progress on failed upload + this.onProgressUpdate(id, partNumber, part.offset); + const nextChunkSize = chunkSize / 2; + + if (nextChunkSize < MIN_CHUNK_SIZE) { + debug(`[${id}] Minimal chunk size limit. Upload file failed!`); + return Promise.reject(new FilestackError('Min chunk size reached', err.data, FilestackErrorType.REQUEST)); + } + + if (shouldRetry(err)) { + debug(`[${id}] Request network error. Retry with new chunk size: ${nextChunkSize}`); + return this.uploadNextChunk(id, partNumber, nextChunkSize); + } + + return Promise.reject(new FilestackError('Cannot upload file part', err.data, FilestackErrorType.REQUEST)); + }) + .finally(() => { + part = null; + chunk = null; + }); + } + + /** + * Commit after upload all chunks of the part in ii mode + * + * @private + * @param {string} id + * @param {FilePart} part + * @returns + * @memberof S3Uploader + */ + private commitPart(id: string, partNumber: number) { + const payload = this.getPayloadById(id); + const part = payload.parts[partNumber]; + + return postWithRetry( + `${this.getUploadUrl(id)}/multipart/commit`, + { + ...this.getDefaultFields(id, ['apikey', 'region', 'upload_id', 'policy', 'signature', 'uri']), + size: payload.file.size, + part: part.partNumber + 1, + }, + { + cancelToken: this.cancelToken.token, + timeout: this.timeout, + headers: this.getDefaultHeaders(id), + }, + this.retryConfig + ).then((res: AxiosResponse) => { + debug(`[${id}] Commit Part number ${part.partNumber}. Response: %O`, res.data); + + return res; + }); + } + + /** + * Complete request to merge all parts and get file handle etc + * + * @private + * @returns + * @memberof S3Uploader + */ + private completeRequest(id: string): Promise { + const payload = this.getPayloadById(id); + let parts = []; + + if (payload.file.status === FileState.FAILED) { + return Promise.resolve(); + } + + debug(`[${id}] Run complete request`); + + const partsHandle = payload.parts; + const partLen = partsHandle.length; + + for (let i = 0; i < partLen; i++) { + if (partsHandle[i].etag) { + parts.push({ part_number: i + 1, etag: partsHandle[i].etag }); + } + } + + debug(`[${id}] Etags %O`, parts); + + return postWithRetry( + `${this.getUrl()}/multipart/complete`, + { + ...this.getDefaultFields(id, ['apikey', 'policy', 'signature', 'uri', 'region', 'upload_id', 'fii'], true), + // method specific keys + filename: payload.file.name, + mimetype: payload.file.type, + size: payload.file.size, + parts: parts.length ? parts : undefined, + }, + { + timeout: this.timeout, + cancelToken: this.cancelToken.token, + headers: this.getDefaultHeaders(id), + }, + this.retryConfig + ) + .then(res => { + // if parts hasnt been merged, retry complete request again + if (res.status === 202) { + return new Promise((resolve, reject) => { + setTimeout( + () => + this.completeRequest(id) + .then(resolve) + .catch(reject), + COMPLETE_TIMEOUT + ); + }); + } + + // update file object + let file = this.getPayloadById(id).file; + file.handle = res.data.handle; + file.url = res.data.url; + file.container = res.data.container; + file.key = res.data.key; + file.workflows = res.data.workflows; + file.status = res.data.status; + + return file; + }) + .catch(err => { + this.setPayloadStatus(id, FileState.FAILED); + return Promise.reject(new FilestackError('Cannot complete file', err.data, FilestackErrorType.REQUEST)); + }); + } + + /** + * UUpgrade upload progress and run progress event + * + * @private + * @param {string} id + * @param {number} partNumber + * @param {number} loaded + * @memberof S3Uploader + */ + private onProgressUpdate(id: string, partNumber: number, loaded: number) { + this.setPartData(id, partNumber, 'progress', loaded); + this.emitProgress(); + } + + /** + * Emits normalized progress event + * + * @private + * @memberof S3Uploader + */ + private emitProgress() { + let totalSize = 0; + let totalBytes = 0; + + let filesProgress = {}; + for (let i in this.payloads) { + const payload = this.payloads[i]; + // omit all failed files in progress event + // this shouldn't happend because of promises rejection in execute. Left to be sure + /* istanbul ignore next */ + if (payload.file.status === FileState.FAILED) { + continue; + } + + const partsProgress = payload.parts.map(p => p.progress || 0); + const totalParts = partsProgress.reduce((a, b) => a + b); + + totalBytes = totalBytes + totalParts; + + filesProgress[i] = { + totalBytes: totalParts || 0, + totalPercent: Math.round((totalParts * 100) / payload.file.size) || 0, + }; + + totalSize = totalSize + payload.file.size; + } + + const res = { + totalBytes: totalBytes || 0, + totalPercent: Math.round((totalBytes * 100) / totalSize) || 0, + files: filesProgress, + }; + + debug(`Upload progress %O`, res); + this.emit('progress', res); + } + + /** + * Apply provided data to given payload + * + * @private + * @param {string} id + * @param {*} data + * @memberof S3Uploader + */ + private updatePayload(id: string, data: any) { + this.payloads[id] = { + ...this.payloads[id], + ...data, + }; + } + + /** + * Sets etag for part + * + * @private + * @param {number} partNumber + * @param {string} etag + * @memberof S3Uploader + */ + private setPartETag(id: string, partNumber: number, etag: string) { + debug(`[${id}] Set ${etag} etag for part ${partNumber}`); + this.getPayloadById(id).parts[partNumber].etag = etag; + } + + /** + * Sets part value for a key + * + * @private + * @param {number} partNumber + * @param {string} etag + * @memberof S3Uploader + */ + private setPartData(id: string, partNumber: number, key: string, value: any) { + debug(`[${id}] Set ${key} = ${value} for part ${partNumber}`); + this.getPayloadById(id).parts[partNumber][key] = value; + } + + /** + * Set payload file state + * + * @param id + * @param status + */ + private setPayloadStatus(id: string, status: FileState) { + debug(`[${id}] Set payload status to ${status}`); + this.payloads[id].file.status = status; + } +} diff --git a/src/lib/api/upload/utils.ts b/src/lib/api/upload/utils.ts deleted file mode 100644 index 5c82fcf3..00000000 --- a/src/lib/api/upload/utils.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2018 by Filestack. - * Some rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * - * @private - * @param file - * @param cfg - */ -export const getName = (file: any, cfg: any) => cfg.customName || file.name; diff --git a/src/lib/client.spec.ts b/src/lib/client.spec.ts index 34a48721..00a23fbc 100644 --- a/src/lib/client.spec.ts +++ b/src/lib/client.spec.ts @@ -14,16 +14,210 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import * as assert from 'assert'; +import { config } from './../config'; import { Client } from './client'; +import { CloudClient } from './api/cloud'; +import { Upload } from './api/upload/upload'; +import { picker } from './picker'; +import { preview } from './api/preview'; +import { metadata, remove, retrieve } from './api/file'; +import { storeURL } from './api/store'; +import { transform } from './api/transform'; + +jest.mock('./api/upload/upload'); +jest.mock('./api/cloud'); +jest.mock('./api/file'); +jest.mock('./api/store'); +jest.mock('./picker'); +jest.mock('./api/preview'); +jest.mock('./api/transform'); describe('client', () => { - it('should exist', () => { - assert.ok(new Client('apikey')); + const defaultApikey = 'EXAMPLE_API_KEY'; + const defaultHandle = 'EXAMPLE_HANDLE'; + const defaultSecurity = { + policy: 'examplePolicy', + signature: 'exampleSignature', + }; + + const sessionURls = config.urls; + const defaultSession = { + apikey: defaultApikey, + urls: sessionURls, + }; + + it('should properly instantiate Client', () => { + const client = new Client(defaultApikey); + expect(client).toBeDefined(); + expect(client).toBeInstanceOf(Client); }); - it('should throw exception when there is not api key provided', () => { - assert.throws(() => new Client('')); + it('should throw an error if api key not provided', () => { + expect(() => { + return new Client(''); + }).toThrow('An apikey is required to initialize the Filestack client'); + }); + + it('should throw an error if provided security without signature', () => { + const options = { + security: { + policy: 'examplePolicy', + signature: '', + }, + }; + expect(() => { + return new Client(defaultApikey, options); + }).toThrow('Both policy and signature are required for client security'); + }); + + it('should pass policy & signature to the session', () => { + const options = { + security: defaultSecurity, + }; + const client = new Client(defaultApikey, options); + expect(client.session.policy).toBe(options.security.policy); + expect(client.session.signature).toBe(options.security.signature); + }); + + it('should pass cname to the session', () => { + const options = { + cname: 'testCname.com', + }; + const client = new Client(defaultApikey, options); + expect(client.session.cname).toBe(options.cname); + }); + + it('should be able to logout for provied cloud', async () => { + const client = new Client(defaultApikey); + const cloudName = 'dropbox'; + await client.logout(cloudName); + + expect(CloudClient.prototype.logout).toHaveBeenCalledWith(cloudName); + }); + + it('should get metadata for a provided handle', async () => { + const client = new Client(defaultApikey); + const options = { + sha224: true, + }; + + await client.metadata(defaultHandle, options, defaultSecurity); + expect(metadata).toHaveBeenCalledWith(defaultSession, defaultHandle, options, defaultSecurity); + }); + + it('should be able to open picker', () => { + const client = new Client(defaultApikey); + const pickerOptions = { + lang: 'de', + }; + client.picker(pickerOptions); + + expect(picker).toHaveBeenCalledWith(client, pickerOptions); + }); + + it('should be able to open preview', () => { + const client = new Client(defaultApikey); + const previewOptions = { + id: 'testElement', + }; + client.preview(defaultHandle, previewOptions); + + expect(preview).toHaveBeenCalledWith(defaultSession, defaultHandle, previewOptions); + }); + + it('should be able to remove handle', async () => { + const client = new Client(defaultApikey); + await client.remove(defaultHandle, defaultSecurity); + expect(remove).toHaveBeenCalledWith(defaultSession, defaultHandle, false, defaultSecurity); + }); + + it('should be able to remove metadata', async () => { + const client = new Client(defaultApikey); + await client.removeMetadata(defaultHandle, defaultSecurity); + + expect(remove).toHaveBeenCalledWith(defaultSession, defaultHandle, true, defaultSecurity); + }); + + it('should be able to store url', async () => { + const client = new Client(defaultApikey); + const url = 'http://example.com/img3.jpg'; + const options = {}; + const token = {}; + await client.storeURL(url, options, token, defaultSecurity); + + expect(storeURL).toHaveBeenCalledWith(defaultSession, url, options, token, defaultSecurity); + }); + + it('should be able to retrieve handle', async () => { + const client = new Client(defaultApikey); + const retrieveOptions = {}; + + await client.retrieve(defaultHandle, retrieveOptions, defaultSecurity); + expect(retrieve).toHaveBeenCalledWith(defaultSession, defaultHandle, retrieveOptions, defaultSecurity); + }); + + it('should be able to transform url with b64', () => { + const client = new Client(defaultApikey); + const transformOptions = { + blur: { + amount: 5, + }, + }; + const b64 = true; + client.transform(defaultHandle, transformOptions, b64); + expect(transform).toHaveBeenCalledWith(defaultSession, defaultHandle, transformOptions, b64); + }); + + it('should be able to transform url without b64', () => { + const client = new Client(defaultApikey); + const transformOptions = { + blur: { + amount: 5, + }, + }; + client.transform(defaultHandle, transformOptions); + expect(transform).toHaveBeenCalledWith(defaultSession, defaultHandle, transformOptions, false); + }); + + it('should be able to upload file', async () => { + const client = new Client(defaultApikey); + const file = 'anyFile'; + const uploadOptions = {}; + const storeOptions = {}; + const token = {}; + + spyOn(Upload.prototype, 'upload').and.returnValue(Promise.resolve()); + + await client.upload(file, uploadOptions, storeOptions, token, defaultSecurity); + + expect(Upload.prototype.setSession).toHaveBeenCalledWith({ + apikey: defaultApikey, + urls: sessionURls, + }); + + expect(Upload.prototype.setToken).toHaveBeenCalledWith(token); + expect(Upload.prototype.setSecurity).toHaveBeenCalledWith(defaultSecurity); + expect(Upload.prototype.upload).toHaveBeenCalledWith(file); + }); + + it('should be able to multiupload file', async () => { + const client = new Client(defaultApikey); + const files = ['anyFile']; + const uploadOptions = {}; + const storeOptions = {}; + const token = {}; + + spyOn(Upload.prototype, 'multiupload').and.returnValue(Promise.resolve()); + + await client.multiupload(files, uploadOptions, storeOptions, token, defaultSecurity); + + expect(Upload.prototype.setSession).toHaveBeenCalledWith({ + apikey: defaultApikey, + urls: sessionURls, + }); + + expect(Upload.prototype.setToken).toHaveBeenCalledWith(token); + expect(Upload.prototype.setSecurity).toHaveBeenCalledWith(defaultSecurity); + expect(Upload.prototype.multiupload).toHaveBeenCalledWith(files); }); }); diff --git a/src/lib/client.ts b/src/lib/client.ts index d0f7d502..5c092fa8 100644 --- a/src/lib/client.ts +++ b/src/lib/client.ts @@ -15,14 +15,17 @@ * limitations under the License. */ +import * as EventEmitter from 'eventemitter3'; import { config, Hosts } from '../config'; import { metadata, MetadataOptions, remove, retrieve, RetrieveOptions } from './api/file'; import { transform, TransformOptions } from './api/transform'; import { storeURL } from './api/store'; -import { resolveHost } from './utils/index'; -import { upload, UploadOptions } from './api/upload'; +import { resolveHost } from './utils'; +import { Upload, InputFile, UploadOptions, StoreUploadOptions } from './api/upload'; import { preview, PreviewOptions } from './api/preview'; import { CloudClient } from './api/cloud'; +import { StoreParams } from './filelink'; + import { picker, PickerInstance, @@ -42,42 +45,6 @@ export interface Security { signature: string; } -export interface WorkflowConfig { - id: string; -} - -export interface StoreOptions { - /** - * Filename for stored file - */ - filename?: string; - /** - * Location for stored file. One of 's3', 'gcs', 'azure', 'rackspace', or 'dropbox'. - */ - location?: string; - /** - * Set container path. - */ - path?: string; - /** - * Specify S3 region. - */ - region?: string; - /** - * Specify storage container. - */ - container?: string; - /** - * S3 container access. 'public' or 'private'. - */ - access?: string; - - /** - * Workflows ids to run after upload - */ - workflows?: (string | WorkflowConfig)[]; -} - export interface ClientOptions { [option: string]: any; /** @@ -117,37 +84,62 @@ export interface ClientOptions { * const client = filestack.init('apikey'); * ``` */ -export class Client { +export class Client extends EventEmitter { session: Session; private cloud: CloudClient; constructor(apikey: string, options?: ClientOptions) { + super(); + if (!apikey || typeof apikey !== 'string' || apikey.length === 0) { throw new Error('An apikey is required to initialize the Filestack client'); } const { urls } = config; this.session = { apikey, urls }; + if (options) { const { cname, security } = options; - if (security && !(security.policy && security.signature)) { - throw new Error('Both policy and signature are required for client security'); - } - if (security && security.policy && security.signature) { - this.session.policy = security.policy; - this.session.signature = security.signature; - } - if (cname) { - this.session.urls = resolveHost(this.session.urls, cname); - const hosts = /filestackapi.com|filestackcontent.com/i; - this.session.cname = cname; - Object.keys(urls).forEach((key) => { - this.session.urls[key] = urls[key].replace(hosts, cname); - }); - } + + this.setSecurity(security); + this.setCname(cname); } this.cloud = new CloudClient(this.session, options); } + + /** + * Set security object + * + * @param {Security} security + * @memberof Client + */ + setSecurity(security: Security) { + if (security && !(security.policy && security.signature)) { + throw new Error('Both policy and signature are required for client security'); + } + + if (security && security.policy && security.signature) { + this.session.policy = security.policy; + this.session.signature = security.signature; + } + } + + /** + * Set custom cname + * + * @param {string} cname + * @returns + * @memberof Client + */ + setCname(cname: string) { + if (!cname || cname.length === 0) { + return; + } + + this.session.cname = cname; + this.session.urls = resolveHost(this.session.urls, cname); + } + /** * Clear all current cloud sessions in the picker. * Optionally pass a cloud source name to only log out of that cloud source. @@ -272,7 +264,7 @@ export class Client { * @param token Optional control token to call .cancel() * @param security Optional security override. */ - storeURL(url: string, options?: StoreOptions, token?: any, security?: Security): Promise { + storeURL(url: string, options?: StoreParams, token?: any, security?: Security): Promise { /* istanbul ignore next */ return storeURL(this.session, url, options, token, security); } @@ -363,11 +355,14 @@ export class Client { * client.upload(file, { onRetry }, { filename: 'foobar.jpg' }, token) * .then(res => console.log(res)); * + * client.upload({file, name}, { onRetry }, { filename: 'foobar.jpg' }, token) + * .then(res => console.log(res)); + * * token.pause(); // Pause flow * token.resume(); // Resume flow * token.cancel(); // Cancel flow (rejects) * ``` - * @param file Must be a valid [File](https://developer.mozilla.org/en-US/docs/Web/API/File), Blob, base64 encoded string, or file path in Node. + * @param file Must be a valid [File | Blob | Buffer | string] * @param uploadOptions Uploader options. * @param storeOptions Storage options. * @param token A control token that can be used to call cancel(), pause(), and resume(). @@ -375,8 +370,74 @@ export class Client { * * @returns {Promise} */ - upload(file: any, options?: UploadOptions, storeOptions?: StoreOptions, token?: any, security?: Security) { - /* istanbul ignore next */ - return upload(this.session, file, options, storeOptions, token, security); + upload(file: InputFile, options?: UploadOptions, storeOptions?: StoreUploadOptions, token?: any, security?: Security) { + let upload = new Upload(options, storeOptions); + upload.setSession(this.session); + + if (token) { + upload.setToken(token); + } + + if (security) { + upload.setSecurity(security); + } + + upload.on('error', (e) => this.emit('uploadError', e)); + + return upload.upload(file).finally(() => { + upload = null; + }); + } + + /** + * Initiates a multi-part upload flow. Use this for Filestack CIN and FII uploads. + * + * In Node runtimes the file argument is treated as a file path. + * Uploading from a Node buffer is not yet implemented. + * + * ### Example + * + * ```js + * const token = {}; + * const onRetry = (obj) => { + * console.log(`Retrying ${obj.location} for ${obj.filename}. Attempt ${obj.attempt} of 10.`); + * }; + * + * client.multiupload([file], { onRetry }, token) + * .then(res => console.log(res)); + * + * client.multiupload([{file, name}], { onRetry }, token) + * .then(res => console.log(res)); + * + * token.pause(); // Pause flow + * token.resume(); // Resume flow + * token.cancel(); // Cancel flow (rejects) + * ``` + * @param file Must be a valid [File | Blob | Buffer | string (base64)] + * @param uploadOptions Upload options. + * @param storeOptions Storage options. + * @param token A control token that can be used to call cancel(), pause(), and resume(). + * @param security Optional security policy and signature override. + * + * @returns {Promise} + */ + multiupload(file: InputFile[], options?: UploadOptions, storeOptions?: StoreUploadOptions, token?: any, security?: Security) { + let upload = new Upload(options, storeOptions); + + upload.setSession(this.session); + + if (token) { + upload.setToken(token); + } + + if (security) { + upload.setSecurity(security); + } + + upload.on('error', (e) => this.emit('uploadError', e)); + + return upload.multiupload(file).finally(() => { + upload = null; + }); } } diff --git a/src/lib/filelink.spec.ts b/src/lib/filelink.spec.ts new file mode 100644 index 00000000..1396c992 --- /dev/null +++ b/src/lib/filelink.spec.ts @@ -0,0 +1,517 @@ +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the 'License'); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an 'AS IS' BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Filelink, ShapeType, VideoAccessMode } from './filelink'; +import { TransformSchema } from './../schema/transforms.schema'; +import * as validator from '../schema'; + +describe('filelink', () => { + + beforeAll(() => { + spyOn(validator, 'getValidator').and.callThrough(); + }); + + const defaultSource = '5aYkEQJSQCmYShsoCnZN'; + const defaultApikey = 'DEFAULT_API_KEY'; + + it('should properly instantiate Filelink', () => { + const filelink = new Filelink(defaultSource); + expect(filelink).toBeDefined(); + expect(filelink).toBeInstanceOf(Filelink); + }); + + it('should throw an error when handle is invalid', () => { + const source = '*/5aYkEQJSQCmYShsoCnZN'; + expect(() => { + const f = new Filelink(source); + }).toThrow('Invalid filestack source provided'); + }); + + it('should throw an error when external handle and without apikey', () => { + const source = 'src://test123/example.jpg'; + + expect(() => { + const filelink = new Filelink(source); + }).toThrow('External sources requires apikey to handle transforms'); + }); + + it('should be able to convert filelink to string', () => { + const filelink = new Filelink(defaultSource); + const result = filelink.toString(); + expect(result).toBe('https://cdn.filestackcontent.com/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should allow to set validator status with toString method', () => { + const filelink = new Filelink(defaultSource); + filelink.setUseValidator(false); + + expect(filelink.resize({ + // @ts-ignore + t: 1, + }).toString()).toEqual('https://cdn.filestackcontent.com/resize=t:1/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should allow to set validator status with getTransformations method', () => { + const filelink = new Filelink(defaultSource); + filelink.setUseValidator(false); + filelink.resize({ + // @ts-ignore + t: 1, + }); + + expect(filelink.getTransformations()).toEqual([{ + name: 'resize', + params: { t: 1 }, + }]); + }); + + it('should create filelink with apikey when is provided', () => { + const filelink = new Filelink(defaultSource, defaultApikey); + const result = filelink.toString(); + expect(result).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to use many tasks at once and reset them', () => { + const filelink = new Filelink(defaultSource); + const resizeParams = { + width: 200, + }; + const rotateParams = { + deg: 90, + }; + filelink + .resize(resizeParams) + .rotate(rotateParams) + .crop({ + dim: [20, 20, 250, 250], + }); + expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/resize=width:200/rotate=deg:90/crop=dim:[20,20,250,250]/5aYkEQJSQCmYShsoCnZN'); + filelink.reset(); + expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to get transformations', () => { + const filelink = new Filelink(defaultSource); + const resizeParams = { + width: 200, + }; + const rotateParams = { + deg: 90, + }; + filelink + .resize(resizeParams) + .rotate(rotateParams) + .crop({ + dim: [20, 20, 250, 250], + }); + const expected = [{ name: 'resize', params: { width: 200 } }, { name: 'rotate', params: { deg: 90 } }, { name: 'crop', params: { dim: [20, 20, 250, 250] } }]; + expect(filelink.getTransformations()).toEqual(expected); + }); + + it('should be able to getValidationSchema', () => { + const filelink = new Filelink(defaultSource); + const result = filelink.getValidationSchema(); + expect(result).toEqual(TransformSchema); + }); + + it('should be able to disable selected task', () => { + const filelink = new Filelink(defaultSource); + filelink.shadow(false).upscale(); + expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/upscale/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to create filelink for many handles', () => { + const sourceArr = ['5aYkEQJSQCmYShsoCnZN', '4aYkEQJSQCmYShsoCnZN']; + const filelink = new Filelink(sourceArr); + expect(filelink.toString()).toEqual('https://cdn.filestackcontent.com/[5aYkEQJSQCmYShsoCnZN,4aYkEQJSQCmYShsoCnZN]'); + filelink.setBase64(true); + expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/b64://WzVhWWtFUUpTUUNtWVNoc29DblpOLDRhWWtFUUpTUUNtWVNoc29DblpOXQ=='); + }); + + it('should be able to create filelink for many src handles', () => { + const sourceArr = ['src://test123/example.jpg', 'src://test123/flug_9-trans_atlantik-400dpi.jpg']; + const filelink = new Filelink(sourceArr, defaultApikey); + expect(filelink.toString()).toEqual('https://cdn.filestackcontent.com/DEFAULT_API_KEY/["src://test123/example.jpg","src://test123/flug_9-trans_atlantik-400dpi.jpg"]'); + }); + + it('should throw an error if task params are not valid', () => { + const filelink = new Filelink(defaultSource); + expect(() => { + // @ts-ignore + filelink.resize({ r: 2 }).toString(); + }).toThrow('Params validation error'); + }); + + it('should omit transformations with empty options', () => { + const filelink = new Filelink(defaultSource); + filelink.upscale(false); + expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should throw an error if source does not exists', () => { + expect(() => { + return new Filelink(''); + }).toThrow('Source not Set'); + }); + + describe('Different tasks', () => { + let filelink = new Filelink(defaultSource, defaultApikey); + afterEach(() => { + filelink = new Filelink(defaultSource, defaultApikey); + }); + + it('should be able to create filelink when handle is base64', () => { + filelink.upscale(); + filelink.setBase64(true); + expect(filelink.toString()).toBe('https://cdn.filestackcontent.com/DEFAULT_API_KEY/b64/W3sibmFtZSI6InVwc2NhbGUifV0=/b64://NWFZa0VRSlNRQ21ZU2hzb0NuWk4='); + }); + + it('should be able to use custom cname', () => { + const cname = 'newcname.com'; + filelink.setCname(cname); + expect(filelink.toString()).toBe('https://cdn.newcname.com/DEFAULT_API_KEY/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to use custom domain', () => { + const customDomain = 'https://customDomain.com'; + filelink.setCustomDomain(customDomain); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to add flip', () => { + filelink.flip(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/flip/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to add flop', () => { + filelink.flop(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/flop/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to enhance', () => { + filelink.enhance(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/enhance/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to redeye', () => { + filelink.redeye(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/redeye/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to monochrome', () => { + filelink.monochrome(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/monochrome/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to negative', () => { + filelink.negative(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/negative/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to tags', () => { + filelink.tags(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/tags/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to sfw', () => { + filelink.sfw(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/sfw/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to store', () => { + const storeParams = {}; + filelink.store(storeParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/store/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to disable cache', () => { + filelink.cache(false); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/cache=false/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to set cache params', () => { + const cacheParams = { + expiry: 666, + }; + filelink.cache(cacheParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/cache=expiry:666/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to resize', () => { + const resizeParams = { + width: 200, + }; + filelink.resize(resizeParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/resize=width:200/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to crop', () => { + filelink.crop({ + dim: [20, 20, 250, 250], + }); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/crop=dim:[20,20,250,250]/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to rotate', () => { + const rotateParams = { + deg: 90, + }; + filelink.rotate(rotateParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/rotate=deg:90/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to detect faces', () => { + filelink.detectFaces({}); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/detect_faces/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to crop faces', () => { + filelink.cropFaces({}); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/crop_faces/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to pixelate faces', () => { + filelink.pixelateFaces({}); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/pixelate_faces/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to blur faces', () => { + const blurFacesParams = { + amount: 3, + blur: 5, + type: ShapeType.oval, + }; + filelink.blurFaces(blurFacesParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/blur_faces=amount:3,blur:5,type:oval/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to round cornerns', () => { + const roundedCornersParams = { + radius: 50, + blur: 5, + }; + filelink.roundedCorners(roundedCornersParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/rounded_corners=radius:50,blur:5/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to polaroid', () => { + const polaroidParams = { + color: 'ff0000', + rotate: 50, + }; + filelink.polaroid(polaroidParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/polaroid=color:ff0000,rotate:50/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to vignette', () => { + const vignetteParams = { + background: 'ff0000', + amount: 5, + }; + filelink.vignette(vignetteParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/vignette=background:ff0000,amount:5/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to tornEdges', () => { + filelink.tornEdges({}); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/torn_edges/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to shadow', () => { + filelink.shadow(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/shadow/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to circle', () => { + filelink.circle({}); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/circle/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to border', () => { + filelink.border(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/border/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to vignette', () => { + filelink.vignette({}); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/vignette/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to sharpen', () => { + const sharpenParams = { + amount: 5, + }; + filelink.sharpen(sharpenParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/sharpen=amount:5/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to blur', () => { + const blurParams = { + amount: 5, + }; + filelink.blur(blurParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/blur=amount:5/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to blackwhite', () => { + const blackwhiteParams = { + threshold: 50, + }; + filelink.blackwhite(blackwhiteParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/blackwhite=threshold:50/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to sepia', () => { + filelink.sepia(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/sepia/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to pixelate', () => { + filelink.pixelate(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/pixelate/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to oilPaint', () => { + filelink.oilPaint(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/oil_paint/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to modulate', () => { + filelink.modulate(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/modulate/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to partialPixelate', () => { + filelink.partialPixelate({ + objects: [[20, 20, 50, 50]], + }); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/partial_pixelate=objects:[[20,20,50,50]]/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to partialBlur', () => { + filelink.partialBlur({ + amount: 5, + objects: [[20, 20, 50, 50]], + }); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/partial_blur=amount:5,objects:[[20,20,50,50]]/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to collage', () => { + filelink.collage({ + files: ['http://welcome-swiss.com/wp-content/uploads/2015/12/Swiss-landscape.jpg'], + width: 200, + height: 200, + }); + + expect(filelink.toString()).toBe( + 'https://customDomain.com/DEFAULT_API_KEY/collage=files:["http://welcome-swiss.com/wp-content/uploads/2015/12/Swiss-landscape.jpg"],width:200,height:200/5aYkEQJSQCmYShsoCnZN' + ); + }); + + it('should be able to upscale', () => { + filelink.upscale(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/upscale/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to ascii', () => { + filelink.ascii(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/ascii/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to quality', () => { + const qualityParams = { + value: 5, + }; + filelink.quality(qualityParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/quality=value:5/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to use security', () => { + const securityParams = { + policy: 'examplePolicy', + signature: 'exampleSignature', + }; + filelink.security(securityParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/security=policy:examplePolicy,signature:exampleSignature/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able output', () => { + const outputParams = { + format: 'png', + }; + filelink.output(outputParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/output=format:png/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to videoConvert', () => { + const videoConvertParams = { + aspect_mode: VideoAccessMode.letterbox, + upscale: true, + }; + filelink.videoConvert(videoConvertParams); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/video_convert=aspect_mode:letterbox,upscale:true/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to URLScreenshot', () => { + filelink.URLScreenshot(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/urlscreenshot/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to PDFInfo', () => { + filelink.PDFInfo(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/pdfinfo/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to PDFConvert', () => { + filelink.PDFConvert(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/pdfconvert/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to force cache', () => { + filelink.cache(true); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/cache/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to add fallback transformation', () => { + filelink.fallback({ + handle: 'http:test.com', + }); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/fallback=handle:http:test.com/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to add zip trnasformation', () => { + filelink.zip(); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/zip/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to add minify js transformation', () => { + filelink.minifyJs({ + mangle: true, + gzip: true, + }); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/minify_js=mangle:true,gzip:true/5aYkEQJSQCmYShsoCnZN'); + }); + + it('should be able to add minify css transformation', () => { + filelink.minifyCss({ + level: 1, + gzip: true, + }); + expect(filelink.toString()).toBe('https://customDomain.com/DEFAULT_API_KEY/minify_css=level:1,gzip:true/5aYkEQJSQCmYShsoCnZN'); + }); + }); +}); diff --git a/src/lib/filelink.ts b/src/lib/filelink.ts index fb978c68..44a2cc1a 100644 --- a/src/lib/filelink.ts +++ b/src/lib/filelink.ts @@ -18,9 +18,11 @@ import { config } from './../config'; import { TransformSchema } from './../schema/transforms.schema'; import { getValidator } from './../schema/validator'; -import { resolveHost } from './utils'; -import { FilestackError } from './../FilestackError'; +import { resolveHost, b64 } from './utils'; +import { FilestackError, FilestackErrorType } from './../filestack_error'; +import Debug from 'debug'; +const debug = Debug('fs:filelink'); /** * Align enum */ @@ -163,21 +165,24 @@ export enum VideoAccessMode { crop = 'crop', } +export interface StoreBaseParams { + location?: string; + path?: string; + container?: string; + region?: string; + access?: string; +} + /** * Available options for store transformations * * @export * @interface StoreParams */ -export interface StoreParams { +export type StoreParams = StoreBaseParams & { filename?: string; - localion?: string; - path?: string; - container?: string; - region?: string; - access?: string; base64decode?: boolean; -} +}; export interface ResizeParams { width?: number; @@ -422,7 +427,7 @@ export interface PdfConvertParams { export interface FallbackParams { handle: string; - cache: number; + cache?: number; } export interface MinifyCssParams { @@ -540,6 +545,8 @@ export class Filelink { this.source = source; const isExternal = this.isSourceExternal(); + debug(`Source ${source} - isExternal? ${isExternal}`); + if (isExternal && !apikey) { throw new FilestackError('External sources requires apikey to handle transforms'); } @@ -646,13 +653,14 @@ export class Filelink { if (this.b64) { if (this.transforms.length > 0) { - transformsString = `b64/${btoa(JSON.stringify(this.transforms))}`; + transformsString = `b64/${b64(JSON.stringify(this.transforms))}`; } if (Array.isArray(source)) { source = this.arrayToString(source); } - source = `b64://${btoa(source)}`; + + source = `b64://${b64(source)}`; } else { if (Array.isArray(source)) { source = this.arrayToString(source); @@ -678,6 +686,8 @@ export class Filelink { * @memberof Filelink */ addTask(name: string, params?) { + Debug(`Add task ${name} with params %O`, params); + if (name !== 'cache' && typeof params === 'boolean') { if (!params) { return this; @@ -1274,6 +1284,7 @@ export class Filelink { let toTest = Array.isArray(this.source) ? this.source : [this.source]; for (let i in toTest) { + /* istanbul ignore next */ if (!toTest.hasOwnProperty(i)) { continue; } @@ -1295,11 +1306,11 @@ export class Filelink { * @memberof Filelink */ private validateTasks(transformations: object[]): void { - const transformationsObj = this.arrayToObject(transformations, 'name', 'params'); - const res = Filelink.validator(transformationsObj); + const res = Filelink.validator(this.arrayToObject(transformations, 'name', 'params')); if (res.errors.length) { - throw new FilestackError(`Params validation error: ${JSON.stringify(transformations)}`, res.errors); + throw new FilestackError(`Params validation error`, res.errors, FilestackErrorType.VALIDATION); } + return; } @@ -1353,17 +1364,10 @@ export class Filelink { return key; } - if (typeof values === 'object' && !Object.keys(values).length) { - return key; - } - // if we just want to enable feature if (typeof values === 'boolean') { - if (!values) { - if (key === 'cache') { - return 'cache=false'; - } - return ''; + if (!values && key === 'cache') { + return 'cache=false'; } return key; @@ -1394,7 +1398,7 @@ export class Filelink { return value; } - if (value.indexOf('/') > -1) { + if (value.indexOf('/') > -1 || value.indexOf(',') > -1) { return `"${value}"`; } diff --git a/src/lib/picker.spec.ts b/src/lib/picker.spec.ts new file mode 100644 index 00000000..67411acc --- /dev/null +++ b/src/lib/picker.spec.ts @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { picker } from './picker'; +import * as filestack from './../index'; + +const mockPickerOpen = jest.fn(() => Promise.resolve()); + +const mockPickerCrop = jest.fn(() => Promise.resolve()); +const mockPickerClose = jest.fn(() => Promise.resolve()); +const mockPickerCancel = jest.fn(() => Promise.resolve()); + +jest.mock('filestack-loader', () => { + return { + loadModule: jest.fn(() => { + return new Promise((resolve) => { + resolve(jest.fn().mockImplementation(() => { + return { + open: mockPickerOpen, + crop: mockPickerCrop, + close: mockPickerClose, + cancel: mockPickerCancel, + }; + })); + }); + }), + knownModuleIds: { + picker: '__filestack-picker-module', + }, + }; +}); + +let pickerInstance; +let client; + +describe('picker', () => { + beforeAll(() => { + const defaultApikey = 'DEFAULT_API_KEY'; + client = filestack.init(defaultApikey); + }); + + beforeEach(() => { + pickerInstance = picker(client, {}); + }); + + it('should properly open picker', async () => { + await pickerInstance.open(); + expect(mockPickerOpen).toHaveBeenCalledTimes(1); + }); + + it('should properly crop picker', async () => { + const files = ['file1.txt', 'file2.txt']; + + await pickerInstance.crop(files); + expect.assertions(2); + expect(mockPickerCrop).toHaveBeenCalledTimes(1); + expect(mockPickerCrop).toHaveBeenCalledWith(files); + }); + + it('should properly close picker', async () => { + await pickerInstance.close(); + expect(mockPickerClose).toHaveBeenCalledTimes(1); + }); + + it('should properly cancel picker', async () => { + await pickerInstance.cancel(); + expect(mockPickerCancel).toHaveBeenCalledTimes(1); + }); + + it('should not throw error on correct params', () => { + return expect(() => picker(client, { + onOpen: () => { + console.log(123); + }, + customText: { + Upload: 'customUpload', + }, + uploadConfig: { + partSize: 6 * 1024 * 1024, + }, + storeTo: { + container: 'test', + }, + })).not.toThrowError('Invalid picker params'); + }); + + it('should throw error on invalid options', () => { + return expect(() => picker(client, { + // @ts-ignore + onOpen: 'test', + customText: { + Upload: 'customUpload', + // @ts-ignore + asd: {}, + }, + })).toThrowError('Invalid picker params'); + }); +}); diff --git a/src/lib/picker.ts b/src/lib/picker.ts index 1af048f3..ef93ca93 100644 --- a/src/lib/picker.ts +++ b/src/lib/picker.ts @@ -16,8 +16,10 @@ */ import { loadModule, knownModuleIds } from 'filestack-loader'; -import { Client, WorkflowConfig } from './client'; -import { FSProgressEvent, UploadOptions } from './api/upload/types'; +import { FilestackError, FilestackErrorType } from './../filestack_error'; +import { Client } from './client'; +import { FSProgressEvent, UploadOptions, WorkflowConfig } from './api/upload/types'; +import { getValidator, PickerParamsSchema } from './../schema'; export interface PickerInstance { /** @@ -261,88 +263,89 @@ export interface PickerStoreOptions { export interface PickerCustomText { // Actions - Upload: string; - 'Deselect All': string; - 'View/Edit Selected': string; - 'Sign Out': string; + Upload?: string; + 'Deselect All'?: string; + 'View/Edit Selected'?: string; + 'Sign Out'?: string; // Source Labels - 'My Device': string; - 'Web Search': string; - 'Take Photo': string; - 'Link (URL)': string; - 'Record Video': string; - 'Record Audio': string; + 'My Device'?: string; + 'Web Search'?: string; + 'Take Photo'?: string; + 'Link (URL)'?: string; + 'Record Video'?: string; + 'Record Audio'?: string; // Custom Source - 'Custom Source': string; + 'Custom Source'?: string; // Footer Text - Add: string; - 'more file': string; - 'more files': string; + Add?: string; + 'more file'?: string; + 'more files'?: string; // Cloud - Connect: string; - 'Select Files from': string; - 'You need to authenticate with ': string; - 'A new page will open to connect your account.': string; - 'We only extract images and never modify or delete them.': string; + Connect?: string; + 'Select Files from'?: string; + 'You need to authenticate with '?: string; + 'A new page will open to connect your account.'?: string; + 'We only extract images and never modify or delete them.'?: string; // Summary - Files: string; - Images: string; - Uploaded: string; - Uploading: string; - Completed: string; - Filter: string; - 'Cropped Images': string; - 'Edited Images': string; - 'Selected Files': string; - 'Crop is required on images': string; + Files?: string; + Images?: string; + Uploaded?: string; + Uploading?: string; + Completed?: string; + Filter?: string; + 'Cropped Images'?: string; + 'Edited Images'?: string; + 'Selected Files'?: string; + 'Crop is required on images'?: string; // Transform - Crop: string; - Circle: string; - Rotate: string; - Mask: string; - Revert: string; - Edit: string; - Reset: string; - Done: string; - Save: string; - Next: string; - 'Edit Image': string; - 'This image cannot be edited': string; + Crop?: string; + Circle?: string; + Rotate?: string; + Mask?: string; + Revert?: string; + Edit?: string; + Reset?: string; + Done?: string; + Save?: string; + Next?: string; + 'Edit Image'?: string; + 'This image cannot be edited'?: string; // Retry messaging - 'Connection Lost': string; - 'Failed While Uploading': string; - 'Retrying in': string; - 'Try again': string; - 'Try now': string; + 'Connection Lost'?: string; + 'Failed While Uploading'?: string; + 'Retrying in'?: string; + 'Try again'?: string; + 'Try now'?: string; // Local File Source - 'or Drag and Drop, Copy and Paste Files': string; - 'Select Files to Upload': string; - 'Select From': string; - 'Drop your files anywhere': string; + 'or Drag and Drop, Copy and Paste Files'?: string; + 'Select Files to Upload'?: string; + 'Select From'?: string; + 'Drop your files anywhere'?: string; // Input placeholders - 'Enter a URL': string; - 'Search images': string; + 'Enter a URL'?: string; + 'Search images'?: string; // Webcam Source - 'Webcam Disabled': string; - 'Webcam Not Supported': string; - 'Please enable your webcam to take a photo.': string; - 'Your current browser does not support webcam functionality.': string; - 'We suggest using Chrome or Firefox.': string; + 'Webcam Disabled'?: string; + 'Webcam Not Supported'?: string; + 'Please enable your webcam to take a photo.'?: string; + 'Your current browser does not support webcam functionality.'?: string; + 'We suggest using Chrome or Firefox.'?: string; // Error Notifications - 'File {displayName} is not an accepted file type. The accepted file types are {types}': string; - 'File {displayName} is too big. The accepted file size is less than {roundFileSize}': string; - 'Our file upload limit is {maxFiles} {filesText}': string; + 'File {displayName} is not an accepted file type. The accepted file types are {types}'?: string; + 'File {displayName} is too big. The accepted file size is less than {roundFileSize}'?: string; + 'Our file upload limit is {maxFiles} {filesText}'?: string; + 'No search results found for "{search}"'?: string; } export interface PickerOptions { @@ -513,6 +516,11 @@ export interface PickerOptions { * Restrict selected files to a maximum number of bytes. (e.g. 10 \* 1024 \* 1024 for 10MB limit). */ maxSize?: number; + + /** + * Default view type option for file browser + */ + viewType?: 'grid' | 'list'; /** * Specify [width, height] in pixels of the desktop modal. */ @@ -591,10 +599,6 @@ export interface PickerOptions { * Called when all files have been uploaded. */ onUploadDone?: PickerUploadDoneCallback; - /** - * For cloud sources whether to link or store files. Defaults to `false`. - */ - preferLinkOverStore?: boolean; /** * Define a unique id for the application mount point. @@ -656,6 +660,11 @@ export interface PickerTransformationOptions { * Enable image rotation. Defaults to `true`. */ rotate?: boolean; + + /** + * Global force crop option. Can be use ie with circle + */ + force?: boolean; } /** @@ -669,6 +678,11 @@ class PickerLoader { private _initialized: Promise; constructor(client: Client, options?: PickerOptions) { + const validateRes = getValidator(PickerParamsSchema)(options); + if (validateRes.errors.length) { + throw new FilestackError(`Invalid picker params`, validateRes.errors, FilestackErrorType.VALIDATION); + } + this._initialized = this.loadModule(client, options); } diff --git a/src/lib/utils/index.spec.browser.ts b/src/lib/utils/index.spec.browser.ts new file mode 100644 index 00000000..2760d9d5 --- /dev/null +++ b/src/lib/utils/index.spec.browser.ts @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2019 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import * as utils from './index'; + +describe('utils:index', () => { + beforeAll(() => { + spyOn(utils, 'isNode').and.returnValue(false); + }); + + describe('md5', () => { + it('should return correct md5 value', () => { + expect(utils.md5(Buffer.from('test'))).toEqual('CY9rzUYh03PK3k6DJie09g=='); + }); + }); + + describe('b64', () => { + it('should return correct b65 value', () => { + expect(utils.b64('testtext')).toEqual('dGVzdHRleHQ='); + }); + }); + + describe('requireNode', () => { + it('should require node package', () => { + expect(utils.requireNode('crypto')).toBeFalsy(); + }); + }); +}); diff --git a/src/lib/utils/index.spec.ts b/src/lib/utils/index.spec.ts index b73d4014..4733b8e5 100644 --- a/src/lib/utils/index.spec.ts +++ b/src/lib/utils/index.spec.ts @@ -1,10 +1,7 @@ /* - * Copyright (c) 2018 by Filestack. + * Copyright (c) 2019 by Filestack. * Some rights reserved. * - * Original implementation of throat by Forbes Lindesay - * https://github.com/ForbesLindesay/throat - * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at @@ -17,58 +14,154 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { resolveCdnUrl, resolveHost, removeEmpty, uniqueTime, uniqueId, md5, sanitizeName, filterObject, b64, requireNode } from './index'; +import { config } from '../../config'; + +describe('utils:index', () => { + describe('resolveCdnUrl', () => { -import * as assert from 'assert'; -import * as t from 'tcomb-validation'; -import { checkOptions, removeEmpty, resolveCdnUrl } from './index'; -declare var ENV: any; + const session = { + apikey: 'TEST_API_KEY', + cname: 'example.com', + urls: config.urls, + }; -const session = ENV.session; + it('should properly resolve cdn url with hashed handle', () => { + const handle = '5aYkEQJSQCmYShsoCnZN'; + const result = resolveCdnUrl(session, handle); + expect(result).toEqual('https://cdn.filestackcontent.com'); + }); -describe('resolveCdnUrl', () => { + it('should properly resolve cdn url with src handle', () => { + const handle = 'src://test123/test.jpg'; + const result = resolveCdnUrl(session, handle); + expect(result).toEqual('https://cdn.filestackcontent.com/TEST_API_KEY'); + }); - it('should throw exception when using http or src handle and there is no apiKey', () => { - const sessionClone = JSON.parse(JSON.stringify(session)); - delete sessionClone.apikey; + it('should properly resolve cdn url with hashed handle', () => { + const handle = 'https://static1.squarespace.com/static/544eb3cce4b0ef091773611f/t/59ba7ce1bd10f00dcdc80a5f/1505394087367/DSC_0527.jpg'; + const result = resolveCdnUrl(session, handle); + expect(result).toEqual('https://cdn.filestackcontent.com/TEST_API_KEY'); + }); - assert.throws(() => resolveCdnUrl(sessionClone, 'http://test.com')); - assert.throws(() => resolveCdnUrl(sessionClone, 'src://test.com')); + it('should throw an error when using src handle or url without apikey', () => { + const handle = 'src://test123/test.jpg'; + session.apikey = ''; + expect(() => { resolveCdnUrl(session, handle); }).toThrow('Api key is required when storage alias is provided'); + }); }); -}); -describe('checkOptions', () => { - it('should throw exception when wrong option is provided', () => { - const allowed = [ - { name: 'test', type: t.Boolean }, - ]; + describe('resolveHost', () => { + const hosts = config.urls; - const options = { - notAllowed: 123, + const checkHosts = (hosts, expected) => { + Object.keys(hosts).forEach((k) => { + expect(hosts[k].indexOf(expected) > -1).toBeTruthy(); + }); }; - assert.throws(() => checkOptions('retrieveOptions', allowed, options)); + it('should return proper host', () => { + const cname = 'example.com'; + const result = resolveHost(hosts, cname); + checkHosts(result, cname); + }); + + it('should return hosts when cname is an empty string', () => { + const cname = ''; + const result = resolveHost(hosts, cname); + checkHosts(result, cname); + }); + }); + + describe('removeEmpty', () => { + it('should remove empty options from an object', () => { + const testOb = { test1: true, test2: undefined, test3: false }; + expect(removeEmpty(testOb)).toEqual({ test1: true, test3: false }); + }); }); - it('should throw exception when wrong option value is provided', () => { - const allowed = [ - { name: 'test', type: t.Boolean }, - ]; + describe('uniqueTime', () => { + it('should return unique times', () => { + expect(uniqueTime()).not.toEqual(uniqueTime()); + }); + }); - const options = { - test: 123, - }; + describe('uniqueId', () => { + it('should get different ids each time', () => { + expect(uniqueId()).not.toEqual(uniqueId()); + }); - assert.throws(() => checkOptions('retrieveOptions', allowed, options)); + it('should return id with given length', () => { + expect(uniqueId(12).length).toEqual(12); + expect(uniqueId(4).length).toEqual(4); + }); }); -}); -describe('removeEmpty', () => { - it('should remove empty values from object', () => { - const testObj = { - test: 123, - empty: null, - }; + describe('md5', () => { + it('should return correct md5 value', () => { + expect(md5(Buffer.from('test'))).toEqual('CY9rzUYh03PK3k6DJie09g=='); + }); + }); + + describe('b64', () => { + it('should return correct b65 value', () => { + expect(b64('testtext')).toEqual('dGVzdHRleHQ='); + }); + }); + + describe('sanitizeName', () => { + it('should sanitize file name with extension', () => { + expect(sanitizeName('a\\{%`"~[]#|^<>1.jpg')).toEqual('a-------------1.jpg'); + }); + + it('should sanitize file name without extension', () => { + expect(sanitizeName('123qwe')).toEqual('123qwe'); + }); + + it('should return undefined on empty string', () => { + expect(sanitizeName('')).toEqual('undefined'); + }); + + it('should respect sanitize options as boolean', () => { + expect(sanitizeName('[]#|.jpg', false)).toEqual('[]#|.jpg'); + }); + + it('should respect sanitize options with provided options', () => { + expect(sanitizeName('[]#|.jpg', { + exclude: ['[', ']'], + replacement: '_', + })).toEqual('__#|.jpg'); + }); + }); + + describe('requireNode', () => { + it('should require node package', () => { + expect(requireNode('crypto')).toBeTruthy(); + }); + }); + + describe('filterObject', () => { + it('should filter object', () => { + expect(filterObject({ + test: 1, + test2: 2, + test3: 3, + }, ['test', 'test2'])).toEqual({ + test: 1, + test2: 2, + }); + }); - assert.equal(JSON.stringify(removeEmpty(testObj)), JSON.stringify({ test: 123, })); + it('should result the same object on empty requirements', () => { + expect(filterObject({ + test: 1, + test2: 2, + test3: 3, + }, [])).toEqual({ + test: 1, + test2: 2, + test3: 3, + }); + }); }); }); diff --git a/src/lib/utils/index.ts b/src/lib/utils/index.ts index ffdfb830..8e676f35 100644 --- a/src/lib/utils/index.ts +++ b/src/lib/utils/index.ts @@ -15,12 +15,15 @@ * limitations under the License. */ -import throatImpl from './throat'; -import * as t from 'tcomb-validation'; import { Session } from '../client'; import { Hosts } from './../../config'; +import * as SparkMD5 from 'spark-md5'; +import fileType from 'file-type'; +import * as isutf8 from 'isutf8'; -export const throat = throatImpl; +const mobileRegexp = /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series[46]0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino|android|ipad|playbook|silk/i; +const htmlCommentsRegexp = //g; +const svgRegexp = /^\s*(?:<\?xml[^>]*>\s*)?(?:]*\s*(?:\[?(?:\s*]*>\s*)*\]?)*[^>]*>\s*)?]*>[^]*<\/svg>\s*$/i; /** * Resolve cdn url based on handle type @@ -44,53 +47,25 @@ export const resolveCdnUrl = (session: Session, handle: string): string => { return cdnURL; }; -export const resolveHost = (hosts: Hosts, cname: string): Hosts => { - let result = hosts; - - if (cname) { - const hosts = /filestackapi.com|filestackcontent.com/i; - - Object.keys(hosts).forEach((key) => { - result[key] = hosts[key].replace(hosts, cname); - }); - } - - return result; -}; - /** - * Check config options + * Resolve all urls with provided cnames * * @private - * @param name - * @param allowed - * @param options - */ -export const checkOptions = (name: string, allowed: any, options: any = {}): {} => { - const keys = Object.keys(options); - const allowedNames = allowed.map((a: any) => a.name); - const namesFormatted = allowedNames.join(', '); - keys.forEach((key) => { - if (allowedNames.indexOf(key) < 0) { - throw new Error(`${key} is not a valid option for ${name}. Valid options are: ${namesFormatted}`); - } - }); - allowed.forEach((obj: any) => { - let value = options[obj.name]; - if (obj.name === 'location' && typeof value === 'string') { - value = value.toLowerCase(); - } - if (value !== undefined) { - const result = t.validate(value, obj.type); - if (!result.isValid()) { - const error = result.firstError(); - if (error && error.message) { - throw new Error(error.message); - } - } - } + * @param urls + * @param cname + */ +export const resolveHost = (urls: Hosts, cname: string): Hosts => { + if (!cname) { + return urls; + } + + const hosts = /filestackapi.com|filestackcontent.com/i; + + Object.keys(urls).forEach(key => { + urls[key] = urls[key].replace(hosts, cname); }); - return keys; + + return urls; }; /** @@ -101,51 +76,164 @@ export const checkOptions = (name: string, allowed: any, options: any = {}): {} */ export const removeEmpty = (obj: any) => { const newObj = { ...obj }; - Object.keys(newObj).forEach(k => (!newObj[k] && newObj[k] !== undefined) && delete newObj[k]); + Object.keys(newObj).forEach(k => !newObj[k] && typeof newObj[k] !== 'boolean' && delete newObj[k]); return newObj; }; /** + * Returns information about current env (browser|nodejs) + */ +export const isNode = () => typeof process !== 'undefined' && process.versions && process.versions.node; + +/** + * Returns if browser is a mobile device (if node env always return false) + */ +/* istanbul ignore next */ +export const isMobile = () => !isNode() && navigator && navigator.userAgent && mobileRegexp.test(navigator.userAgent); + +/** + * Returns unique time + */ +let last; +export const uniqueTime = () => { + const time = Date.now(); + last = time === last ? time + 1 : time; + return last; +}; + +/** + * Generates random string with provided length * + * @param len + */ +export const uniqueId = (len: number = 10): string => { + return new Array(len).join().replace(/(.|$)/g, () => ((Math.random() * 36) | 0).toString(36)[Math.random() < 0.5 ? 'toString' : 'toUpperCase']()); +}; + +/** + * Calculates a MD5 checksum for passed buffer * @private - * @param fn - * @param interval - * @param callFirst + * @param data Data to be hashed + * @returns base64 encoded MD5 hash */ -export const throttle = function throttle(fn: any, interval: number, callFirst?: boolean) { - let wait = false; - let callNow = false; +export const md5 = (data: any): string => { + if (isNode()) { + return (requireNode('crypto')).createHash('md5').update(data).digest('base64'); + } + /* istanbul ignore next */ - return function (this: any, ...args: any[]) { - callNow = !!callFirst && !wait; - const context = this; - if (!wait) { - wait = true; - setTimeout(function () { - wait = false; - if (!callFirst) { - return fn.apply(context, args); - } - }, interval); + return btoa(SparkMD5.ArrayBuffer.hash(data, true)); +}; + +/** + * Check if input is a svg + * + * @param input + */ +const isSvg = (input: Uint8Array | Buffer) => input && svgRegexp.test(String.fromCharCode.apply(null, input).replace(htmlCommentsRegexp, '')); + +/** + * Check if input is a svg + * + * @param {Uint8Array | Buffer} file + * @returns {string} - mimetype + */ +export const getMimetype = (file: Uint8Array | Buffer): string => { + let type = fileType(file); + if (type) { + return type.mime; + } + + try { + + if (isSvg(file)) { + return 'image/svg+xml'; } - if (callNow) { - callNow = false; - return fn.apply(this, arguments); + + if (isutf8(file)) { + return 'text/plain'; } - }; + } catch (e) { + console.warn('Additional mimetype checks (text/plain) are currently not supported for browsers'); + } + + return 'application/octet-stream'; +}; + +/** + * return based string + * @param data + */ +export const b64 = (data: string): string => { + if (isNode()) { + return Buffer.from(data).toString('base64'); + } + + return btoa(data); }; /** + * Hides require from buindling by weback to browser * - * @private - * @param start - * @param stop - * @param step - */ -export const range = (start: number, stop: number, step: number = 1) => { - const toReturn: any[] = []; - for (; start < stop; start += step) { - toReturn.push(start); + * @param {string} name + */ +export const requireNode = (name: string): any => { + if (!isNode()) { + return false; + } + + return require && require(name); +}; + +/** + * Sanitizer Options + */ +export type SanitizeOptions = (boolean | { + exclude?: string[], + replacement?: string, +}); + +/** + * Sanitize file name + * + * @param name + * @param {bool} options - enable,disable sanitizer, default enabled + * @param {string} options.replacement - replacement for sanitized chars defaults to "-" + * @param {string[]} options.exclude - array with excluded chars default - ['\', '{', '}','|', '%', '`', '"', "'", '~', '[', ']', '#', '|', '^', '<', '>'] + */ +export const sanitizeName = (name: string, options: SanitizeOptions = true): string => { + if (typeof options === 'boolean' && !options) { + return name; + } + + let ext; + + const replacement = typeof options !== 'boolean' && options.replacement ? options.replacement : '-'; + const exclude = typeof options !== 'boolean' && options.exclude ? options.exclude : ['\\', '{', '}','|', '%', '`', '"', "'", '~', '[', ']', '#', '|', '^', '<', '>']; + + if (!name || name.length === 0) { + return 'undefined'; + } + + const fileParts = name.split('.'); + + if (fileParts.length > 1) { + ext = fileParts.pop(); + } + + return `${fileParts.join('_').split('').map((char) => exclude.indexOf(char) > -1 ? replacement : char).join('')}${ext ? '.' + ext : ''}`; +}; + +/** + * Filter object to given fields + * + * @param toFilter + * @param requiredFields + */ +export const filterObject = (toFilter, requiredFields: string[]) => { + if (!requiredFields || requiredFields.length === 0) { + return toFilter; } - return toReturn; + + return Object.keys(toFilter).filter(f => requiredFields.indexOf(f) > -1).reduce((obj, key) => ({ ...obj, [key]: toFilter[key] }), {}); }; diff --git a/src/lib/utils/throat.spec.ts b/src/lib/utils/throat.spec.ts deleted file mode 100644 index ecd68f81..00000000 --- a/src/lib/utils/throat.spec.ts +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (c) 2018 by Filestack. - * Some rights reserved. - * - * Original implementation of throat by Forbes Lindesay - * https://github.com/ForbesLindesay/throat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import * as assert from 'assert'; -import throat from './throat'; - -let sentA = {}; -let sentB = {}; -let sentC = {}; - -declare var Promise: any; - -class Processed { - val: any; - constructor(val: any) { - this.val = val; - } -} - -function worker(max: number) { - let concurrent = 0; - function execute() { - concurrent++; - if (concurrent > max) throw new Error('Extra processes were run in parallel.'); - const res = new Processed(Array.prototype.slice.call(arguments)); - return new Promise(function (resolve: any) { - setTimeout(function () { - concurrent--; - resolve(res); - }, 100); - }); - } - return execute; -} - -describe('throat(n, fn)', function () { - this.timeout(10000); - it('throat(1, fn) acts as a sequential worker', function () { - return Promise.all([sentA, sentB, sentC].map(throat(1, worker(1)))) - .then(function (res: any) { - assert.ok(res[0] instanceof Processed && res[0].val.length > 1 && res[0].val[0] === sentA); - assert.ok(res[1] instanceof Processed && res[1].val.length > 1 && res[1].val[0] === sentB); - assert.ok(res[2] instanceof Processed && res[2].val.length > 1 && res[2].val[0] === sentC); - }); - }); - - it('throat(2, fn) works on two inputs in parallel', function () { - return Promise.all([sentA, sentB, sentC].map(throat(2, worker(2)))) - .then(function (res: any) { - assert.ok(res[0] instanceof Processed && res[0].val.length > 1 && res[0].val[0] === sentA); - assert.ok(res[1] instanceof Processed && res[1].val.length > 1 && res[1].val[0] === sentB); - assert.ok(res[2] instanceof Processed && res[2].val.length > 1 && res[2].val[0] === sentC); - }); - }); - - it('throat(3, fn) works on three inputs in parallel', function () { - return Promise.all([sentA, sentB, sentC].map(throat(3, worker(3)))) - .then(function (res: any) { - assert.ok(res[0] instanceof Processed && res[0].val.length > 1 && res[0].val[0] === sentA); - assert.ok(res[1] instanceof Processed && res[1].val.length > 1 && res[1].val[0] === sentB); - assert.ok(res[2] instanceof Processed && res[2].val.length > 1 && res[2].val[0] === sentC); - }); - }); - - it('should reject fn as a string', function () { - try { - throat(2, 'foo'); - } catch (ex) { - assert.ok(/Expected throat fn to be a function/.test(ex.message)); - return; - } - throw new Error('Expected a failure'); - }); -}); diff --git a/src/lib/utils/throat.ts b/src/lib/utils/throat.ts deleted file mode 100644 index ce08105a..00000000 --- a/src/lib/utils/throat.ts +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (c) 2018 by Filestack. - * Some rights reserved. - * - * Original implementation of throat by Forbes Lindesay - * https://github.com/ForbesLindesay/throat - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @private - */ -class Delayed { - resolve: any; - fn: any; - self?: any; - args: any; - constructor(resolve: any, fn: any, self: any, args: any) { - this.resolve = resolve; - this.fn = fn; - this.self = self || null; - this.args = args; - } -} - -/** - * @private - */ -class Queue { - _s1: any[]; - _s2: any[]; - constructor() { - this._s1 = []; - this._s2 = []; - } - push(value: any) { - this._s1.push(value); - } - shift() { - let s2 = this._s2; - if (s2.length === 0) { - const s1 = this._s1; - if (s1.length === 0) { - return; - } - this._s1 = s2; - s2 = this._s2 = s1.reverse(); - } - return s2.pop(); - } - isEmpty() { - return !this._s1.length && !this._s2.length; - } -} - -/** - * - * @private - * @param size - * @param fn - */ -export default function throat(size: number, fn: any) { - const queue = new Queue(); - function run(fn: any, self: any, args: any) { - if (size) { - size--; - const result = new Promise(function (resolve) { - resolve(fn.apply(self, args)); - }); - result.then(release, release); - return result; - } else { - return new Promise(function (resolve) { - queue.push(new Delayed(resolve, fn, self, args)); - }); - } - } - function release() { - size++; - if (!queue.isEmpty()) { - const next = queue.shift(); - next.resolve(run(next.fn, next.self, next.args)); - } - } - if (fn !== undefined && typeof fn !== 'function') { - throw new TypeError( - 'Expected throat fn to be a function but got ' + typeof fn - ); - } - return function (this: any, ...args: any[]) { - return run(fn, this, args); - }; -} diff --git a/src/schema/definitions.schema.ts b/src/schema/definitions.schema.ts new file mode 100644 index 00000000..45a34c4e --- /dev/null +++ b/src/schema/definitions.schema.ts @@ -0,0 +1,191 @@ +/* + * Copyright (c) 2018 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export const DefinitionsSchema = { + '$schema': 'http://json-schema.org/draft-07/schema#', + title: 'Filestack', + description: 'Filestack common definitions', + type: 'object', + additionalProperties: false, + definitions: { + workflowsDef: { + id: '/workflowsDef', + type: 'array', + additionalItems: false, + minItems: 1, + maxItems: 20, + items: [{ + oneOf: [{ + type: 'string', + }, { + type: 'object', + additionalProperties: false, + properties: { + id: { + type: 'string', + }, + }, + }], + }], + }, + securityCallDef: { + id: '/securityCallDef', + oneOf: [{ + additionalProperties: false, + type: 'string', + enum: ['pick', 'read', 'stat', 'write', 'writeUrl', 'store', 'convert', 'remove', 'exif', 'runWorkflow'], + }, { + type: 'array', + additionalProperties: false, + items: [{ + minItems: 1, + maxItems: 10, + type: 'string', + additionalProperties: false, + enum: ['pick', 'read', 'stat', 'write', 'writeUrl', 'store', 'convert', 'remove', 'exif', 'runWorkflow'], + }], + }], + }, + regionsDef: { + id: '/regionsDef', + type: 'string', + enum: ['us-east-1', 'us-west-1', 'us-west-2', 'eu-west-1', 'eu-central-1', 'ap-northeast-1', 'ap-northeast-2', 'ap-southeast-1', 'ap-southeast-2', 'sa-east-1'], + }, + locationsDef: { + id: '/locationsDef', + type: 'string', + enum: ['s3', 'S3', 'rackspace', 'gcs', 'azure', 'dropbox'], + }, + colorDef: { + id: 'colorDef', + oneOf: [{ + type: 'string', + pattern: '^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$', // without # at the begining + }, { + type: 'string', + enum: ['aliceblue', 'antiquewhite', 'aqua', 'aquamarine', 'azure', 'beige', 'bisque', 'black', 'blanchedalmond', 'blue', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'fractal', 'fuchsia', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'gray0', 'gray1', 'gray2', 'gray3', 'gray4', 'gray5', 'gray6', 'gray7', 'gray8', 'gray9', 'gray10', 'gray11', 'gray12', 'gray13', 'gray14', 'gray15', 'gray16', 'gray17', 'gray18', 'gray19', 'gray20', 'gray21', 'gray22', 'gray23', 'gray24', 'gray25', 'gray26', 'gray27', 'gray28', 'gray29', 'gray30', 'gray31', 'gray32', 'gray33', 'gray34', 'gray35', 'gray36', 'gray37', 'gray38', 'gray39', 'gray40', 'gray41', 'gray42', 'gray43', 'gray44', 'gray45', 'gray46', 'gray47', 'gray48', 'gray49', 'gray50', 'gray51', 'gray52', 'gray53', 'gray54', 'gray55', 'gray56', 'gray57', 'gray58', 'gray59', 'gray60', 'gray61', 'gray62', 'gray63', 'gray64', 'gray65', 'gray66', 'gray67', 'gray68', 'gray69', 'gray70', 'gray71', 'gray72', 'gray73', 'gray74', 'gray75', 'gray76', 'gray77', 'gray78', 'gray79', 'gray80', 'gray81', 'gray82', 'gray83', 'gray84', 'gray85', 'gray86', 'gray87', 'gray88', 'gray89', 'gray90', 'gray91', 'gray92', 'gray93', 'gray94', 'gray95', 'gray96', 'gray97', 'gray98', 'gray99', 'gray100', 'gray', 'green', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'lime', 'limegreen', 'linen', 'magenta', 'maroon', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'navy', 'none', 'oldlace', 'olive', 'olivedrab', 'orange', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'purple', 'red', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'silver', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'teal', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'white', 'whitesmoke', 'yellow', 'yellowgreen',], + }], + }, + pageFormatDef: { + id: '/pageFormatDef', + type: 'string', + enum: ['a2', 'a3', 'a4', 'a5', 'b4', 'b5', 'letter', 'legal', 'tabloid'], + }, + pageRangeDef: { + id: '/pageRangeDef', + type: 'array', + uniqueItems: true, + items: [{ + oneOf: [{ + type: 'integer', + minimum: 1, + }, { + type: 'string', + pattern: '^(\\d+(?:-\\d+)?)$|^(-\\d+)$|^(\\d+-)$', + errorMessage: 'Param should be provided in one of the following formats: "1,2,3,5", "1-3", "1-", "-2" ', + }], + }], + }, + facesDef: { + id: '/facesDef', + oneOf: [{ + type: 'string', + enum: ['all'], + }, { + type: 'integer', + minimum: 1, + maximum: 1000, + }, { + type: 'array', + uniqueItems: true, + items: [{ + type: 'integer', + minimum: 1, + maximum: 1000, + }], + }], + }, + objectsDef: { + id: '/objectsDef', + type: 'array', + minItems: 1, + maxItems: 50, + items: [{ + type: 'array', + additionalItems: false, + minItems: 4, + items: [{ + type: 'integer', + minimum: 0, + maximum: 10000, + }, { + type: 'integer', + minimum: 0, + maximum: 10000, + }, { + type: 'integer', + minimum: 1, + maximum: 10000, + }, { + type: 'integer', + minimum: 1, + maximum: 10000, + }], + }], + }, + positionDef: { + id: '/positionDef', + default: ['middle', 'center'], + oneOf: [ + { + type: 'string', + enum: [ + 'top', + 'middle', + 'bottom', + 'left', + 'center', + 'right', + ], + }, + { + type: 'array', + uniqueItems: true, + additionalItems: false, + minItems: 2, + default: ['middle', 'center'], + items: [ + { + type: 'string', + enum: [ + 'top', + 'middle', + 'bottom', + ], + }, { + type: 'string', + enum: [ + 'left', + 'center', + 'right', + ], + }, + ], + }, + ], + }, + }, +}; diff --git a/src/schema/index.ts b/src/schema/index.ts index a01a5062..6a01c73d 100644 --- a/src/schema/index.ts +++ b/src/schema/index.ts @@ -17,3 +17,10 @@ export * from './transforms.schema'; export * from './validator'; +export * from './store.schema'; +export * from './security.schema'; +export * from './preview.schema'; +export * from './picker.schema'; +export * from './upload.schema'; +export * from './metadata.schema'; +export * from './retrieve.schema'; diff --git a/src/schema/metadata.schema.ts b/src/schema/metadata.schema.ts new file mode 100644 index 00000000..efb679eb --- /dev/null +++ b/src/schema/metadata.schema.ts @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2018 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export const MetadataParamsSchema = { + '$schema': 'http://json-schema.org/draft-07/schema#', + title: 'Filestack Metadata', + description: 'Filestack Metadata Options', + type: 'object', + additionalProperties: false, + properties: { + size: { + type: 'boolean', + }, + mimetype: { + type: 'boolean', + }, + filename: { + type: 'boolean', + }, + width: { + type: 'boolean', + }, + metadata: { + type: 'boolean', + }, + height: { + type: 'boolean', + }, + uploaded: { + type: 'boolean', + }, + writeable: { + type: 'boolean', + }, + cloud: { + type: 'boolean', + }, + sourceUrl: { + type: 'boolean', + }, + md5: { + type: 'boolean', + }, + sha1: { + type: 'boolean', + }, + sha224: { + type: 'boolean', + }, + sha256: { + type: 'boolean', + }, + sha384: { + type: 'boolean', + }, + sha512: { + type: 'boolean', + }, + location: { + type: 'boolean', + }, + path: { + type: 'boolean', + }, + container: { + type: 'boolean', + }, + exif: { + type: 'boolean', + }, + }, +}; diff --git a/src/schema/picker.schema.spec.browser.ts b/src/schema/picker.schema.spec.browser.ts new file mode 100644 index 00000000..2a6f80ff --- /dev/null +++ b/src/schema/picker.schema.spec.browser.ts @@ -0,0 +1,255 @@ +/* + * Copyright (c) 2018 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as assert from 'assert'; +import { getValidator, PickerParamsSchema } from './'; + +import * as jsdom from 'jsdom'; +const { JSDOM } = jsdom; + +describe('Picker Params Schema', () => { + const validator = getValidator(PickerParamsSchema); + + const validate = params => { + const res = validator(params); + + // if (res.errors.length) { + // console.log(res.errors); + // } + + return res.errors.length === 0 ? true : false; + }; + + const assertFail = res => assert.ok(!res); + + it('should validate allow manual retry', () => { + assert.ok(validate({ allowManualRetry: true })); + assertFail(validate({ allowManualRetry: {} })); + }); + + it('should validate accept param', () => { + assert.ok(validate({ accept: 'image/jpeg' })); + assert.ok(validate({ accept: ['image/jpeg', 'image/png', '*'] })); + assertFail(validate({ accept: {} })); + }); + + it('should validate fromSources param', () => { + assert.ok(validate({ fromSources: ['url', 'facebook'] })); + assertFail(validate({ fromSources: ['wrong_source'] })); + }); + + it('should validate container param', () => { + assert.ok(validate({ container: 'test' })); + + const nodeDiv = JSDOM.fragment(`
Hello
`).querySelector('div'); + const nodeP = JSDOM.fragment(`

Hello

`).querySelector('p'); + assert.ok(validate({ container: nodeDiv })); + assert.ok(validate({ container: nodeP })); + assertFail(validate({ container: {} })); + }); + + it('should validate cleanupImageExif param', () => { + assert.ok(validate({ cleanupImageExif: true })); + assert.ok( + validate({ + cleanupImageExif: { + keepOrientation: true, + }, + }) + ); + assertFail( + validate({ + cleanupImageExif: { + test: 1, + }, + }) + ); + }); + + it('should validate displayMode param', () => { + assert.ok(validate({ displayMode: 'inline' })); + assert.ok(validate({ displayMode: 'overlay' })); + assert.ok(validate({ displayMode: 'dropPane' })); + assertFail(validate({ displayMode: 'test' })); + }); + + it('should validate imageDim param', () => { + assert.ok(validate({ imageDim: [100, 100] })); + assertFail(validate({ imageDim: [0, 1] })); + assertFail(validate({ imageDim: [100, 100, 3] })); + }); + + it('should validate storeTo Params', () => { + assert.ok( + validate({ + storeTo: { + filename: 'test', + location: 's3', + path: '/test/', + region: 'test', + access: 'public', + workflows: ['test'], + }, + }) + ); + + assert.ok( + validate({ + storeTo: { + filename: 'test', + location: 's3', + path: '/test/', + region: 'test', + access: 'private', + workflows: [ + { + id: 'test', + }, + ], + }, + }) + ); + + assertFail( + validate({ + storeTo: { + workflows: {}, + access: 'none', + }, + }) + ); + }); + + it('should validate transformations param', () => { + assert.ok( + validate({ + transformations: { + circle: true, + rotate: true, + crop: true, + }, + }) + ); + + assert.ok( + validate({ + transformations: { + circle: false, + rotate: false, + crop: { + force: true, + aspectRatio: 1 / 2, + }, + }, + }) + ); + + assertFail( + validate({ + transformations: { + test: 123, + }, + }) + ); + }); + + it('should validate customText param', () => { + assert.ok( + validate({ + customText: { + sometest: 'testtext', + }, + }) + ); + assertFail(validate({ customText: ['test', 'ts1'] })); + }); + + it('should validate customAuthText param', () => { + assert.ok( + validate({ + customAuthText: { + test: { + top: 'test', + bottom: 'test2', + }, + }, + }) + ); + + assertFail( + validate({ + customAuthText: { + test: { + top: 'test', + }, + }, + }) + ); + + assertFail( + validate({ + customAuthText: { + test: '123', + }, + }) + ); + }); + + it('should validate ', () => { + assert.ok( + validate({ + uploadConfig: { + partSize: 5 * 1024 * 1024, + intelligent: true, + onProgress: () => console, + }, + }) + ); + + assert.ok( + validate({ + uploadConfig: { + intelligent: 'fallback', + }, + }) + ); + + assertFail( + validate({ + uploadConfig: { + partSize: 100, + }, + }) + ); + + assertFail( + validate({ + uploadConfig: { + progressInterval: 0, + }, + }) + ); + + assertFail( + validate({ + uploadConfig: { + concurrency: 0, + }, + }) + ); + }); +}); diff --git a/src/schema/picker.schema.ts b/src/schema/picker.schema.ts new file mode 100644 index 00000000..91b9eb86 --- /dev/null +++ b/src/schema/picker.schema.ts @@ -0,0 +1,388 @@ +/* + * Copyright (c) 2018 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { UploadParamsSchema } from './upload.schema'; + +export const PickerParamsSchema = { + $schema: 'http://json-schema.org/draft-07/schema#', + title: 'Filestack Picker', + description: 'Filestack Picker Options', + type: 'object', + additionalProperties: false, + // required: ['container'], + properties: { + allowManualRetry: { + type: 'boolean', + }, + accept: { + additionalProperties: false, + oneOf: [ + { + type: 'string', + }, + { + type: 'array', + minItems: 1, + items: [ + { + type: 'string', + }, + ], + }, + ], + }, + fromSources: { + type: 'array', + items: [ + { + type: 'string', + additionalProperties: false, + enum: [ + 'local_file_system', + 'url', + 'imagesearch', + 'facebook', + 'instagram', + 'googledrive', + 'dropbox', + 'webcam', + 'video', + 'audio', + 'box', + 'github', + 'gmail', + 'picasa', + 'onedrive', + 'onedriveforbusiness', + 'clouddrive', + 'googlephotos', + 'customsource', + ], + }, + ], + }, + container: { + format: 'HTMLContainer', + }, + cleanupImageExif: { + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + keepOrientation: { + type: 'boolean', + }, + }, + }, + ], + }, + displayMode: { + type: 'string', + enum: ['inline', 'overlay', 'dropPane'], + }, + concurrency: { + type: 'integer', + minimum: 1, + maximum: 20, + }, + customSourceContainer: { + type: 'string', + }, + customSourcePath: { + type: 'string', + }, + customSourceName: { + type: 'string', + }, + disableStorageKey: { + type: 'boolean', + }, + disableTransformer: { + type: 'boolean', + }, + disableThumbnails: { + type: 'boolean', + }, + exposeOriginalFile: { + type: 'boolean', + }, + globalDropZone: { + type: 'boolean', + }, + hideModalWhenUploading: { + type: 'boolean', + }, + imageDim: { + type: 'array', + minItems: 2, + maxItems: 2, + items: [ + { + type: 'integer', + minimum: 1, + maximum: 1000000, + }, + ], + }, + imageMax: { + type: 'array', + minItems: 2, + maxItems: 2, + items: [ + { + type: 'integer', + minimum: 1, + maximum: 1000000, + }, + ], + }, + imageMin: { + type: 'array', + minItems: 2, + maxItems: 2, + items: [ + { + type: 'integer', + minimum: 1, + maximum: 1000000, + }, + ], + }, + imageMinMaxBlock: { + type: 'boolean', + default: false, + }, + lang: { + type: 'string', + enum: ['ca', 'da', 'de', 'en', 'es', 'fr', 'he', 'it', 'ja', 'ko', 'nl', 'no', 'pl', 'pt', 'sv', 'ru', 'vi', 'zh', 'tr'], + }, + minFiles: { + type: 'integer', + minimum: 1, + maximum: 1000000, + }, + maxFiles: { + type: 'integer', + minimum: 1, + maximum: 1000000, + }, + maxSize: { + type: 'integer', + minimum: 1, + maximum: 1000000, + }, + modalSize: { + type: 'array', + minItems: 2, + maxItems: 2, + items: [ + { + type: 'integer', + minimum: 1, + maximum: 1000000, + }, + ], + }, + rootId: { + type: 'string', + }, + startUploadingWhenMaxFilesReached: { + type: 'boolean', + }, + uploadInBackground: { + type: 'boolean', + }, + videoResolution: { + type: 'string', + }, + onCancel: { + format: 'callback', + }, + onClose: { + format: 'callback', + }, + onOpen: { + format: 'callback', + }, + onFileSelected: { + format: 'callback', + }, + onFileUploadStarted: { + format: 'callback', + }, + onFileUploadFinished: { + format: 'callback', + }, + onFileUploadFailed: { + format: 'callback', + }, + onFileUploadProgress: { + format: 'callback', + }, + onUploadStarted: { + format: 'callback', + }, + onUploadDone: { + format: 'callback', + }, + storeTo: { + additionalProperties: false, + type: 'object', + properties: { + filename: { + type: 'string', + }, + location: { + $ref: 'locationsDef', + }, + container: { + type: 'string', + }, + path: { + type: 'string', + }, + region: { + type: 'string', + }, + access: { + type: 'string', + enum: ['public', 'private'], + }, + workflows: { + $ref: 'workflowsDef', + }, + }, + }, + viewType: { + type: 'string', + enum: ['grid', 'list'], + }, + transformations: { + type: 'object', + additionalProperties: false, + properties: { + circle: { + type: 'boolean', + }, + rotate: { + type: 'boolean', + }, + force: { + type: 'boolean', + }, + crop: { + oneOf: [ + { + type: 'boolean', + }, + { + type: 'object', + additionalProperties: false, + properties: { + force: { + type: 'boolean', + }, + aspectRatio: { + type: 'number', + }, + }, + }, + ], + }, + }, + }, + customText: { + type: 'object', + patternProperties: { + '.*': { type: 'string' }, + }, + }, + dropPane: { + type: 'object', + properties: { + cropFiles: { + type: 'boolean', + }, + customText: { + type: 'string', + }, + disableClick: { + type: 'boolean', + }, + overlay: { + type: 'boolean', + }, + showIcon: { + type: 'boolean', + }, + showProgress: { + type: 'boolean', + }, + onDragEnter: { + format: 'callback', + }, + onProgress: { + format: 'callback', + }, + onDragLeave: { + format: 'callback', + }, + onDragOver: { + format: 'callback', + }, + onDrop: { + format: 'callback', + }, + onSuccess: { + format: 'callback', + }, + onError: { + format: 'callback', + }, + onClick: { + format: 'callback', + }, + }, + }, + customAuthText: { + type: 'object', + patternProperties: { + '.*': { + additionalProperties: false, + type: 'object', + required: ['top', 'bottom'], + properties: { + top: { + type: 'string', + }, + bottom: { + type: 'string', + }, + }, + }, + }, + }, + uploadConfig: { + type: 'object', + additionalProperties: false, + properties: UploadParamsSchema.properties,// manual import upload definitions + }, + }, +}; diff --git a/src/adapters/security.browser.ts b/src/schema/preview.schema.ts similarity index 66% rename from src/adapters/security.browser.ts rename to src/schema/preview.schema.ts index b7dffe2c..b0d09000 100644 --- a/src/adapters/security.browser.ts +++ b/src/schema/preview.schema.ts @@ -14,12 +14,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -export interface SecurityOptions { } - -/** - * getSecurity is disabled for browsers. - */ -export const getSecurity = () => { - console.warn('This method is only availale in Node runtimes'); +export const PreviewParamsSchema = { + '$schema': 'http://json-schema.org/draft-07/schema#', + title: 'Filestack Preview', + description: 'Filestack Preview Options', + type: 'object', + additionalProperties: false, + properties: { + id: { + type: 'string', + }, + css: { + type: 'string', + }, + }, }; diff --git a/src/lib/api/upload/md5.ts b/src/schema/retrieve.schema.ts similarity index 57% rename from src/lib/api/upload/md5.ts rename to src/schema/retrieve.schema.ts index 93561af0..04857000 100644 --- a/src/lib/api/upload/md5.ts +++ b/src/schema/retrieve.schema.ts @@ -14,16 +14,27 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import * as SparkMD5 from 'spark-md5'; -import * as abab from 'abab'; - -/** - * Calculates a MD5 checksum for passed buffer - * @private - * @param data Data to be hashed - * @returns base64 encoded MD5 hash - */ -export const calcMD5 = (data: any): string => { - return abab.btoa(SparkMD5.ArrayBuffer.hash(data, true)); +export const RetrieveParamsSchema = { + '$schema': 'http://json-schema.org/draft-07/schema#', + title: 'Filestack Retrieve', + description: 'Filestack Retrieve Options', + type: 'object', + additionalProperties: false, + properties: { + metadata: { + type: 'boolean', + }, + head: { + type: 'boolean', + }, + dl: { + type: 'boolean', + }, + cache: { + type: 'boolean', + }, + extension: { + type: 'string', + }, + }, }; diff --git a/src/lib/api/upload/md5.spec.ts b/src/schema/security.schema.ts similarity index 51% rename from src/lib/api/upload/md5.spec.ts rename to src/schema/security.schema.ts index 5c679d7e..aa1f12cd 100644 --- a/src/lib/api/upload/md5.spec.ts +++ b/src/schema/security.schema.ts @@ -14,13 +14,36 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - -import * as assert from 'assert'; -import { calcMD5 } from './md5'; - -describe('md5', () => { - - it('should calculate correct MD5 sum', () => { - assert.ok(calcMD5(new Buffer('qwertyuiop[]1234567890')) === 'zx9GtzC/khrBelx6tW5v/g=='); - }); -}); +export const SecurityParamsSchema = { + '$schema': 'http://json-schema.org/draft-07/schema#', + title: 'Filestack Security', + description: 'Filestack Security Options', + type: 'object', + additionalProperties: false, + properties: { + expiry: { + type: 'number', + }, + call: { + '$ref': 'securityCallDef', + }, + handle: { + type: 'string', + }, + url: { + type: 'string', + }, + maxSize: { + type: 'number', + }, + minSize: { + type: 'number', + }, + path: { + type: 'string', + }, + container: { + type: 'string', + }, + }, +}; diff --git a/src/schema/store.schema.ts b/src/schema/store.schema.ts new file mode 100644 index 00000000..ed17bab8 --- /dev/null +++ b/src/schema/store.schema.ts @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2018 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export const StoreParamsSchema = { + '$schema': 'http://json-schema.org/draft-07/schema#', + title: 'Filestack Store', + description: 'Filestack Store Options', + type: 'object', + additionalProperties: false, + properties: { + filename: { + oneOf: [{ + type: 'string', + }, { + format: 'callback', + }], + }, + location: { + '$ref': 'locationsDef', + }, + path: { + type: 'string', + }, + container: { + type: 'string', + }, + region: { + '$ref': 'regionsDef', + }, + access: { + type: 'string', + enum: ['public', 'private'], + default: 'private', + }, + base64decode: { + type: 'boolean', + }, + workflows: { + '$ref': 'workflowsDef', + }, + sanitizer: { + oneOf: [{ + type: 'boolean', + }, { + type: 'object', + additionalProperties: false, + properties: { + exclude: { + type: 'array', + items: [{ + type: 'string', + }], + }, + replacement: { + type: 'string', + }, + }, + }], + }, + }, +}; diff --git a/src/schema/transforms.schema.spec.ts b/src/schema/transforms.schema.spec.ts index 95eaafb3..3cbde55c 100644 --- a/src/schema/transforms.schema.spec.ts +++ b/src/schema/transforms.schema.spec.ts @@ -343,3 +343,327 @@ describe('Transforms Schema', () => { }); }); }); + +// import * as assert from 'assert'; +// import { getValidator, TransformSchema } from './'; + +// describe('Transforms Schema', () => { + +// const validate = getValidator(TransformSchema); + +// const assertFail = (val) => assert.ok(!val); + +// it('should load json schema', () => { +// // console.log(schema); +// }); + +// describe('Watermark', () => { +// it('should validate correct params', () => { +// assert.ok(validate({ +// watermark: { +// file: 'testfilehandle', +// size: 300, +// position: 'top', +// }, +// })); +// }); + +// it('should validate correct params (position array)', () => { +// assert.ok(validate({ +// watermark: { +// file: 'testfilehandle', +// size: 300, +// position: ['top', 'left'], +// }, +// })); +// }); + +// it('should fail on wrong position params [top, bottom]', () => { +// assertFail(validate({ +// watermark: { +// file: 'testfilehandle', +// size: 300, +// position: ['top', 'bottom'], +// }, +// })); +// }); +// }); + +// describe('Partial Blur', () => { +// it('should validate correct params', () => { +// assert.ok(validate({ +// partial_blur: { +// objects: [ +// [1, 1, 2, 2], +// [1, 1, 32, 15], +// ], +// amount: 18.2, +// blur: 12, +// type: 'rect', +// }, +// })); +// }); + +// it('should fail on wrong params (amount, blur, type)', () => { +// assertFail(validate({ +// partial_blur: { +// objects: [ +// [1, 1, 2, 2], +// [1, 1, 32, 15], +// ], +// amount: -10, +// blur: 300, +// type: 'wrong_type', +// }, +// })); +// }); + +// it('should fail on wrong params (objects)', () => { +// assertFail(validate({ +// partial_blur: { +// objects: [ +// [1, 1, 2], +// [1, 1, 32, 15, 32], +// ], +// amount: 10, +// blur: 20, +// }, +// })); +// }); +// }); + +// describe('Partial Pixelate', () => { +// it('should validate correct params', () => { +// assert.ok(validate({ +// partial_pixelate: { +// objects: [ +// [1, 1, 2, 2], +// [1, 1, 32, 15], +// ], +// amount: 100, +// blur: 12.2, +// type: 'oval', +// }, +// })); +// }); + +// it('should fail on wrong params (amount, blur, type)', () => { +// assertFail(validate({ +// partial_pixelate: { +// objects: [ +// [1, 1, 2, 2], +// [1, 1, 32, 15], +// ], +// amount: -10, +// blur: 300, +// type: 'wrong_type', +// }, +// })); +// }); + +// it('should fail on wrong params (objects)', () => { +// assertFail(validate({ +// partial_pixelate: { +// objects: [ +// [1, 1, 2], +// [1, 1, 32, 15, 32], +// ], +// amount: 10, +// blur: 20, +// }, +// })); +// }); +// }); + +// describe('Crop', () => { +// it('should validate correct params', () => { +// assert.ok(validate({ +// crop: { +// dim: [1, 1, 2, 2], +// }, +// })); +// }); + +// it('should fail on empty dim params', () => { +// assertFail(validate({ +// crop: { +// dim: [], +// }, +// })); +// }); + +// it('should fail on wrong params (minimum value for 2 first items)', () => { +// assertFail(validate({ +// crop: { +// dim: [2, 1, 0, 2], +// }, +// })); +// }); + +// it('should fail on wrong params (5 items in array)', () => { +// assertFail(validate({ +// crop: { +// dim: [1, 1, 2, 2, 4], +// }, +// })); +// }); +// }); + +// describe('Resize', () => { +// it('should validate correct params', () => { +// assert.ok(validate({ +// resize: { +// width: 10, +// height: 20, +// fit: 'crop', +// align: ['top', 'left'], +// }, +// })); +// }); + +// it('should validate correct when only one width or height is provided', () => { +// assert.ok(validate({ +// resize: { +// width: 10, +// fit: 'crop', +// align: 'left', +// }, +// })); + +// assert.ok(validate({ +// resize: { +// height: 10, +// fit: 'crop', +// align: 'left', +// }, +// })); +// }); + +// it('should fail on wrong params (missing width and height)', () => { +// assertFail(validate({ +// resize: { +// fit: 'crop', +// align: 'left', +// }, +// })); +// }); +// }); + +// describe('Resize', () => { +// it('should validate correct params', () => { +// assert.ok(validate({ +// rotate: { +// deg: 'exif', +// exif: false, +// background: 'fff', +// }, +// })); +// }); + +// it('should validate correct params', () => { +// assert.ok(validate({ +// rotate: { +// deg: 200, +// exif: true, +// background: 'ffffff', +// }, +// })); +// }); + +// it('should fail on wrong params (wrong exif rotation)', () => { +// assertFail(validate({ +// rotate: { +// deg: 123, +// exif: 'true', +// background: 'ffffff', +// }, +// })); +// }); +// }); + +// describe('Pdfinfo', () => { +// it('should validate correct params with bool value', () => { +// assert.ok(validate({ +// pdfinfo: true, +// })); +// }); + +// it('should validate correct params with color info', () => { +// assert.ok(validate({ +// pdfinfo: { +// colorinfo: true, +// }, +// })); +// }); +// }); + +// describe('Pdfconvert', () => { +// describe('Pages', () => { +// [[1,2], ['1-', 3], ['-2']].forEach((val) => { +// it(`should validate on correct page "${val}"`, () => { +// assert.ok(validate({ +// pdfconvert: { +// pages: val, +// }, +// })); +// }); +// }); + +// it('should return error on fail page "1a"', () => { +// assertFail(validate({ +// pdfconvert: { +// pages: '1a', +// }, +// })); +// }); + +// }); + +// describe('Page orientation', () => { +// it('should pass on correct orientation "landscape"', () => { +// assert.ok(validate({ +// pdfconvert: { +// pageorientation: 'landscape', +// }, +// })); +// }); + +// it('should pass on correct orientation "portrait"', () => { +// assert.ok(validate({ +// pdfconvert: { +// pageorientation: 'portrait', +// }, +// })); +// }); + +// it('should fail on wrong orientation "landscape1"', () => { +// assertFail(validate({ +// pdfconvert: { +// pageorientation: 'landscape1', +// }, +// })); +// }); +// }); + +// describe('Page format', () => { +// ['a2', 'a3', 'a4', 'a5', 'b4', 'b5', 'letter', 'legal', 'tabloid'].forEach((val) => { +// it(`should when correct page format is provided ${val}`, () => { +// assert.ok(validate({ +// pdfconvert: { +// pages: [1,2], +// pageformat: val, +// }, +// })); +// }); +// }); + +// it('should fail on wrong page format ie a22', () => { +// assertFail(validate({ +// pdfconvert: { +// pageformat: 'a22', +// }, +// })); +// }); +// }); +// }); +// }); diff --git a/src/schema/transforms.schema.ts b/src/schema/transforms.schema.ts index d98fd330..ed384ab4 100644 --- a/src/schema/transforms.schema.ts +++ b/src/schema/transforms.schema.ts @@ -20,141 +20,6 @@ export const TransformSchema = { description: 'Filestack transformations parameters', type: 'object', additionalProperties: false, - definitions: { - securityCallDef: { - id: '/securityCallDef', - type: 'string', - enum: ['pick', 'read', 'stat', 'write', 'writeUrl', 'store', 'convert', 'remove', 'exif', 'runWorkflow'], - }, - regionsDef: { - id: '/regionsDef', - type: 'string', - enum: ['us-east-1', 'us-west-1', 'us-west-2', 'eu-west-1', 'eu-central-1', 'ap-northeast-1', 'ap-northeast-2', 'ap-southeast-1', 'ap-southeast-2', 'sa-east-1'], - }, - locationsDef: { - id: '/locationsDef', - type: 'string', - enum: ['s3', 'S3', 'rackspace', 'gcs', 'azure', 'dropbox'], - }, - colorDef: { - id: 'colorDef', - oneOf: [{ - type: 'string', - pattern: '^([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$', // without # at the begining - }, { - type: 'string', - enum: ['aliceblue', 'antiquewhite', 'aqua', 'aquamarine', 'azure', 'beige', 'bisque', 'black', 'blanchedalmond', 'blue', 'blueviolet', 'brown', 'burlywood', 'cadetblue', 'chartreuse', 'chocolate', 'coral', 'cornflowerblue', 'cornsilk', 'crimson', 'cyan', 'darkblue', 'darkcyan', 'darkgoldenrod', 'darkgray', 'darkgreen', 'darkgrey', 'darkkhaki', 'darkmagenta', 'darkolivegreen', 'darkorange', 'darkorchid', 'darkred', 'darksalmon', 'darkseagreen', 'darkslateblue', 'darkslategray', 'darkslategrey', 'darkturquoise', 'darkviolet', 'deeppink', 'deepskyblue', 'dimgray', 'dimgrey', 'dodgerblue', 'firebrick', 'floralwhite', 'forestgreen', 'fractal', 'fuchsia', 'gainsboro', 'ghostwhite', 'gold', 'goldenrod', 'gray0', 'gray1', 'gray2', 'gray3', 'gray4', 'gray5', 'gray6', 'gray7', 'gray8', 'gray9', 'gray10', 'gray11', 'gray12', 'gray13', 'gray14', 'gray15', 'gray16', 'gray17', 'gray18', 'gray19', 'gray20', 'gray21', 'gray22', 'gray23', 'gray24', 'gray25', 'gray26', 'gray27', 'gray28', 'gray29', 'gray30', 'gray31', 'gray32', 'gray33', 'gray34', 'gray35', 'gray36', 'gray37', 'gray38', 'gray39', 'gray40', 'gray41', 'gray42', 'gray43', 'gray44', 'gray45', 'gray46', 'gray47', 'gray48', 'gray49', 'gray50', 'gray51', 'gray52', 'gray53', 'gray54', 'gray55', 'gray56', 'gray57', 'gray58', 'gray59', 'gray60', 'gray61', 'gray62', 'gray63', 'gray64', 'gray65', 'gray66', 'gray67', 'gray68', 'gray69', 'gray70', 'gray71', 'gray72', 'gray73', 'gray74', 'gray75', 'gray76', 'gray77', 'gray78', 'gray79', 'gray80', 'gray81', 'gray82', 'gray83', 'gray84', 'gray85', 'gray86', 'gray87', 'gray88', 'gray89', 'gray90', 'gray91', 'gray92', 'gray93', 'gray94', 'gray95', 'gray96', 'gray97', 'gray98', 'gray99', 'gray100', 'gray', 'green', 'greenyellow', 'grey', 'honeydew', 'hotpink', 'indianred', 'indigo', 'ivory', 'khaki', 'lavender', 'lavenderblush', 'lawngreen', 'lemonchiffon', 'lightblue', 'lightcoral', 'lightcyan', 'lightgoldenrodyellow', 'lightgray', 'lightgreen', 'lightgrey', 'lightpink', 'lightsalmon', 'lightseagreen', 'lightskyblue', 'lightslategray', 'lightslategrey', 'lightsteelblue', 'lightyellow', 'lime', 'limegreen', 'linen', 'magenta', 'maroon', 'mediumaquamarine', 'mediumblue', 'mediumorchid', 'mediumpurple', 'mediumseagreen', 'mediumslateblue', 'mediumspringgreen', 'mediumturquoise', 'mediumvioletred', 'midnightblue', 'mintcream', 'mistyrose', 'moccasin', 'navajowhite', 'navy', 'none', 'oldlace', 'olive', 'olivedrab', 'orange', 'orangered', 'orchid', 'palegoldenrod', 'palegreen', 'paleturquoise', 'palevioletred', 'papayawhip', 'peachpuff', 'peru', 'pink', 'plum', 'powderblue', 'purple', 'red', 'rosybrown', 'royalblue', 'saddlebrown', 'salmon', 'sandybrown', 'seagreen', 'seashell', 'sienna', 'silver', 'skyblue', 'slateblue', 'slategray', 'slategrey', 'snow', 'springgreen', 'steelblue', 'tan', 'teal', 'thistle', 'tomato', 'turquoise', 'violet', 'wheat', 'white', 'whitesmoke', 'yellow', 'yellowgreen',], - }], - }, - pageFormatDef: { - id: '/pageFormatDef', - type: 'string', - enum: ['a2', 'a3', 'a4', 'a5', 'b4', 'b5', 'letter', 'legal', 'tabloid'], - }, - pageRangeDef: { - id: '/pageRangeDef', - type: 'array', - uniqueItems: true, - items: [{ - oneOf: [{ - type: 'integer', - minimum: 1, - }, { - type: 'string', - pattern: '^(\\d+(?:-\\d+)?)$|^(-\\d+)$|^(\\d+-)$', - errorMessage: 'Param should be provided in one of the following formats: "1,2,3,5", "1-3", "1-", "-2" ', - }], - }], - }, - facesDef: { - id: '/facesDef', - oneOf: [{ - type: 'string', - enum: ['all'], - }, { - type: 'integer', - minimum: 1, - maximum: 1000, - }, { - type: 'array', - uniqueItems: true, - items: [{ - type: 'integer', - minimum: 1, - maximum: 1000, - }], - }], - }, - objectsDef: { - id: '/objectsDef', - type: 'array', - minItems: 1, - maxItems: 50, - items: [{ - type: 'array', - additionalItems: false, - minItems: 4, - items: [{ - type: 'integer', - minimum: 0, - maximum: 10000, - }, { - type: 'integer', - minimum: 0, - maximum: 10000, - }, { - type: 'integer', - minimum: 1, - maximum: 10000, - }, { - type: 'integer', - minimum: 1, - maximum: 10000, - }], - }], - }, - positionDef: { - id: '/positionDef', - default: ['middle', 'center'], - oneOf: [ - { - type: 'string', - enum: [ - 'top', - 'middle', - 'bottom', - 'left', - 'center', - 'right', - ], - }, - { - type: 'array', - uniqueItems: true, - additionalItems: false, - minItems: 2, - default: ['middle', 'center'], - items: [ - { - type: 'string', - enum: [ - 'top', - 'middle', - 'bottom', - ], - }, { - type: 'string', - enum: [ - 'left', - 'center', - 'right', - ], - }, - ], - }, - ], - }, - }, properties: { flip: { type: 'boolean', @@ -798,7 +663,7 @@ export const TransformSchema = { additionalProperties: false, }], }, - asci: { + ascii: { oneOf: [{ type: 'boolean', }, { @@ -835,7 +700,6 @@ export const TransformSchema = { properties: { files: { type: 'array', - additionalItems: false, minItems: 1, items: [{ type: 'string', @@ -1202,21 +1066,7 @@ export const TransformSchema = { type: 'boolean', }, workflows: { - type: 'array', - additionalItems: false, - minItems: 1, - maxItems: 20, - items: [{ - type: 'string', - }, { - type: 'object', - additionalProperties: false, - properties: { - id: { - type: 'string', - }, - }, - }], + '$ref': 'workflowsDef', }, }, }], diff --git a/src/schema/upload.schema.ts b/src/schema/upload.schema.ts new file mode 100644 index 00000000..2a35e241 --- /dev/null +++ b/src/schema/upload.schema.ts @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2018 by Filestack. + * Some rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +export const UploadParamsSchema = { + '$schema': 'http://json-schema.org/draft-07/schema#', + title: 'Filestack Upload', + description: 'Filestack Upload Options', + type: 'object', + additionalProperties: false, + properties: { + partSize: { + type: 'integer', + minimum: 5 * 1024 * 1024, + }, + concurrency: { + type: 'integer', + minimum: 1, + maximum: 20, + }, + progressInterval: { + type: 'integer', + minimum: 1, + }, + retry: { + type: 'integer', + minimum: 0, + maximum: 20, + }, + retryFactor: { + type: 'integer', + }, + retryMaxTime: { + type: 'integer', + }, + timeout: { + type: 'integer', + minimum: 1, + maximum: 60 * 60 * 1000, + }, + intelligent: { + oneOf: [{ + type: 'boolean', + }, { + type: 'string', + enum: ['fallback'], + }], + }, + intelligentChunkSize: { + type: 'integer', + }, + onProgress: { + format: 'callback', + }, + onRetry: { + format: 'callback', + }, + }, +}; diff --git a/src/schema/validator.ts b/src/schema/validator.ts index 8c2a5395..b3531099 100644 --- a/src/schema/validator.ts +++ b/src/schema/validator.ts @@ -15,15 +15,20 @@ * limitations under the License. */ import { Validator } from 'jsonschema'; +import { DefinitionsSchema } from './definitions.schema'; + +const v = new Validator(); + +Validator.prototype.customFormats.callback = (input) => typeof input === 'function'; +// check if element have HTML in to string method ie HTMLDivElement +Validator.prototype.customFormats.HTMLContainer = (input) => typeof input === 'string' || (input.toString && input.toString().indexOf('HTML') > -1); /** * Returns validator instance */ export const getValidator = (schema) => { - const v = new Validator(); - // v.addSchema(schema); return (params) => { + v.addSchema(DefinitionsSchema); return v.validate(params, schema); }; - // return validator().compile(schema); }; diff --git a/test/data/emptyfile.txt b/test/data/emptyfile.txt deleted file mode 100644 index e69de29b..00000000 diff --git a/test/data/fish.gif b/test/data/fish.gif deleted file mode 100644 index 733ca0e9..00000000 Binary files a/test/data/fish.gif and /dev/null differ diff --git a/test/data/testfile.txt b/test/data/testfile.txt deleted file mode 100644 index 31e0fce5..00000000 --- a/test/data/testfile.txt +++ /dev/null @@ -1 +0,0 @@ -helloworld diff --git a/test/mocha.opts b/test/mocha.opts deleted file mode 100644 index db26b424..00000000 --- a/test/mocha.opts +++ /dev/null @@ -1,5 +0,0 @@ ---require ./test/setup_node.js --r jsdom-global/register ---full-trace ---timeout 30000 -build/main/**/**/*.spec.js diff --git a/test/mocks/cloudApi/GET b/test/mocks/cloudApi/GET deleted file mode 100644 index f14ba55e..00000000 --- a/test/mocks/cloudApi/GET +++ /dev/null @@ -1,14 +0,0 @@ -{ - "requestUrl": "/cloud/prefetch?apikey=fakekey", - "contentType": "application/json", - "statusCode": 200, - "data": { - "intelligent_ingestion": false, - "blocked": false, - "blacklisted": false, - "whitelabel": true, - "customsource": true, - "customsource_name": "devportal-customers-assets-cs" - }, - "isBase64": false -} \ No newline at end of file diff --git a/test/mocks/cloudApi/POST b/test/mocks/cloudApi/POST deleted file mode 100644 index 3a8363d4..00000000 --- a/test/mocks/cloudApi/POST +++ /dev/null @@ -1,10 +0,0 @@ -{ - "requestUrl": "/cloud/folder/list", - "contentType": "application/json", - "statusCode": 200, - "data": { - "facebook": {}, - "token": "testtoken" - }, - "isBase64": false -} \ No newline at end of file diff --git a/test/mocks/fileApi/DELETE_secured b/test/mocks/fileApi/DELETE_secured deleted file mode 100644 index 2d54a254..00000000 --- a/test/mocks/fileApi/DELETE_secured +++ /dev/null @@ -1,8 +0,0 @@ -{ - "requestUrl": "/api/file/KGLjo6kgTCvvblCZyjhm?key=AQd22RYRWQD2ykJyvg7Pbz&policy=eyJleHBpcnkiOjE1MDgxNDE1MDR9&signature=2908b220968450ebdc718c90fcb894524dc1f2821d0304638507cb604367269f", - "contentType": "text/html; charset=utf-8", - "method": "DELETE", - "statusCode": 200, - "data": "success", - "isBase64": false -} \ No newline at end of file diff --git a/test/mocks/fileApi/GET b/test/mocks/fileApi/GET deleted file mode 100644 index 562d2570..00000000 --- a/test/mocks/fileApi/GET +++ /dev/null @@ -1,14 +0,0 @@ -{ - "requestUrl": "/api/file/iktJgGTURKC0HPGXegar/metadata", - "contentType": "application/json", - "method": "GET", - "statusCode": 200, - "data": { - "mimetype": "image/jpeg", - "uploaded": 1504120869761.631, - "size": 120305, - "writeable": true, - "filename": "Zanzibar_Red_Colobus_Monkey.jpg" - }, - "isBase64": false -} \ No newline at end of file diff --git a/test/mocks/fileApi/GET_secured b/test/mocks/fileApi/GET_secured deleted file mode 100644 index de1c30de..00000000 --- a/test/mocks/fileApi/GET_secured +++ /dev/null @@ -1,14 +0,0 @@ -{ - "requestUrl": "/api/file/NRbYPKrlQYSsdBubnbbF/metadata?policy=eyJleHBpcnkiOjE1MDgxNDE1MDR9&signature=2908b220968450ebdc718c90fcb894524dc1f2821d0304638507cb604367269f", - "contentType": "application/json", - "method": "GET", - "statusCode": 200, - "data": { - "mimetype": "image/jpeg", - "uploaded": 1504120815691.0068, - "size": 120305, - "writeable": true, - "filename": "Zanzibar_Red_Colobus_Monkey.jpg" - }, - "isBase64": false -} \ No newline at end of file diff --git a/test/mocks/fileApi/HEAD b/test/mocks/fileApi/HEAD deleted file mode 100644 index 8ff391ac..00000000 --- a/test/mocks/fileApi/HEAD +++ /dev/null @@ -1,7 +0,0 @@ -{ - "requestUrl": "/api/file/iktJgGTURKC0HPGXegar", - "contentType": "application/json", - "method": "HEAD", - "statusCode": 201, - "isBase64": false -} \ No newline at end of file diff --git a/test/mocks/fileApi/HEAD_secured b/test/mocks/fileApi/HEAD_secured deleted file mode 100644 index a718f7f6..00000000 --- a/test/mocks/fileApi/HEAD_secured +++ /dev/null @@ -1,7 +0,0 @@ -{ - "requestUrl": "/api/file/fakesecurelink?key=fakesecurkey&policy=fakepolicy&signature=fakesignature", - "contentType": "application/json", - "method": "HEAD", - "statusCode": 201, - "isBase64": false -} \ No newline at end of file diff --git a/test/mocks/intelligentUploadApi/POST_commit b/test/mocks/intelligentUploadApi/POST_commit deleted file mode 100644 index 71fb719b..00000000 --- a/test/mocks/intelligentUploadApi/POST_commit +++ /dev/null @@ -1,8 +0,0 @@ -{ - "requestUrl": "/multipart/commit", - "contentType": "application/json", - "method": "POST", - "statusCode": 200, - "data": {}, - "isBase64": false -} diff --git a/test/mocks/intelligentUploadApi/POST_complete b/test/mocks/intelligentUploadApi/POST_complete deleted file mode 100644 index a20b9213..00000000 --- a/test/mocks/intelligentUploadApi/POST_complete +++ /dev/null @@ -1,15 +0,0 @@ -{ - "requestUrl": "/multipart/complete", - "contentType": "application/json", - "method": "POST", - "statusCode": 200, - "data": { - "handle": "7xSJALUhSlCDCNujt5Ku", - "url": "https://agnostic-cdn.filestackapi.com/7xSJALUhSlCDCNujt5Ku", - "filename": "fish.gif", - "size": 12, - "mimetype": "image/gif", - "status": "InTransit" - }, - "isBase64": false -} diff --git a/test/mocks/intelligentUploadApi/POST_start b/test/mocks/intelligentUploadApi/POST_start deleted file mode 100644 index 52686d56..00000000 --- a/test/mocks/intelligentUploadApi/POST_start +++ /dev/null @@ -1,14 +0,0 @@ -{ - "requestUrl": "/multipart/start", - "contentType": "application/json", - "method": "POST", - "statusCode": 200, - "data": { - "uri": "/filestack-uploads-production-us-east-1/AJrB9kEilS1SQeHIDf3wtz/ZUt6FlmFS2ag5oWDMXWx_./test/data/testfile.txt", - "region": "us-east-1", - "upload_id": "1YV1FYlZpNzDlOp21dl2P_d.JNGK3HyNhl_VrQbO987yOvlaFZ8HZrNTiKHyP_vDB3Tsb.Xd5mSW4FyLjYjPsnsp1kecKPW5j5JXa7OO8J0x07EbwE34TPcR2MuQ0TcT", - "location_url": "upload-us-east-1.filestackapi.com", - "upload_type": "intelligent_ingestion" - }, - "isBase64": false -} \ No newline at end of file diff --git a/test/mocks/intelligentUploadApi/POST_upload b/test/mocks/intelligentUploadApi/POST_upload deleted file mode 100644 index 270d4a8f..00000000 --- a/test/mocks/intelligentUploadApi/POST_upload +++ /dev/null @@ -1,17 +0,0 @@ -{ - "requestUrl": "/multipart/upload", - "contentType": "application/json", - "method": "POST", - "statusCode": 200, - "data": { - "url": "https://s3.amazonaws.com/filestack-uploads-production-us-east-1/ii/AJrB9kEilS1SQeHIDf3wtz/1YV1FYlZpNzDlOp21dl2P_d.JNGK3HyNhl_VrQbO987yOvlaFZ8HZrNTiKHyP_vDB3Tsb.Xd5mSW4FyLjYjPsnsp1kecKPW5j5JXa7OO8J0x07EbwE34TPcR2MuQ0TcT/1/0?", - "headers": { - "Authorization": "AWS4-HMAC-SHA256 Credential=AKIAIZPVO2IP3EGGABFA/20170908/us-east-1/s3/aws4_request, SignedHeaders=content-length;content-md5;host;x-amz-date, Signature=8a1405069f86d8deff5b054adb04b327228bafb8c2750aed87e69f0bc72031ea", - "Content-MD5": "9lIZM9md0mPSWbXW/Ouv1w==", - "x-amz-content-sha256": "UNSIGNED-PAYLOAD", - "x-amz-date": "20170908T042929Z" - }, - "location_url": "upload-us-east-1.filestackapi.com" - }, - "isBase64": false -} \ No newline at end of file diff --git a/test/mocks/intelligentUploadApi/PUT_fakeS3 b/test/mocks/intelligentUploadApi/PUT_fakeS3 deleted file mode 100644 index f4f8b388..00000000 --- a/test/mocks/intelligentUploadApi/PUT_fakeS3 +++ /dev/null @@ -1,11 +0,0 @@ -{ - "requestUrl": "/fakeS3", - "method": "PUT", - "statusCode": 200, - "data": {}, - "headers": { - "Access-Control-Expose-Headers": "ETag", - "ETag": "c493aa4955f0591643c4115e8880ecb1" - }, - "isBase64": false -} diff --git a/test/mocks/storeApi/GET b/test/mocks/storeApi/GET deleted file mode 100644 index 6000c602..00000000 --- a/test/mocks/storeApi/GET +++ /dev/null @@ -1,13 +0,0 @@ -{ - "requestUrl": "/", - "contentType": "application/json", - "method": "GET", - "statusCode": 200, - "data": { - "url": "https://agnostic-cdn.filestackapi.com/bEtYfoSiQJ6dfJWE2Lia", - "size": 120305, - "type": "image/jpeg", - "filename": "Zanzibar_Red_Colobus_Monkey.jpg" - }, - "isBase64": false -} diff --git a/test/mocks/storeApi/GET_secured b/test/mocks/storeApi/GET_secured deleted file mode 100644 index 6000c602..00000000 --- a/test/mocks/storeApi/GET_secured +++ /dev/null @@ -1,13 +0,0 @@ -{ - "requestUrl": "/", - "contentType": "application/json", - "method": "GET", - "statusCode": 200, - "data": { - "url": "https://agnostic-cdn.filestackapi.com/bEtYfoSiQJ6dfJWE2Lia", - "size": 120305, - "type": "image/jpeg", - "filename": "Zanzibar_Red_Colobus_Monkey.jpg" - }, - "isBase64": false -} diff --git a/test/mocks/uploadApi/POST_complete b/test/mocks/uploadApi/POST_complete deleted file mode 100644 index d74d2e81..00000000 --- a/test/mocks/uploadApi/POST_complete +++ /dev/null @@ -1,15 +0,0 @@ -{ - "requestUrl": "/multipart/complete", - "contentType": "application/json", - "method": "POST", - "statusCode": 200, - "data": { - "handle": "7xSJALUhSlCDCNujt5Ku", - "url": "https://agnostic-cdn.filestackapi.com/7xSJALUhSlCDCNujt5Ku", - "filename": "dutton.gif", - "size": 35, - "mimetype": "image/gif", - "status": "Stored" - }, - "isBase64": false -} \ No newline at end of file diff --git a/test/mocks/uploadApi/POST_start b/test/mocks/uploadApi/POST_start deleted file mode 100644 index 174293fa..00000000 --- a/test/mocks/uploadApi/POST_start +++ /dev/null @@ -1,13 +0,0 @@ -{ - "requestUrl": "/multipart/start", - "contentType": "application/json", - "method": "POST", - "statusCode": 200, - "data": { - "uri": "/filestack-uploads-staging-us-east-1/aouha0SDRRWuGVbI17U2_dutton.gif", - "region": "us-east-1", - "upload_id": "ZKXAEc0mwNgfOetqQO7OXDqdlx79Tl2xduGbE8ERqLKCdjcJPrlU263PuwG_BWAIYJXM_e3chRDAnuTO7CdLKdOQ.8.ZfsK4wPysjxdNvaOA0PaYah_ty5VD70zrvxp3", - "location_url": "upload-stage-eu-west-1.filestackapi.com" - }, - "isBase64": false -} \ No newline at end of file diff --git a/test/mocks/uploadApi/POST_upload b/test/mocks/uploadApi/POST_upload deleted file mode 100644 index 416eb158..00000000 --- a/test/mocks/uploadApi/POST_upload +++ /dev/null @@ -1,17 +0,0 @@ -{ - "requestUrl": "/multipart/upload", - "contentType": "application/json", - "method": "POST", - "statusCode": 200, - "data": { - "url": "https://s3.amazonaws.com/filestack-uploads-staging-us-east-1/aouha0SDRRWuGVbI17U2_dutton.gif?partNumber=1&uploadId=ZKXAEc0mwNgfOetqQO7OXDqdlx79Tl2xduGbE8ERqLKCdjcJPrlU263PuwG_BWAIYJXM_e3chRDAnuTO7CdLKdOQ.8.ZfsK4wPysjxdNvaOA0PaYah_ty5VD70zrvxp3", - "headers": { - "Authorization": "AWS4-HMAC-SHA256 Credential=AKIAISIPCDAQIU54OJCQ/20170904/us-east-1/s3/aws4_request, SignedHeaders=content-length;content-md5;host;x-amz-date, Signature=201e71f7dcdf91302ec5715c8f0f2f5acca2664fac58a3f9043a296b7209f90b", - "Content-MD5": "xJOqSVXwWRZDxBFeiIDssQ==", - "x-amz-content-sha256": "UNSIGNED-PAYLOAD", - "x-amz-date": "20170904T190520Z" - }, - "location_url": "upload-stage-eu-west-1.filestackapi.com" - }, - "isBase64": false -} \ No newline at end of file diff --git a/test/mocks/uploadApi/PUT_fakeS3 b/test/mocks/uploadApi/PUT_fakeS3 deleted file mode 100644 index f4f8b388..00000000 --- a/test/mocks/uploadApi/PUT_fakeS3 +++ /dev/null @@ -1,11 +0,0 @@ -{ - "requestUrl": "/fakeS3", - "method": "PUT", - "statusCode": 200, - "data": {}, - "headers": { - "Access-Control-Expose-Headers": "ETag", - "ETag": "c493aa4955f0591643c4115e8880ecb1" - }, - "isBase64": false -} diff --git a/test/prism.js b/test/prism.js deleted file mode 100644 index f614342c..00000000 --- a/test/prism.js +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2017 by Filestack. - * Some rights reserved. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -var connect = require('connect'); -var prism = require('connect-prism'); -var http = require('http'); -var cors = require('cors'); - -const mode = process.argv[2] === '--record' ? 'mockrecord' : 'mock'; -const mocksPath = './test/mocks'; -const generateName = function(req) { - if (req.url.indexOf('policy=') !== -1) { - return req.method + '_' + 'secured'; - } - return req.method; -}; - -prism.create({ - name: 'cloudApi', - mode, - mocksPath, - context: '/cloud', - https: true, - port: 443, - mockFilenameGenerator: function(config, req) { - return generateName(req); - }, - host: 'cloud-rc.filestackapi.com', - changeOrigin: true, -}); - -prism.create({ - name: 'fileApi', - mode, - mocksPath, - context: '/api/file', - mockFilenameGenerator: function(config, req) { - return generateName(req); - }, - host: 'www.filestackapi.com', - changeOrigin: true, -}); - -prism.create({ - name: 'storeApi', - mode, - mocksPath, - context: '/cdn', - mockFilenameGenerator: function(config, req) { - return generateName(req); - }, - host: 'cdn.filestackcontent.com', - changeOrigin: true, -}); - -prism.create({ - name: 'uploadApi', - mode, - mocksPath, - context: '/upload', - rewrite: { - '^/upload': '', - }, - mockFilenameGenerator: function(config, req) { - const step = req.originalUrl.split('/').pop(); - return req.method + '_' + step; - }, - host: 'upload.filestackapi.com', -}); - -prism.create({ - name: 'intelligentUploadApi', - mode, - mocksPath, - https: true, - port: 443, - context: '/intelligentUpload', - rewrite: { - '^/intelligentUpload': '', - }, - mockFilenameGenerator: function(config, req) { - const step = req.originalUrl.split('/').pop(); - return req.method + '_' + step; - }, - host: 'upload.filestackapi.com', -}); - -var app = connect().use(cors()).use(prism.middleware); -http.createServer(app).listen(3000); diff --git a/test/setup.js b/test/setup.js deleted file mode 100644 index c68b0451..00000000 --- a/test/setup.js +++ /dev/null @@ -1,32 +0,0 @@ -const testEnv = process.env.TEST_ENV || 'unit'; -const urls = require('./urls.json')[testEnv]; -var ENV = window.ENV = { - session: { - apikey: process.env.TEST_APIKEY || 'fakekey', - urls: urls, - }, - intelligentSession: { - apikey: process.env.TEST_INTELLIGENT_APIKEY || 'fakekey', - urls: Object.assign({}, urls, { uploadApiUrl: urls.intelligentUploadApiUrl }), - }, - cloudSession: { - apikey: process.env.TEST_CLOUD_APIKEY || 'fakekey', - urls: urls, - }, - secureCloudSession: { - apikey: process.env.TEST_CLOUD_SECURE_APIKEY || 'fakesecurekey', - signature: process.env.TEST_CLOUD_SIGNATURE || 'fakesignature', - policy: process.env.TEST_CLOUD_POLICY || 'fakepolicy', - urls: urls, - }, - secureSession: { - apikey: process.env.TEST_SECURE_APIKEY || 'fakesecurekey', - signature: process.env.TEST_SIGNATURE || 'fakesignature', - policy: process.env.TEST_POLICY || 'fakepolicy', - urls: urls, - }, - filelink: process.env.TEST_FILELINK || 'W1LOh6RdqHqolomhqMUQ', - secureFilelink: process.env.TEST_SECURE_FILELINK || 'W1LOh6RdqHqolomhqMUQ', - urls: urls, - testEnv: testEnv, -}; diff --git a/test/setup_node.js b/test/setup_node.js deleted file mode 100644 index 24c43a51..00000000 --- a/test/setup_node.js +++ /dev/null @@ -1,34 +0,0 @@ -require('dotenv').config(); -const testEnv = process.env.TEST_ENV || 'unit'; -const urls = require('./urls.json')[testEnv]; -global.ENV = { - isNode: true, - session: { - apikey: process.env.TEST_APIKEY || 'fakekey', - urls, - }, - cloudSession: { - apikey: process.env.TEST_CLOUD_APIKEY || 'fakekey', - urls: urls, - }, - secureCloudSession: { - apikey: process.env.TEST_CLOUD_SECURE_APIKEY || 'fakesecurekey', - signature: process.env.TEST_CLOUD_SIGNATURE || 'fakesignature', - policy: process.env.TEST_CLOUD_POLICY || 'fakepolicy', - urls: urls, - }, - intelligentSession: { - apikey: process.env.TEST_INTELLIGENT_APIKEY || 'fakekey', - urls: Object.assign({}, urls, { uploadApiUrl: urls.intelligentUploadApiUrl }), - }, - secureSession: { - apikey: process.env.TEST_SECURE_APIKEY || 'fakesecurekey', - signature: process.env.TEST_SIGNATURE || 'fakesignature', - policy: process.env.TEST_POLICY || 'fakepolicy', - urls, - }, - filelink: process.env.TEST_FILELINK || 'W1LOh6RdqHqolomhqMUQ', - secureFilelink: process.env.TEST_SECURE_FILELINK || 'W1LOh6RdqHqolomhqMUQ', - urls, - testEnv, -}; diff --git a/test/toxy.js b/test/toxy.js deleted file mode 100644 index c1768a39..00000000 --- a/test/toxy.js +++ /dev/null @@ -1,61 +0,0 @@ -const cors = require('cors'); -const toxy = require('toxy'); -require('./setup_node.js'); - -const rules = toxy.rules; -const host = ENV.intelligentSession.urls.intelligentUploadApiUrl; - -const proxy500 = toxy(); -proxy500.use(cors()); -proxy500 - .forward(host) - .options({ forwardHost: true }); -proxy500 - .post('/multipart/upload') - .poison(toxy.poisons.inject({ - code: 500, - body: '{"error": "toxy injected error"}', - headers: { 'Content-Type': 'application/json' }, - })); -proxy500.all('/*'); -proxy500.listen(3001); -console.log('Launched toxy proxy with HTTP 500 poison on http://localhost:3001'); - -const proxyAbort = toxy(); -proxyAbort.use(cors()); -proxyAbort - .forward(host) - .options({ forwardHost: true }); -proxyAbort.put('/fakeS3').poison(toxy.poisons.abort()); -proxyAbort.all('/*'); -proxyAbort.listen(3002); -console.log('Launched toxy proxy with abort poison on http://localhost:3002'); - -const proxy400 = toxy(); -proxy400.use(cors()); -proxy400 - .forward(host) - .options({ forwardHost: true }); -proxy400 - .post('/multipart/upload') - .poison(toxy.poisons.inject({ - code: 400, - body: '{"error": "toxy injected error"}', - headers: { 'Content-Type': 'application/json' }, - })); -proxy400.all('/*'); -proxy400.listen(3003); -console.log('Launched toxy proxy with HTTP 400 poison on http://localhost:3003'); - -const proxySlowUpload = toxy(); -proxySlowUpload.use(cors()); -proxySlowUpload - .forward(host) - .options({ forwardHost: true }); - -proxySlowUpload.post('/multipart/upload') - .poison(toxy.poisons.slowOpen({ delay: 2000 })) -proxySlowUpload.all('/*'); -proxySlowUpload.listen(3004); -console.log('Launched toxy proxy with HTTP slowOpen on http://localhost:3004'); - diff --git a/test/urls.json b/test/urls.json deleted file mode 100644 index e580ce3b..00000000 --- a/test/urls.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "unit": { - "storeApiUrl": "http://localhost:3000/api/store", - "fileApiUrl": "http://localhost:3000/api/file", - "uploadApiUrl": "http://localhost:3000/upload", - "cloudApiUrl": "http://localhost:3000/cloud", - "intelligentUploadApiUrl": "http://localhost:3000/intelligentUpload", - "processApiUrl": "https://process-stage.filestackapi.com", - "cdnUrl": "http://localhost:3000/cdn", - "testImageUrl": "https://d1wtqaffaaj63z.cloudfront.net/images/Zanzibar_Red_Colobus_Monkey.jpg", - "proxy500": "http://localhost:3001", - "proxyAbort": "http://localhost:3002", - "proxy400": "http://localhost:3003", - "proxySlow": "http://localhost:3004" - }, - "integration": { - "storeApiUrl": "https://www.filestackapi.com/api/store", - "cloudApiUrl": "https://cloud-rc.filestackapi.com", - "fileApiUrl": "https://www.filestackapi.com/api/file", - "intelligentUploadApiUrl": "https://upload.filestackapi.com", - "uploadApiUrl": "https://upload.filestackapi.com", - "processApiUrl": "https://process-stage.filestackapi.com", - "cdnUrl": "https://process-stage.filestackapi.com", - "testImageUrl": "https://d1wtqaffaaj63z.cloudfront.net/images/Zanzibar_Red_Colobus_Monkey.jpg", - "proxy500": "http://localhost:3001", - "proxyAbort": "http://localhost:3002", - "proxy400": "http://localhost:3003", - "proxySlow": "http://localhost:3004" - } -} diff --git a/tsconfig.json b/tsconfig.json index 4606c833..dc02eb90 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,18 +10,16 @@ "inlineSourceMap": true, "listFiles": false, "traceResolution": false, + "skipLibCheck": true, "pretty": true, "lib" : [ "es6", "dom" ], - "types" : [ - "node", - "mocha" - ], "baseUrl": ".", "typeRoots": [ "@types", + "./node_modules/@types", "./src/types" ] }, @@ -29,7 +27,8 @@ "src/**/*.ts" ], "exclude": [ - "node_modules/**" + "node_modules/**", + "src/**/*.spec.ts" ], "compileOnSave": false, diff --git a/tsconfig.tslint.json b/tsconfig.tslint.json new file mode 100644 index 00000000..50305e60 --- /dev/null +++ b/tsconfig.tslint.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig", + "exclude": [] +} diff --git a/tslint.json b/tslint.json index deebcf2e..4261df21 100644 --- a/tslint.json +++ b/tslint.json @@ -1,6 +1,7 @@ { "extends": "tslint-config-semistandard", "rules": { + "deprecation": false, "file-header": [true, "Copyright"], "space-before-function-paren": false, "no-multi-spaces": false, diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..9a09d61a --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,90 @@ +const webpack = require('webpack'); +const CompressionPlugin = require('compression-webpack-plugin'); +const path = require('path'); +const fs = require('fs'); +const EsmWebpackPlugin = require('@purtuga/esm-webpack-plugin'); +const merge = require('lodash.merge'); +const CleanWebpackPlugin = require('clean-webpack-plugin'); +const WebpackAssetsManifest = require('webpack-assets-manifest'); +const banner = fs.readFileSync('./LICENSE', 'utf8').replace('{year}', new Date().getFullYear()); + +const config = { + mode: 'production', + node: { Buffer: false }, + watchOptions: { + ignored: /node_modules/ + }, + entry: './build/module/index.js', + output: { + libraryTarget: 'umd', + library: 'filestack', + path: path.resolve(__dirname, 'build/browser'), + filename: 'filestack.umd.js', + }, + module: { + rules: [ + { + test: /\.(js|jsx)$/, + use: { + loader: 'babel-loader', + options: { + presets: [ + [ + '@babel/preset-env', + { + targets: '> 0.25%, not dead, ie 11', + }, + ], + ], + }, + }, + }, + ], + }, + externals: [ + // those externals are only used in nodejs + 'fs', + 'crypto', + ], + plugins: [ + new CleanWebpackPlugin(), + new CompressionPlugin(), + new webpack.BannerPlugin({ banner }), + new webpack.DefinePlugin({ + 'process.env.NODE_ENV': '"production"', + }), + ], + devtool: 'source-map', +}; + +const umd = merge({}, config, { + output: { + libraryTarget: 'umd', + filename: 'filestack.umd.js', + }, +}); + +const esm = merge({}, config, { + output: { + libraryTarget: 'var', + filename: 'filestack.esm.js', + }, + plugins: [ + new EsmWebpackPlugin(), + ] +}); + +const prod = merge({}, config, { + output: { + libraryTarget: 'umd', + filename: 'filestack.min.js', + }, + plugins: [ + new WebpackAssetsManifest({ + writeToDisk: true, + integrity: true, + }), + ], +}); + +module.exports = [umd, prod, esm];