diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..a73e564 --- /dev/null +++ b/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["es2015"], + "compact": false +} diff --git a/.gitignore b/.gitignore index bd07d4e..3c3629e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ node_modules -/dist diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..b6e1cc7 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,3 @@ +printWidth: 100 +singleQuote: true + diff --git a/.travis.yml b/.travis.yml index 5da935e..bebb18c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ -sudo: false +sudo: required dist: trusty cache: yarn: true @@ -6,3 +6,11 @@ cache: language: node_js node_js: - "8" +addons: + chrome: stable + +before_script: + - export DISPLAY=:99.0 + - sh -e /etc/init.d/xvfb start + - sleep 3 + diff --git a/README.md b/README.md index 9674aad..925728d 100644 --- a/README.md +++ b/README.md @@ -21,14 +21,60 @@ import CD from 'cropduster'; ## Legacy Installation -If you are unable to use es6, you can find an es5 version at +To use Cropduster directly in the browser, loaded from a script tag, you can +find legacy versions at: http://projects.movableink.com/production/libs/cropduster.[version].js +Going forward, browser-ready versions of the library are available at: + +http://projects.movableink.com/production/libs/cropduster.browser.[version].js + Where you replace `[version]` with the version you want to use. ## API +### Asynchronous actions +Sometimes, Capturama needs to be explicitly told to hold off on finishing its +screen capture in order for some asynchronous actions to fire and complete. This +can be accomplished by calling `CD.pause` when an asynchronous action is about +to start, and `CD.resume` when it has completed. `pause` takes a `maxSuspension` +Number argument specifying the maximum amount of time in milliseconds that your +asynchronous action is allowed to take, and both functions take an optional +final argument of a String message explaining the suspension, purely used for +debugging the Capturama log. + +If you are using the Cropduster API for common asynchronous actions like +fetching a URL or an image with `CD.get` and `CD.getImage`, or if you are using +Promises directly, you do not need to manually call pause and resume. These +methods are used internally in the necessary places. However, if you are +doing something unusual that requires work to be delayed manually, each call to +`CD.pause` must have a corresponding call to `CD.resume`, or the request to +Capturama will eventually time out. + +Example: +```javascript +const target = document.getElementById('text-box'); +const customerQuality = CD.param('mi_customer_rating'); +const tenSeconds = 10 * 1000; + +if (customerQuality === 'very-good') { + target.innerText = 'good customers get images quickly'; +} else if (customerQuality === 'very-bad') { + CD.pause(tenSeconds, 'making bad customers wait for their email to load...'); + + setTimeout(() => { + target.innerText = 'bad customers have to wait for their images'; + CD.resume(); + }, 1000); +} +``` + +*NOTE:* Cropduster previously offered `CD.suspend` and `CD.capture` functions +that achieved a similar goal. These functions have been replaced with `pause` +and `resume`, to support a better synchronisation of state with Capturama, and +to give a clearer sense of how these functions affect Capturama's workflow. + ### Selecting elements `CD.$` is useful for getting an array of DOM elements via a CSS selector. It always returns an array. @@ -36,9 +82,18 @@ Where you replace `[version]` with the version you want to use. Example: ```javascript -var elements = CD.$('div.items'); -for(var i = 0; i < elements.length; i++) { - var element = elements[i]; +const elements = CD.$('div.items'); +for (let i = 0; i < elements.length; i++) { + const element = elements[i]; + element.style.display = 'none'; +} +``` + +or: + +```javascript +const elements = CD.$('div.items'); +for (const element of elements) { element.style.display = 'none'; } ``` @@ -51,7 +106,7 @@ Example: ```javascript // document.location is 'http://example.com/?fname=john -var fname = CD.param('fname'); +const fname = CD.param('fname'); console.log(fname); // logs 'john' ``` @@ -65,7 +120,8 @@ until the request completes. Note: the URL has to be CORS-accessible, see `CD.ge Example: ```javascript -CD.get('http://cors-enabled-site.com/page', function(data, status) { +CD.get('http://cors-enabled-site.com/page').then((response) => { + const { data, status, contentType } = response; CD.$('h1')[0].innerHTML = data.header; }); ``` @@ -79,8 +135,8 @@ CD.get('http://cors-enabled-site.com/page', { headers: { 'Accept': 'application/json' } -}, function(data, status) { - CD.$('h1')[0].innerHTML = data.h1; +}).then((response) => { + CD.$('h1')[0].innerHTML = response.data.h1; }) ``` @@ -94,8 +150,8 @@ page. Example: ```javascript -CD.getCORS('http://example.com/page', function(data, status) { - CD.$('h1')[0].innerHTML = data.header; +CD.getCORS('http://example.com/page').then((response) => { + CD.$('h1')[0].innerHTML = response.data.header; }); ``` @@ -162,6 +218,11 @@ console.log('If user clicks on the web crop, they will go to http://example.com' ## Changelog +### 5.0.0 + * Compiles the app with Webpack and Babel down to ES5 with sourcemaps. + * Returns Promises from CD.get, CD.getCORS, CD.getImage and CD.getImages + * NPM publishes the browser-ready script in dist/cropduster.browser.js + ### 4.1.0 * Add `withCredentials: true` to all `CD.get()` requests. diff --git a/dist/cropduster.browser.js b/dist/cropduster.browser.js new file mode 100644 index 0000000..83518db --- /dev/null +++ b/dist/cropduster.browser.js @@ -0,0 +1,2 @@ +var CD=function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,r){"use strict";function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t0&&document.getElementById("autofill_"+t)&&(document.getElementById("autofill_"+t).innerHTML=e[t])},throwError:function(e){u.miCaptureFallback(function(){MICapture.error(e)},function(){u.log("Capturama error: "+e)})},cancelRequest:function(e){u.miCaptureFallback(function(){MICapture.cancel(e)},function(){u.log("Request canceled: "+e)})},setImageRedirect:function(e){var t=document.getElementById("mi-redirect-image")||document.createElement("a");return t.href=e,t.id="mi-redirect-image",t.style.display="none",document.body.appendChild(t),t},setClickthrough:function(e){var t=document.getElementById("mi_dynamic_link")||document.createElement("a");return t.href=e,t.id="mi_dynamic_link",t.style.display="none",document.body.appendChild(t),t},setExtraData:function(e){var t=document.getElementById("mi-data")||document.createElement("div");t.id="mi-data",t.style.display="none";var r=void 0;try{r=JSON.parse(t.getAttribute("data-mi-data"))||{}}catch(e){r={}}for(var n in e)e.hasOwnProperty(n)&&(r[n]=e[n]);return t.setAttribute("data-mi-data",JSON.stringify(r)),document.body.appendChild(t),t},proxyUrl:function(e){var t=document.createElement("a");t.href=e;var r="";r="0"===t.port||""===t.port?"https:"===t.protocol?":443":"":":"+t.port;var n=t.hostname,o=t.pathname,a=t.search,i=t.hash;return u.CORS_PROXY_SERVER+"/"+n+r+o+a+i},_readyToCapture:!0,_reset:function(){u._readyToCapture=!0},pause:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"manual suspension";e&&(t+=", will end in "+e+"ms",setTimeout(function(){u.resume(t)},e)),u.miCaptureFallback(function(){MICapture.pause(t)},function(){u.log("paused: "+t)})},resume:function(e){u.miCaptureFallback(function(){MICapture.resume(e)},function(){u.log("resuming paused capture: "+e)})},getCORS:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments[2];return"function"==typeof t&&(r=t,t={}),t.corsCacheTime=t.corsCacheTime||1e4,/cors.movableink.com/.test(e)||(e=u.proxyUrl(e)),t.headers=t.headers||{},t.headers["x-reverse-proxy-ttl"]=t.corsCacheTime/1e3,t.headers["x-mi-cbe"]=this._hashForRequest(e,t),u.get(e,t,r)},get:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments[2];"function"==typeof t&&(r=t,t={});var n=function(){if(r&&"function"==typeof r)return u.log(a),r.apply(void 0,arguments)},o="xhr: "+e;return new Promise(function(r,a){try{var i=new XMLHttpRequest;if(i.onerror=function(){var t="XHR error for "+e+" - "+this.status+": "+this.statusText;u.resume(o),n(null),a(new Error(t))},i.onload=function(){var e=this.getResponseHeader("content-type"),t=this.responseText,a=this.status;if(a>=400)return this.onerror();u.resume(o),n(t,a,e),r({contentType:e,data:t,status:a})},i.open(t.method||"GET",e,!0),i.withCredentials=!0,t.headers)for(var c in t.headers)i.setRequestHeader(c,t.headers[c]);i.send(t.body),u.pause(t.maxSuspension,o)}catch(e){n(null),a({message:"Cropduster failed to create Promise: "+e,error:e})}})},getImage:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments[2];"function"==typeof t&&(r=t,t={});var n=function(){if(r&&"function"==typeof r)return u.log(a),r.apply(void 0,arguments)},o="getImage: "+e;return new Promise(function(r,a){var i=new Image;i.onload=function(){u.resume(o),n(i),r(i)},i.onerror=function(e){u.resume(o),n(null),a(e)},u.pause(t.maxSuspension,o),i.src=e})},getImages:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=this,n=arguments[2],o=arguments[3],i="getImages:";u.pause(t.maxSuspension,i),"function"==typeof t&&(o=n,n=t,t={});var c=e.map(function(e){return r.getImage(e,t.maxSuspension).then(function(e){return n&&n(e),e})});return Promise.all(c).then(function(e){return o&&(u.log(a),o(e)),u.resume(i),e},function(e){throw u.resume(i),new Error("Not all images loaded successfully")})},waitForAsset:function(e){u.miCaptureFallback(function(){MICapture.waitForAsset(e)},function(){u.log("Wait for asset: "+e)})},log:function(e){console.log(e)},miCaptureFallback:function(e,t){return!window.MICapture||"object"!==o(window.MICapture)?t():e()},_hashForRequest:function(e,t){var r=""+e+JSON.stringify(t),n=0;if(0===r.length)return n;for(var o=0;o 0) {\n if (document.getElementById('autofill_' + key)) {\n document.getElementById('autofill_' + key).innerHTML = params[key];\n }\n }\n }\n },\n throwError: function throwError(msg) {\n CD.miCaptureFallback(function () {\n MICapture.error(msg);\n }, function () {\n CD.log('Capturama error: ' + msg);\n });\n },\n cancelRequest: function cancelRequest(msg) {\n CD.miCaptureFallback(function () {\n MICapture.cancel(msg);\n }, function () {\n CD.log('Request canceled: ' + msg);\n });\n },\n setImageRedirect: function setImageRedirect(imageUrl) {\n var a = document.getElementById('mi-redirect-image') || document.createElement('a');\n\n a.href = imageUrl;\n a.id = 'mi-redirect-image';\n a.style.display = 'none';\n\n document.body.appendChild(a);\n\n return a;\n },\n setClickthrough: function setClickthrough(url) {\n var a = document.getElementById('mi_dynamic_link') || document.createElement('a');\n\n a.href = url;\n a.id = 'mi_dynamic_link';\n a.style.display = 'none';\n\n document.body.appendChild(a);\n\n return a;\n },\n setExtraData: function setExtraData(dataObject) {\n var el = document.getElementById('mi-data') || document.createElement('div');\n\n el.id = 'mi-data';\n el.style.display = 'none';\n\n var existingData = void 0;\n try {\n existingData = JSON.parse(el.getAttribute('data-mi-data')) || {};\n } catch (_) {\n // Overwrite if there was something in mi-data that wasn't JSON\n existingData = {};\n }\n\n for (var key in dataObject) {\n if (dataObject.hasOwnProperty(key)) {\n existingData[key] = dataObject[key];\n }\n }\n\n el.setAttribute('data-mi-data', JSON.stringify(existingData));\n document.body.appendChild(el);\n\n return el;\n },\n proxyUrl: function proxyUrl(url) {\n var a = document.createElement('a');\n a.href = url;\n\n var port = '';\n if (a.port === '0' || a.port === '') {\n port = a.protocol === 'https:' ? ':443' : '';\n } else {\n port = ':' + a.port;\n }\n\n var hostname = a.hostname,\n pathname = a.pathname,\n search = a.search,\n hash = a.hash;\n\n return CD.CORS_PROXY_SERVER + '/' + hostname + port + pathname + search + hash;\n },\n\n\n // internal, do not modify\n _readyToCapture: true,\n\n _reset: function _reset() {\n CD._readyToCapture = true;\n },\n pause: function pause(maxSuspension) {\n var msg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'manual suspension';\n\n if (maxSuspension) {\n msg += ', will end in ' + maxSuspension + 'ms';\n\n setTimeout(function () {\n CD.resume(msg);\n }, maxSuspension);\n }\n\n CD.miCaptureFallback(function () {\n MICapture.pause(msg);\n }, function () {\n CD.log('paused: ' + msg);\n });\n },\n resume: function resume(msg) {\n CD.miCaptureFallback(function () {\n MICapture.resume(msg);\n }, function () {\n CD.log('resuming paused capture: ' + msg);\n });\n },\n getCORS: function getCORS(url) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var callback = arguments[2];\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n options.corsCacheTime = options.corsCacheTime || 10 * 1000;\n if (!/cors.movableink.com/.test(url)) {\n url = CD.proxyUrl(url);\n }\n\n options.headers = options.headers || {};\n options.headers['x-reverse-proxy-ttl'] = options.corsCacheTime / 1000;\n options.headers['x-mi-cbe'] = this._hashForRequest(url, options);\n\n return CD.get(url, options, callback);\n },\n get: function get(url) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var callback = arguments[2];\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n var deprecatedCallback = function deprecatedCallback() {\n if (callback && typeof callback === 'function') {\n CD.log(DEPRECATION_MSG);\n return callback.apply(undefined, arguments);\n }\n };\n\n var msg = 'xhr: ' + url;\n\n return new Promise(function (resolve, reject) {\n try {\n var req = new XMLHttpRequest();\n\n req.onerror = function () {\n var error = 'XHR error for ' + url + ' - ' + this.status + ': ' + this.statusText;\n\n CD.resume(msg);\n\n deprecatedCallback(null);\n\n reject(new Error(error));\n };\n\n req.onload = function () {\n var contentType = this.getResponseHeader('content-type');\n var data = this.responseText;\n var status = this.status;\n\n if (status >= 400) {\n return this.onerror();\n }\n\n CD.resume(msg);\n\n deprecatedCallback(data, status, contentType);\n\n resolve({\n contentType: contentType,\n data: data,\n status: status\n });\n };\n\n req.open(options.method || 'GET', url, true);\n\n req.withCredentials = true;\n\n if (options.headers) {\n for (var header in options.headers) {\n req.setRequestHeader(header, options.headers[header]);\n }\n }\n\n req.send(options.body);\n CD.pause(options.maxSuspension, msg);\n } catch (error) {\n deprecatedCallback(null);\n\n reject({\n message: 'Cropduster failed to create Promise: ' + error,\n error: error\n });\n }\n });\n },\n getImage: function getImage(url) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var callback = arguments[2];\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n var deprecatedCallback = function deprecatedCallback() {\n if (callback && typeof callback === 'function') {\n CD.log(DEPRECATION_MSG);\n\n return callback.apply(undefined, arguments);\n }\n };\n\n var msg = 'getImage: ' + url;\n\n return new Promise(function (resolve, reject) {\n var img = new Image();\n\n img.onload = function () {\n CD.resume(msg);\n\n deprecatedCallback(img);\n\n resolve(img);\n };\n\n img.onerror = function (event) {\n CD.resume(msg);\n\n deprecatedCallback(null);\n\n reject(event);\n };\n\n CD.pause(options.maxSuspension, msg);\n img.src = url;\n });\n },\n\n\n /**\n * NOTE: getImages is intended to be used with promises. The `afterAll` callback is\n * now deprecated, and the order of the afterEach and afterAll arguments has\n * been reversed since previous versions of cropduster.\n *\n * To achieve the same effect, users should pass a single callback into the\n * arguments for getImages, and then use a `.then` call to handle any actions\n * after all images have finished loading.\n *\n * If any image fails to load, the Promise will reject.\n */\n getImages: function getImages(urls) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var _this = this;\n\n var afterEach = arguments[2];\n var afterAll = arguments[3];\n\n var msg = 'getImages:';\n CD.pause(options.maxSuspension, msg);\n\n if (typeof options === 'function') {\n afterAll = afterEach;\n afterEach = options;\n options = {};\n }\n\n var promises = urls.map(function (url) {\n return _this.getImage(url, options.maxSuspension).then(function (img) {\n if (afterEach) {\n afterEach(img);\n }\n\n return img;\n });\n });\n\n return Promise.all(promises).then(function (images) {\n if (afterAll) {\n CD.log(DEPRECATION_MSG);\n afterAll(images);\n }\n\n CD.resume(msg);\n return images;\n }, function (_) {\n CD.resume(msg);\n throw new Error('Not all images loaded successfully');\n });\n },\n waitForAsset: function waitForAsset(assetUrl) {\n CD.miCaptureFallback(function () {\n MICapture.waitForAsset(assetUrl);\n }, function () {\n CD.log('Wait for asset: ' + assetUrl);\n });\n },\n log: function log(message) {\n console.log(message);\n },\n miCaptureFallback: function miCaptureFallback(ifCapturama, ifBrowser) {\n var loadedInCapturama = !!window.MICapture && _typeof(window.MICapture) === 'object';\n return loadedInCapturama ? ifCapturama() : ifBrowser();\n },\n _hashForRequest: function _hashForRequest(url, options) {\n var str = '' + url + JSON.stringify(options);\n\n var hash = 0;\n if (str.length === 0) return hash;\n\n for (var i = 0; i < str.length; i++) {\n hash = (hash << 5) - hash + str.charCodeAt(i) & 0xffffffff;\n }\n\n return hash.toString();\n }\n};\n\nexports.default = CD;\n\n/***/ })\n/******/ ]);\n\n\n// WEBPACK FOOTER //\n// cropduster.browser.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap cd4318333c3a91af6a95","const DEPRECATION_MSG = 'callbacks are deprecated in cropduster, prefer using promises for asynchronous operations';\n\nconst CD = {\n CORS_PROXY_SERVER: 'http://cors.movableink.com',\n\n $(selector, doc) {\n if (!doc) {\n doc = document;\n }\n\n return [...doc.querySelectorAll(selector)];\n },\n\n _initParams() {\n CD._urlParams = {};\n const search = /([^&=]+)=?([^&]*)/g;\n const query = CD._searchString();\n\n let match = search.exec(query);\n while (match) {\n CD._urlParams[decodeURIComponent(match[1])] = decodeURIComponent(match[2]);\n match = search.exec(query);\n }\n },\n\n param(name) {\n return CD.params()[name];\n },\n\n params(name) {\n let params = CD._urlParams;\n if (typeof params === 'undefined') {\n CD._initParams();\n params = CD._urlParams;\n }\n\n if (name) {\n return params[name];\n } else {\n return params;\n }\n },\n\n _searchString() {\n return window.location.search.substring(1);\n },\n\n autofill() {\n CD.param('init'); // inits CD._urlParams\n const params = CD._urlParams;\n for (const key in params) {\n if (params[key] !== 'undefined' && params[key].length > 0) {\n if (document.getElementById(`autofill_${key}`)) {\n document.getElementById(`autofill_${key}`).innerHTML = params[key];\n }\n }\n }\n },\n\n throwError(msg) {\n CD.miCaptureFallback(\n () => { MICapture.error(msg); },\n () => { CD.log('Capturama error: ' + msg) }\n );\n },\n\n cancelRequest(msg) {\n CD.miCaptureFallback(\n () => { MICapture.cancel(msg); },\n () => { CD.log(`Request canceled: ${msg}`); }\n );\n },\n\n setImageRedirect(imageUrl) {\n const a = document.getElementById('mi-redirect-image') || document.createElement('a');\n\n a.href = imageUrl;\n a.id = 'mi-redirect-image';\n a.style.display = 'none';\n\n document.body.appendChild(a);\n\n return a;\n },\n\n setClickthrough(url) {\n const a = document.getElementById('mi_dynamic_link') || document.createElement('a');\n\n a.href = url;\n a.id = 'mi_dynamic_link';\n a.style.display = 'none';\n\n document.body.appendChild(a);\n\n return a;\n },\n\n setExtraData(dataObject) {\n const el = document.getElementById('mi-data') || document.createElement('div');\n\n el.id = 'mi-data';\n el.style.display = 'none';\n\n let existingData;\n try {\n existingData = JSON.parse(el.getAttribute('data-mi-data')) || {};\n } catch (_) {\n // Overwrite if there was something in mi-data that wasn't JSON\n existingData = {};\n }\n\n for (const key in dataObject) {\n if (dataObject.hasOwnProperty(key)) {\n existingData[key] = dataObject[key];\n }\n }\n\n el.setAttribute('data-mi-data', JSON.stringify(existingData));\n document.body.appendChild(el);\n\n return el;\n },\n\n proxyUrl(url) {\n const a = document.createElement('a');\n a.href = url;\n\n let port = '';\n if (a.port === '0' || a.port === '') {\n port = a.protocol === 'https:' ? ':443' : '';\n } else {\n port = `:${a.port}`;\n }\n\n const { hostname, pathname, search, hash } = a;\n return `${CD.CORS_PROXY_SERVER}/${hostname}${port}${pathname}${search}${hash}`;\n },\n\n // internal, do not modify\n _readyToCapture: true,\n\n _reset() {\n CD._readyToCapture = true;\n },\n\n pause(maxSuspension, msg = 'manual suspension') {\n if (maxSuspension) {\n msg += `, will end in ${maxSuspension}ms`;\n\n setTimeout(() => {\n CD.resume(msg);\n }, maxSuspension);\n }\n\n CD.miCaptureFallback(\n () => { MICapture.pause(msg) },\n () => { CD.log(`paused: ${msg}`) }\n );\n },\n\n resume(msg) {\n CD.miCaptureFallback(\n () => { MICapture.resume(msg) },\n () => { CD.log(`resuming paused capture: ${msg}`)}\n );\n },\n\n getCORS(url, options = {}, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n options.corsCacheTime = options.corsCacheTime || 10 * 1000;\n if (!/cors.movableink.com/.test(url)) {\n url = CD.proxyUrl(url);\n }\n\n options.headers = options.headers || {};\n options.headers['x-reverse-proxy-ttl'] = options.corsCacheTime / 1000;\n options.headers['x-mi-cbe'] = this._hashForRequest(url, options);\n\n return CD.get(url, options, callback);\n },\n\n get(url, options = {}, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n const deprecatedCallback = function() {\n if (callback && typeof callback === 'function') {\n CD.log(DEPRECATION_MSG);\n return callback(...arguments);\n }\n };\n\n const msg = `xhr: ${url}`;\n\n return new Promise(function(resolve, reject) {\n try {\n const req = new XMLHttpRequest();\n\n req.onerror = function() {\n const error = `XHR error for ${url} - ${this.status}: ${this.statusText}`;\n\n CD.resume(msg);\n\n deprecatedCallback(null);\n\n reject(new Error(error));\n };\n\n req.onload = function() {\n const contentType = this.getResponseHeader('content-type');\n const data = this.responseText;\n const status = this.status;\n\n if (status >= 400) {\n return this.onerror();\n }\n\n CD.resume(msg);\n\n deprecatedCallback(data, status, contentType);\n\n resolve({\n contentType,\n data,\n status\n });\n };\n\n req.open(options.method || 'GET', url, true);\n\n req.withCredentials = true;\n\n if (options.headers) {\n for (const header in options.headers) {\n req.setRequestHeader(header, options.headers[header]);\n }\n }\n\n req.send(options.body);\n CD.pause(options.maxSuspension, msg);\n } catch (error) {\n deprecatedCallback(null);\n\n reject({\n message: `Cropduster failed to create Promise: ${error}`,\n error: error\n });\n }\n });\n },\n\n getImage(url, options = {}, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n const deprecatedCallback = function() {\n if (callback && typeof callback === 'function') {\n CD.log(DEPRECATION_MSG);\n\n return callback(...arguments);\n }\n };\n\n const msg = `getImage: ${url}`;\n\n return new Promise(function(resolve, reject) {\n const img = new Image();\n\n img.onload = function() {\n CD.resume(msg);\n\n deprecatedCallback(img);\n\n resolve(img);\n };\n\n img.onerror = function(event) {\n CD.resume(msg);\n\n deprecatedCallback(null);\n\n reject(event);\n };\n\n CD.pause(options.maxSuspension, msg);\n img.src = url;\n });\n },\n\n /**\n * NOTE: getImages is intended to be used with promises. The `afterAll` callback is\n * now deprecated, and the order of the afterEach and afterAll arguments has\n * been reversed since previous versions of cropduster.\n *\n * To achieve the same effect, users should pass a single callback into the\n * arguments for getImages, and then use a `.then` call to handle any actions\n * after all images have finished loading.\n *\n * If any image fails to load, the Promise will reject.\n */\n getImages(urls, options = {}, afterEach, afterAll) {\n const msg = 'getImages:';\n CD.pause(options.maxSuspension, msg);\n\n if (typeof options === 'function') {\n afterAll = afterEach;\n afterEach = options;\n options = {};\n }\n\n const promises = urls.map(url => {\n return this.getImage(url, options.maxSuspension).then(img => {\n if (afterEach) {\n afterEach(img);\n }\n\n return img;\n });\n });\n\n return Promise.all(promises).then(\n images => {\n if (afterAll) {\n CD.log(DEPRECATION_MSG);\n afterAll(images);\n }\n\n CD.resume(msg);\n return images;\n },\n _ => {\n CD.resume(msg);\n throw new Error('Not all images loaded successfully');\n });\n },\n\n waitForAsset(assetUrl) {\n CD.miCaptureFallback(\n () => { MICapture.waitForAsset(assetUrl); },\n () => { CD.log(`Wait for asset: ${assetUrl}`); }\n );\n },\n\n log(message) {\n console.log(message);\n },\n\n miCaptureFallback(ifCapturama, ifBrowser) {\n const loadedInCapturama = !!window.MICapture && typeof window.MICapture === 'object';\n return loadedInCapturama ? ifCapturama() : ifBrowser();\n },\n\n _hashForRequest(url, options) {\n const str = `${url}${JSON.stringify(options)}`;\n\n let hash = 0;\n if (str.length === 0) return hash;\n\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) & 0xffffffff;\n }\n\n return hash.toString();\n }\n};\n\nexport default CD;\n\n\n\n// WEBPACK FOOTER //\n// ./src/cropduster.js"],"sourceRoot":""} \ No newline at end of file diff --git a/dist/cropduster.js b/dist/cropduster.js new file mode 100644 index 0000000..13867da --- /dev/null +++ b/dist/cropduster.js @@ -0,0 +1,2 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.cropduster=t():e.cropduster=t()}("undefined"!=typeof self?self:this,function(){return function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var r={};return t.m=e,t.c=r,t.d=function(e,r,n){t.o(e,r)||Object.defineProperty(e,r,{configurable:!1,enumerable:!0,get:n})},t.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(r,"a",r),r},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,r){"use strict";function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t0&&document.getElementById("autofill_"+t)&&(document.getElementById("autofill_"+t).innerHTML=e[t])},throwError:function(e){u.miCaptureFallback(function(){MICapture.error(e)},function(){u.log("Capturama error: "+e)})},cancelRequest:function(e){u.miCaptureFallback(function(){MICapture.cancel(e)},function(){u.log("Request canceled: "+e)})},setImageRedirect:function(e){var t=document.getElementById("mi-redirect-image")||document.createElement("a");return t.href=e,t.id="mi-redirect-image",t.style.display="none",document.body.appendChild(t),t},setClickthrough:function(e){var t=document.getElementById("mi_dynamic_link")||document.createElement("a");return t.href=e,t.id="mi_dynamic_link",t.style.display="none",document.body.appendChild(t),t},setExtraData:function(e){var t=document.getElementById("mi-data")||document.createElement("div");t.id="mi-data",t.style.display="none";var r=void 0;try{r=JSON.parse(t.getAttribute("data-mi-data"))||{}}catch(e){r={}}for(var n in e)e.hasOwnProperty(n)&&(r[n]=e[n]);return t.setAttribute("data-mi-data",JSON.stringify(r)),document.body.appendChild(t),t},proxyUrl:function(e){var t=document.createElement("a");t.href=e;var r="";r="0"===t.port||""===t.port?"https:"===t.protocol?":443":"":":"+t.port;var n=t.hostname,o=t.pathname,a=t.search,i=t.hash;return u.CORS_PROXY_SERVER+"/"+n+r+o+a+i},_readyToCapture:!0,_reset:function(){u._readyToCapture=!0},pause:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"manual suspension";e&&(t+=", will end in "+e+"ms",setTimeout(function(){u.resume(t)},e)),u.miCaptureFallback(function(){MICapture.pause(t)},function(){u.log("paused: "+t)})},resume:function(e){u.miCaptureFallback(function(){MICapture.resume(e)},function(){u.log("resuming paused capture: "+e)})},getCORS:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments[2];return"function"==typeof t&&(r=t,t={}),t.corsCacheTime=t.corsCacheTime||1e4,/cors.movableink.com/.test(e)||(e=u.proxyUrl(e)),t.headers=t.headers||{},t.headers["x-reverse-proxy-ttl"]=t.corsCacheTime/1e3,t.headers["x-mi-cbe"]=this._hashForRequest(e,t),u.get(e,t,r)},get:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments[2];"function"==typeof t&&(r=t,t={});var n=function(){if(r&&"function"==typeof r)return u.log(a),r.apply(void 0,arguments)},o="xhr: "+e;return new Promise(function(r,a){try{var i=new XMLHttpRequest;if(i.onerror=function(){var t="XHR error for "+e+" - "+this.status+": "+this.statusText;u.resume(o),n(null),a(new Error(t))},i.onload=function(){var e=this.getResponseHeader("content-type"),t=this.responseText,a=this.status;if(a>=400)return this.onerror();u.resume(o),n(t,a,e),r({contentType:e,data:t,status:a})},i.open(t.method||"GET",e,!0),i.withCredentials=!0,t.headers)for(var c in t.headers)i.setRequestHeader(c,t.headers[c]);i.send(t.body),u.pause(t.maxSuspension,o)}catch(e){n(null),a({message:"Cropduster failed to create Promise: "+e,error:e})}})},getImage:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments[2];"function"==typeof t&&(r=t,t={});var n=function(){if(r&&"function"==typeof r)return u.log(a),r.apply(void 0,arguments)},o="getImage: "+e;return new Promise(function(r,a){var i=new Image;i.onload=function(){u.resume(o),n(i),r(i)},i.onerror=function(e){u.resume(o),n(null),a(e)},u.pause(t.maxSuspension,o),i.src=e})},getImages:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=this,n=arguments[2],o=arguments[3],i="getImages:";u.pause(t.maxSuspension,i),"function"==typeof t&&(o=n,n=t,t={});var c=e.map(function(e){return r.getImage(e,t.maxSuspension).then(function(e){return n&&n(e),e})});return Promise.all(c).then(function(e){return o&&(u.log(a),o(e)),u.resume(i),e},function(e){throw u.resume(i),new Error("Not all images loaded successfully")})},waitForAsset:function(e){u.miCaptureFallback(function(){MICapture.waitForAsset(e)},function(){u.log("Wait for asset: "+e)})},log:function(e){console.log(e)},miCaptureFallback:function(e,t){return!window.MICapture||"object"!==o(window.MICapture)?t():e()},_hashForRequest:function(e,t){var r=""+e+JSON.stringify(t),n=0;if(0===r.length)return n;for(var o=0;o 0) {\n if (document.getElementById('autofill_' + key)) {\n document.getElementById('autofill_' + key).innerHTML = params[key];\n }\n }\n }\n },\n throwError: function throwError(msg) {\n CD.miCaptureFallback(function () {\n MICapture.error(msg);\n }, function () {\n CD.log('Capturama error: ' + msg);\n });\n },\n cancelRequest: function cancelRequest(msg) {\n CD.miCaptureFallback(function () {\n MICapture.cancel(msg);\n }, function () {\n CD.log('Request canceled: ' + msg);\n });\n },\n setImageRedirect: function setImageRedirect(imageUrl) {\n var a = document.getElementById('mi-redirect-image') || document.createElement('a');\n\n a.href = imageUrl;\n a.id = 'mi-redirect-image';\n a.style.display = 'none';\n\n document.body.appendChild(a);\n\n return a;\n },\n setClickthrough: function setClickthrough(url) {\n var a = document.getElementById('mi_dynamic_link') || document.createElement('a');\n\n a.href = url;\n a.id = 'mi_dynamic_link';\n a.style.display = 'none';\n\n document.body.appendChild(a);\n\n return a;\n },\n setExtraData: function setExtraData(dataObject) {\n var el = document.getElementById('mi-data') || document.createElement('div');\n\n el.id = 'mi-data';\n el.style.display = 'none';\n\n var existingData = void 0;\n try {\n existingData = JSON.parse(el.getAttribute('data-mi-data')) || {};\n } catch (_) {\n // Overwrite if there was something in mi-data that wasn't JSON\n existingData = {};\n }\n\n for (var key in dataObject) {\n if (dataObject.hasOwnProperty(key)) {\n existingData[key] = dataObject[key];\n }\n }\n\n el.setAttribute('data-mi-data', JSON.stringify(existingData));\n document.body.appendChild(el);\n\n return el;\n },\n proxyUrl: function proxyUrl(url) {\n var a = document.createElement('a');\n a.href = url;\n\n var port = '';\n if (a.port === '0' || a.port === '') {\n port = a.protocol === 'https:' ? ':443' : '';\n } else {\n port = ':' + a.port;\n }\n\n var hostname = a.hostname,\n pathname = a.pathname,\n search = a.search,\n hash = a.hash;\n\n return CD.CORS_PROXY_SERVER + '/' + hostname + port + pathname + search + hash;\n },\n\n\n // internal, do not modify\n _readyToCapture: true,\n\n _reset: function _reset() {\n CD._readyToCapture = true;\n },\n pause: function pause(maxSuspension) {\n var msg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'manual suspension';\n\n if (maxSuspension) {\n msg += ', will end in ' + maxSuspension + 'ms';\n\n setTimeout(function () {\n CD.resume(msg);\n }, maxSuspension);\n }\n\n CD.miCaptureFallback(function () {\n MICapture.pause(msg);\n }, function () {\n CD.log('paused: ' + msg);\n });\n },\n resume: function resume(msg) {\n CD.miCaptureFallback(function () {\n MICapture.resume(msg);\n }, function () {\n CD.log('resuming paused capture: ' + msg);\n });\n },\n getCORS: function getCORS(url) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var callback = arguments[2];\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n options.corsCacheTime = options.corsCacheTime || 10 * 1000;\n if (!/cors.movableink.com/.test(url)) {\n url = CD.proxyUrl(url);\n }\n\n options.headers = options.headers || {};\n options.headers['x-reverse-proxy-ttl'] = options.corsCacheTime / 1000;\n options.headers['x-mi-cbe'] = this._hashForRequest(url, options);\n\n return CD.get(url, options, callback);\n },\n get: function get(url) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var callback = arguments[2];\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n var deprecatedCallback = function deprecatedCallback() {\n if (callback && typeof callback === 'function') {\n CD.log(DEPRECATION_MSG);\n return callback.apply(undefined, arguments);\n }\n };\n\n var msg = 'xhr: ' + url;\n\n return new Promise(function (resolve, reject) {\n try {\n var req = new XMLHttpRequest();\n\n req.onerror = function () {\n var error = 'XHR error for ' + url + ' - ' + this.status + ': ' + this.statusText;\n\n CD.resume(msg);\n\n deprecatedCallback(null);\n\n reject(new Error(error));\n };\n\n req.onload = function () {\n var contentType = this.getResponseHeader('content-type');\n var data = this.responseText;\n var status = this.status;\n\n if (status >= 400) {\n return this.onerror();\n }\n\n CD.resume(msg);\n\n deprecatedCallback(data, status, contentType);\n\n resolve({\n contentType: contentType,\n data: data,\n status: status\n });\n };\n\n req.open(options.method || 'GET', url, true);\n\n req.withCredentials = true;\n\n if (options.headers) {\n for (var header in options.headers) {\n req.setRequestHeader(header, options.headers[header]);\n }\n }\n\n req.send(options.body);\n CD.pause(options.maxSuspension, msg);\n } catch (error) {\n deprecatedCallback(null);\n\n reject({\n message: 'Cropduster failed to create Promise: ' + error,\n error: error\n });\n }\n });\n },\n getImage: function getImage(url) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var callback = arguments[2];\n\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n var deprecatedCallback = function deprecatedCallback() {\n if (callback && typeof callback === 'function') {\n CD.log(DEPRECATION_MSG);\n\n return callback.apply(undefined, arguments);\n }\n };\n\n var msg = 'getImage: ' + url;\n\n return new Promise(function (resolve, reject) {\n var img = new Image();\n\n img.onload = function () {\n CD.resume(msg);\n\n deprecatedCallback(img);\n\n resolve(img);\n };\n\n img.onerror = function (event) {\n CD.resume(msg);\n\n deprecatedCallback(null);\n\n reject(event);\n };\n\n CD.pause(options.maxSuspension, msg);\n img.src = url;\n });\n },\n\n\n /**\n * NOTE: getImages is intended to be used with promises. The `afterAll` callback is\n * now deprecated, and the order of the afterEach and afterAll arguments has\n * been reversed since previous versions of cropduster.\n *\n * To achieve the same effect, users should pass a single callback into the\n * arguments for getImages, and then use a `.then` call to handle any actions\n * after all images have finished loading.\n *\n * If any image fails to load, the Promise will reject.\n */\n getImages: function getImages(urls) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n var _this = this;\n\n var afterEach = arguments[2];\n var afterAll = arguments[3];\n\n var msg = 'getImages:';\n CD.pause(options.maxSuspension, msg);\n\n if (typeof options === 'function') {\n afterAll = afterEach;\n afterEach = options;\n options = {};\n }\n\n var promises = urls.map(function (url) {\n return _this.getImage(url, options.maxSuspension).then(function (img) {\n if (afterEach) {\n afterEach(img);\n }\n\n return img;\n });\n });\n\n return Promise.all(promises).then(function (images) {\n if (afterAll) {\n CD.log(DEPRECATION_MSG);\n afterAll(images);\n }\n\n CD.resume(msg);\n return images;\n }, function (_) {\n CD.resume(msg);\n throw new Error('Not all images loaded successfully');\n });\n },\n waitForAsset: function waitForAsset(assetUrl) {\n CD.miCaptureFallback(function () {\n MICapture.waitForAsset(assetUrl);\n }, function () {\n CD.log('Wait for asset: ' + assetUrl);\n });\n },\n log: function log(message) {\n console.log(message);\n },\n miCaptureFallback: function miCaptureFallback(ifCapturama, ifBrowser) {\n var loadedInCapturama = !!window.MICapture && _typeof(window.MICapture) === 'object';\n return loadedInCapturama ? ifCapturama() : ifBrowser();\n },\n _hashForRequest: function _hashForRequest(url, options) {\n var str = '' + url + JSON.stringify(options);\n\n var hash = 0;\n if (str.length === 0) return hash;\n\n for (var i = 0; i < str.length; i++) {\n hash = (hash << 5) - hash + str.charCodeAt(i) & 0xffffffff;\n }\n\n return hash.toString();\n }\n};\n\nexports.default = CD;\n\n/***/ })\n/******/ ]);\n});\n\n\n// WEBPACK FOOTER //\n// cropduster.js"," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 0);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 71553efd817d940fac49","const DEPRECATION_MSG = 'callbacks are deprecated in cropduster, prefer using promises for asynchronous operations';\n\nconst CD = {\n CORS_PROXY_SERVER: 'http://cors.movableink.com',\n\n $(selector, doc) {\n if (!doc) {\n doc = document;\n }\n\n return [...doc.querySelectorAll(selector)];\n },\n\n _initParams() {\n CD._urlParams = {};\n const search = /([^&=]+)=?([^&]*)/g;\n const query = CD._searchString();\n\n let match = search.exec(query);\n while (match) {\n CD._urlParams[decodeURIComponent(match[1])] = decodeURIComponent(match[2]);\n match = search.exec(query);\n }\n },\n\n param(name) {\n return CD.params()[name];\n },\n\n params(name) {\n let params = CD._urlParams;\n if (typeof params === 'undefined') {\n CD._initParams();\n params = CD._urlParams;\n }\n\n if (name) {\n return params[name];\n } else {\n return params;\n }\n },\n\n _searchString() {\n return window.location.search.substring(1);\n },\n\n autofill() {\n CD.param('init'); // inits CD._urlParams\n const params = CD._urlParams;\n for (const key in params) {\n if (params[key] !== 'undefined' && params[key].length > 0) {\n if (document.getElementById(`autofill_${key}`)) {\n document.getElementById(`autofill_${key}`).innerHTML = params[key];\n }\n }\n }\n },\n\n throwError(msg) {\n CD.miCaptureFallback(\n () => { MICapture.error(msg); },\n () => { CD.log('Capturama error: ' + msg) }\n );\n },\n\n cancelRequest(msg) {\n CD.miCaptureFallback(\n () => { MICapture.cancel(msg); },\n () => { CD.log(`Request canceled: ${msg}`); }\n );\n },\n\n setImageRedirect(imageUrl) {\n const a = document.getElementById('mi-redirect-image') || document.createElement('a');\n\n a.href = imageUrl;\n a.id = 'mi-redirect-image';\n a.style.display = 'none';\n\n document.body.appendChild(a);\n\n return a;\n },\n\n setClickthrough(url) {\n const a = document.getElementById('mi_dynamic_link') || document.createElement('a');\n\n a.href = url;\n a.id = 'mi_dynamic_link';\n a.style.display = 'none';\n\n document.body.appendChild(a);\n\n return a;\n },\n\n setExtraData(dataObject) {\n const el = document.getElementById('mi-data') || document.createElement('div');\n\n el.id = 'mi-data';\n el.style.display = 'none';\n\n let existingData;\n try {\n existingData = JSON.parse(el.getAttribute('data-mi-data')) || {};\n } catch (_) {\n // Overwrite if there was something in mi-data that wasn't JSON\n existingData = {};\n }\n\n for (const key in dataObject) {\n if (dataObject.hasOwnProperty(key)) {\n existingData[key] = dataObject[key];\n }\n }\n\n el.setAttribute('data-mi-data', JSON.stringify(existingData));\n document.body.appendChild(el);\n\n return el;\n },\n\n proxyUrl(url) {\n const a = document.createElement('a');\n a.href = url;\n\n let port = '';\n if (a.port === '0' || a.port === '') {\n port = a.protocol === 'https:' ? ':443' : '';\n } else {\n port = `:${a.port}`;\n }\n\n const { hostname, pathname, search, hash } = a;\n return `${CD.CORS_PROXY_SERVER}/${hostname}${port}${pathname}${search}${hash}`;\n },\n\n // internal, do not modify\n _readyToCapture: true,\n\n _reset() {\n CD._readyToCapture = true;\n },\n\n pause(maxSuspension, msg = 'manual suspension') {\n if (maxSuspension) {\n msg += `, will end in ${maxSuspension}ms`;\n\n setTimeout(() => {\n CD.resume(msg);\n }, maxSuspension);\n }\n\n CD.miCaptureFallback(\n () => { MICapture.pause(msg) },\n () => { CD.log(`paused: ${msg}`) }\n );\n },\n\n resume(msg) {\n CD.miCaptureFallback(\n () => { MICapture.resume(msg) },\n () => { CD.log(`resuming paused capture: ${msg}`)}\n );\n },\n\n getCORS(url, options = {}, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n options.corsCacheTime = options.corsCacheTime || 10 * 1000;\n if (!/cors.movableink.com/.test(url)) {\n url = CD.proxyUrl(url);\n }\n\n options.headers = options.headers || {};\n options.headers['x-reverse-proxy-ttl'] = options.corsCacheTime / 1000;\n options.headers['x-mi-cbe'] = this._hashForRequest(url, options);\n\n return CD.get(url, options, callback);\n },\n\n get(url, options = {}, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n const deprecatedCallback = function() {\n if (callback && typeof callback === 'function') {\n CD.log(DEPRECATION_MSG);\n return callback(...arguments);\n }\n };\n\n const msg = `xhr: ${url}`;\n\n return new Promise(function(resolve, reject) {\n try {\n const req = new XMLHttpRequest();\n\n req.onerror = function() {\n const error = `XHR error for ${url} - ${this.status}: ${this.statusText}`;\n\n CD.resume(msg);\n\n deprecatedCallback(null);\n\n reject(new Error(error));\n };\n\n req.onload = function() {\n const contentType = this.getResponseHeader('content-type');\n const data = this.responseText;\n const status = this.status;\n\n if (status >= 400) {\n return this.onerror();\n }\n\n CD.resume(msg);\n\n deprecatedCallback(data, status, contentType);\n\n resolve({\n contentType,\n data,\n status\n });\n };\n\n req.open(options.method || 'GET', url, true);\n\n req.withCredentials = true;\n\n if (options.headers) {\n for (const header in options.headers) {\n req.setRequestHeader(header, options.headers[header]);\n }\n }\n\n req.send(options.body);\n CD.pause(options.maxSuspension, msg);\n } catch (error) {\n deprecatedCallback(null);\n\n reject({\n message: `Cropduster failed to create Promise: ${error}`,\n error: error\n });\n }\n });\n },\n\n getImage(url, options = {}, callback) {\n if (typeof options === 'function') {\n callback = options;\n options = {};\n }\n\n const deprecatedCallback = function() {\n if (callback && typeof callback === 'function') {\n CD.log(DEPRECATION_MSG);\n\n return callback(...arguments);\n }\n };\n\n const msg = `getImage: ${url}`;\n\n return new Promise(function(resolve, reject) {\n const img = new Image();\n\n img.onload = function() {\n CD.resume(msg);\n\n deprecatedCallback(img);\n\n resolve(img);\n };\n\n img.onerror = function(event) {\n CD.resume(msg);\n\n deprecatedCallback(null);\n\n reject(event);\n };\n\n CD.pause(options.maxSuspension, msg);\n img.src = url;\n });\n },\n\n /**\n * NOTE: getImages is intended to be used with promises. The `afterAll` callback is\n * now deprecated, and the order of the afterEach and afterAll arguments has\n * been reversed since previous versions of cropduster.\n *\n * To achieve the same effect, users should pass a single callback into the\n * arguments for getImages, and then use a `.then` call to handle any actions\n * after all images have finished loading.\n *\n * If any image fails to load, the Promise will reject.\n */\n getImages(urls, options = {}, afterEach, afterAll) {\n const msg = 'getImages:';\n CD.pause(options.maxSuspension, msg);\n\n if (typeof options === 'function') {\n afterAll = afterEach;\n afterEach = options;\n options = {};\n }\n\n const promises = urls.map(url => {\n return this.getImage(url, options.maxSuspension).then(img => {\n if (afterEach) {\n afterEach(img);\n }\n\n return img;\n });\n });\n\n return Promise.all(promises).then(\n images => {\n if (afterAll) {\n CD.log(DEPRECATION_MSG);\n afterAll(images);\n }\n\n CD.resume(msg);\n return images;\n },\n _ => {\n CD.resume(msg);\n throw new Error('Not all images loaded successfully');\n });\n },\n\n waitForAsset(assetUrl) {\n CD.miCaptureFallback(\n () => { MICapture.waitForAsset(assetUrl); },\n () => { CD.log(`Wait for asset: ${assetUrl}`); }\n );\n },\n\n log(message) {\n console.log(message);\n },\n\n miCaptureFallback(ifCapturama, ifBrowser) {\n const loadedInCapturama = !!window.MICapture && typeof window.MICapture === 'object';\n return loadedInCapturama ? ifCapturama() : ifBrowser();\n },\n\n _hashForRequest(url, options) {\n const str = `${url}${JSON.stringify(options)}`;\n\n let hash = 0;\n if (str.length === 0) return hash;\n\n for (let i = 0; i < str.length; i++) {\n hash = ((hash << 5) - hash + str.charCodeAt(i)) & 0xffffffff;\n }\n\n return hash.toString();\n }\n};\n\nexport default CD;\n\n\n\n// WEBPACK FOOTER //\n// ./src/cropduster.js"],"sourceRoot":""} \ No newline at end of file diff --git a/karma.conf.js b/karma.conf.js index 854fc50..dcd311f 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -3,18 +3,18 @@ module.exports = function(config) { // base path that will be used to resolve all patterns (eg. files, exclude) basePath: '', + browsers: ['Chrome'], + // frameworks to use frameworks: ['qunit'], // list of files / patterns to load in the browser files: [ - 'src/**/*.js', 'tests/**/*.js' ], // preprocess matching files before serving them to the browser preprocessors: { - 'src/*.js': ['webpack'], 'tests/*.js': ['webpack', 'sourcemap'] }, @@ -28,7 +28,7 @@ module.exports = function(config) { use: { loader: 'babel-loader', options: { - presets: ['env'] + presets: ['es2015'] } } } @@ -60,9 +60,6 @@ module.exports = function(config) { // enable / disable watching file and executing tests whenever any file changes autoWatch: false, - // start these browsers - // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher - browsers: ['PhantomJS'], // Continuous Integration mode // if true, Karma captures browsers, runs the tests and exits diff --git a/package.json b/package.json index 97a8560..6576a1f 100644 --- a/package.json +++ b/package.json @@ -1,32 +1,33 @@ { "name": "cropduster", - "version": "4.1.0", + "version": "5.0.0", "description": "Library for building web pages for use with Movable Ink Web Crops", - "main": "src/cropduster.js", + "main": "dist/cropduster.js", "directories": { "test": "tests" }, - "dependencies": {}, "devDependencies": { - "babel-core": "^6.26.0", - "babel-loader": "^7.1.2", - "babel-preset-env": "^1.6.1", - "jquery": "^3.2.1", + "babel-cli": "^6.24.1", + "babel-loader": "^7.0.0", + "babel-polyfill": "^6.23.0", + "babel-preset-es2015": "^6.24.1", "karma": "^1.7.1", - "karma-babel-preprocessor": "^7.0.0", + "karma-babel-preprocessor": "^6.0.1", "karma-chrome-launcher": "^2.2.0", - "karma-phantomjs-launcher": "^1.0.4", "karma-qunit": "^1.2.1", "karma-sinon": "^1.0.5", "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "^2.0.5", - "qunitjs": "^2.4.1", + "qunitjs": "^2.4.0", "sinon": "^4.1.1", - "webpack": "^3.8.1" + "uglify-js": "^3.0.18", + "webpack": "^3.10.0", + "webpack-dev-server": "^2.10.0" }, "scripts": { "test": "node_modules/karma/bin/karma start", - "build": "sed 's/export default CD;//' src/cropduster.js | sed 's/const CD/window.CD/' > dist/cropduster.es5.js", + "build": "yarn run webpack", + "build:dev": "NODE_ENV=development yarn run webpack --watch", "prepublish": "npm run build" }, "repository": { diff --git a/src/cropduster.js b/src/cropduster.js index 800e19f..b887b59 100644 --- a/src/cropduster.js +++ b/src/cropduster.js @@ -1,189 +1,178 @@ +const DEPRECATION_MSG = 'callbacks are deprecated in cropduster, prefer using promises for asynchronous operations'; + const CD = { - CORS_PROXY_SERVER : "http://cors.movableink.com", + CORS_PROXY_SERVER: 'http://cors.movableink.com', + + $(selector, doc) { + if (!doc) { + doc = document; + } - $: function(selector, doc) { - if(!doc) { doc = document; } - return Array.prototype.slice.call(doc.querySelectorAll(selector)); + return [...doc.querySelectorAll(selector)]; }, - param: function(name) { + _initParams() { + CD._urlParams = {}; + const search = /([^&=]+)=?([^&]*)/g; + const query = CD._searchString(); + + let match = search.exec(query); + while (match) { + CD._urlParams[decodeURIComponent(match[1])] = decodeURIComponent(match[2]); + match = search.exec(query); + } + }, + + param(name) { return CD.params()[name]; }, - params: function(name) { - if(typeof(CD._urlParams) == "undefined") { - CD._urlParams = {}; - var match; - var search = /([^&=]+)=?([^&]*)/g; - var query = CD._searchString(); - while (match = search.exec(query)) - CD._urlParams[decodeURIComponent(match[1])] = decodeURIComponent(match[2]); + params(name) { + let params = CD._urlParams; + if (typeof params === 'undefined') { + CD._initParams(); + params = CD._urlParams; } + if (name) { - return CD._urlParams[name]; + return params[name]; } else { - return CD._urlParams; + return params; } }, - _searchString: function() { + _searchString() { return window.location.search.substring(1); }, - autofill: function() { - CD.param("init"); // inits CD._urlParams - Object.keys(CD._urlParams).forEach(function (key) { - if (CD._urlParams[key] !== "undefined" && CD._urlParams[key].length > 0) { - if (document.getElementById("autofill_" + key)) { - document.getElementById("autofill_" + key).innerHTML = CD._urlParams[key]; + autofill() { + CD.param('init'); // inits CD._urlParams + const params = CD._urlParams; + for (const key in params) { + if (params[key] !== 'undefined' && params[key].length > 0) { + if (document.getElementById(`autofill_${key}`)) { + document.getElementById(`autofill_${key}`).innerHTML = params[key]; } } - }); + } }, - throwError: function(msg) { - if(typeof(MICapture) == "undefined") { - CD.log("Capturama error: " + msg); - } else { - MICapture.error(msg); - } + throwError(msg) { + CD.miCaptureFallback( + () => { MICapture.error(msg); }, + () => { CD.log('Capturama error: ' + msg) } + ); }, - cancelRequest: function(msg) { - if(typeof(MICapture) == "undefined") { - CD.log("Request canceled: " + msg); - } else { - MICapture.cancel(msg); - } + cancelRequest(msg) { + CD.miCaptureFallback( + () => { MICapture.cancel(msg); }, + () => { CD.log(`Request canceled: ${msg}`); } + ); }, - setImageRedirect: function(imageUrl) { - var a = document.querySelector("#mi-redirect-image"); - a = a || document.createElement('a'); + setImageRedirect(imageUrl) { + const a = document.getElementById('mi-redirect-image') || document.createElement('a'); a.href = imageUrl; - a.id = "mi-redirect-image"; - a.style.display = "none"; + a.id = 'mi-redirect-image'; + a.style.display = 'none'; document.body.appendChild(a); return a; }, - setClickthrough: function(url) { - var a = document.querySelector("#mi_dynamic_link"); - a = a || document.createElement('a'); + setClickthrough(url) { + const a = document.getElementById('mi_dynamic_link') || document.createElement('a'); + a.href = url; - a.id = "mi_dynamic_link"; - a.style.display = "none"; + a.id = 'mi_dynamic_link'; + a.style.display = 'none'; + document.body.appendChild(a); return a; }, - setExtraData: function(dataObject) { - var el = document.querySelector("#mi-data"); - el = el || document.createElement('div'); - el.id = "mi-data"; - el.style.display = "none"; + setExtraData(dataObject) { + const el = document.getElementById('mi-data') || document.createElement('div'); - var existingData; + el.id = 'mi-data'; + el.style.display = 'none'; + + let existingData; try { existingData = JSON.parse(el.getAttribute('data-mi-data')) || {}; - } catch(e) { + } catch (_) { // Overwrite if there was something in mi-data that wasn't JSON existingData = {}; } - for(var i in dataObject) { - if(dataObject.hasOwnProperty(i)) { - existingData[i] = dataObject[i]; + for (const key in dataObject) { + if (dataObject.hasOwnProperty(key)) { + existingData[key] = dataObject[key]; } } + el.setAttribute('data-mi-data', JSON.stringify(existingData)); document.body.appendChild(el); return el; }, - proxyUrl: function(url) { - var a = document.createElement('a'); - var port = ""; + proxyUrl(url) { + const a = document.createElement('a'); a.href = url; - if (a.port === '0' || a.port === "") { - port = a.protocol == "https:" ? ":443" : ""; + let port = ''; + if (a.port === '0' || a.port === '') { + port = a.protocol === 'https:' ? ':443' : ''; } else { - port = ":" + a.port; + port = `:${a.port}`; } - return [ - CD.CORS_PROXY_SERVER, - "/", - a.hostname, - port, - a.pathname, - a.search, - a.hash - ].join(""); + const { hostname, pathname, search, hash } = a; + return `${CD.CORS_PROXY_SERVER}/${hostname}${port}${pathname}${search}${hash}`; }, // internal, do not modify _readyToCapture: true, - _openCalls: 0, - - _reset: function() { - CD._openCalls = 0; + _reset() { CD._readyToCapture = true; }, - suspend: function(maxSuspension, msg) { - msg = msg || "manual suspension"; + pause(maxSuspension, msg = 'manual suspension') { + if (maxSuspension) { + msg += `, will end in ${maxSuspension}ms`; - if(maxSuspension) { - msg += ", will end in " + maxSuspension + "ms"; - - setTimeout(function() { - CD.capture(msg); + setTimeout(() => { + CD.resume(msg); }, maxSuspension); } - CD._openCalls++; - CD._readyToCapture = false; - if (typeof(MICapture) == 'undefined') { - CD.log("suspended: " + msg); - } else { - MICapture.begin(msg); - } + CD.miCaptureFallback( + () => { MICapture.pause(msg) }, + () => { CD.log(`paused: ${msg}`) } + ); }, - capture: function(msg) { - CD._openCalls--; - - if(CD._openCalls > 0) { - CD.log("outstanding calls, not capturing: " + msg); - return; - } - - CD._readyToCapture = true; - if(typeof(MICapture) == 'undefined') { - CD.log("now ready to capture: " + msg); - } else { - CD.$('body')[0].style.width = CD.$('body')[0].offsetWidth + 'px'; - MICapture.end(msg); - } + resume(msg) { + CD.miCaptureFallback( + () => { MICapture.resume(msg) }, + () => { CD.log(`resuming paused capture: ${msg}`)} + ); }, - getCORS: function(url, options, callback) { - var args = Array.prototype.slice.call(arguments); - - url = args[0]; - callback = args.pop(); - options = args[1] || {}; + getCORS(url, options = {}, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } options.corsCacheTime = options.corsCacheTime || 10 * 1000; - if(!url.match(/cors.movableink.com/)) { + if (!/cors.movableink.com/.test(url)) { url = CD.proxyUrl(url); } @@ -194,140 +183,191 @@ const CD = { return CD.get(url, options, callback); }, - get: function(url, options, callback) { - var args = Array.prototype.slice.call(arguments); + get(url, options = {}, callback) { + if (typeof options === 'function') { + callback = options; + options = {}; + } - url = args[0]; - callback = args.pop(); - options = args[1] || {}; + const deprecatedCallback = function() { + if (callback && typeof callback === 'function') { + CD.log(DEPRECATION_MSG); + return callback(...arguments); + } + }; - var msg = "xhr: " + url; + const msg = `xhr: ${url}`; - var req = new XMLHttpRequest(); + return new Promise(function(resolve, reject) { + try { + const req = new XMLHttpRequest(); - req.onerror = function () { - CD.capture(msg); - CD.log("XHR error for " + url); - callback(null, this.status); - }; - req.onload = function() { - CD.capture(msg); - var contentType = this.getResponseHeader('content-type'); - callback(this.responseText, this.status, contentType); - }; + req.onerror = function() { + const error = `XHR error for ${url} - ${this.status}: ${this.statusText}`; - req.open(options.method || 'GET', url, true); + CD.resume(msg); - req.withCredentials = true; + deprecatedCallback(null); - if(options.headers) { - for(var header in options.headers) { - req.setRequestHeader(header, options.headers[header]); - } - } + reject(new Error(error)); + }; - req.send(options.body); - CD.suspend(options.maxSuspension, msg); - }, + req.onload = function() { + const contentType = this.getResponseHeader('content-type'); + const data = this.responseText; + const status = this.status; - getImage: function(url, options, callback) { - var args = Array.prototype.slice.call(arguments); + if (status >= 400) { + return this.onerror(); + } - callback = args.pop(); - url = args[0]; - options = args[1] || {}; - var msg = "getImage: " + url; + CD.resume(msg); - var img = new Image(); - img.onload = function() { - CD.capture(msg); - if(callback) { callback(img); } - }; - img.onerror = function() { - CD.capture(msg); - callback(null); - }; - img.src = url; - CD.suspend(options.maxSuspension, msg); + deprecatedCallback(data, status, contentType); + + resolve({ + contentType, + data, + status + }); + }; + + req.open(options.method || 'GET', url, true); + + req.withCredentials = true; + + if (options.headers) { + for (const header in options.headers) { + req.setRequestHeader(header, options.headers[header]); + } + } + + req.send(options.body); + CD.pause(options.maxSuspension, msg); + } catch (error) { + deprecatedCallback(null); + + reject({ + message: `Cropduster failed to create Promise: ${error}`, + error: error + }); + } + }); }, - getImages: function(urls, options, callback, singleCallback) { - if(typeof(options) === "function") { - singleCallback = callback; + getImage(url, options = {}, callback) { + if (typeof options === 'function') { callback = options; options = {}; } - options = options || {}; + const deprecatedCallback = function() { + if (callback && typeof callback === 'function') { + CD.log(DEPRECATION_MSG); - var imagesLeft = urls.length; - var imgs = []; - var calledIndex = -1; - var msg = "getImages"; + return callback(...arguments); + } + }; - for(var i = 0; i < urls.length; i++) { - (function(url, i){ + const msg = `getImage: ${url}`; - var img = new Image(); + return new Promise(function(resolve, reject) { + const img = new Image(); - img.onload = function() { - imagesLeft -= 1; - imgs[i] = img; - callbackNext(); - finish(); - }; - img.onerror = function() { - imagesLeft -= 1; - CD.log("Image load error for " + url); - finish(); - }; + img.onload = function() { + CD.resume(msg); - img.src = url; - })(urls[i], i); - } + deprecatedCallback(img); - CD.suspend(options.maxSuspension, msg); + resolve(img); + }; - function callbackNext() { - var next = calledIndex + 1; - if(imgs[next]) { - if(singleCallback) { - singleCallback(imgs[next]); - } - calledIndex = next; - callbackNext(); - } + img.onerror = function(event) { + CD.resume(msg); + + deprecatedCallback(null); + + reject(event); + }; + + CD.pause(options.maxSuspension, msg); + img.src = url; + }); + }, + + /** + * NOTE: getImages is intended to be used with promises. The `afterAll` callback is + * now deprecated, and the order of the afterEach and afterAll arguments has + * been reversed since previous versions of cropduster. + * + * To achieve the same effect, users should pass a single callback into the + * arguments for getImages, and then use a `.then` call to handle any actions + * after all images have finished loading. + * + * If any image fails to load, the Promise will reject. + */ + getImages(urls, options = {}, afterEach, afterAll) { + const msg = 'getImages:'; + CD.pause(options.maxSuspension, msg); + + if (typeof options === 'function') { + afterAll = afterEach; + afterEach = options; + options = {}; } - function finish() { - if(imagesLeft == 0) { - CD.capture(msg); - if(callback) { - callback(imgs); + const promises = urls.map(url => { + return this.getImage(url, options.maxSuspension).then(img => { + if (afterEach) { + afterEach(img); } - } - } + + return img; + }); + }); + + return Promise.all(promises).then( + images => { + if (afterAll) { + CD.log(DEPRECATION_MSG); + afterAll(images); + } + + CD.resume(msg); + return images; + }, + _ => { + CD.resume(msg); + throw new Error('Not all images loaded successfully'); + }); }, - waitForAsset: function(assetUrl) { - if(typeof(MICapture) == "undefined") { - CD.log("Wait for asset: " + assetUrl); - } else { - MICapture.waitForAsset(assetUrl); - } + waitForAsset(assetUrl) { + CD.miCaptureFallback( + () => { MICapture.waitForAsset(assetUrl); }, + () => { CD.log(`Wait for asset: ${assetUrl}`); } + ); }, - log: function(message) { + log(message) { console.log(message); }, - _hashForRequest: function(url, options) { - var str = url + JSON.stringify(options); - var hash = 0; + miCaptureFallback(ifCapturama, ifBrowser) { + const loadedInCapturama = !!window.MICapture && typeof window.MICapture === 'object'; + return loadedInCapturama ? ifCapturama() : ifBrowser(); + }, + + _hashForRequest(url, options) { + const str = `${url}${JSON.stringify(options)}`; + + let hash = 0; if (str.length === 0) return hash; - for (var i = 0; i < str.length; i++) { - hash = ((hash << 5) - hash) + str.charCodeAt(i) & 0xFFFFFFFF; + + for (let i = 0; i < str.length; i++) { + hash = ((hash << 5) - hash + str.charCodeAt(i)) & 0xffffffff; } + return hash.toString(); } }; diff --git a/tests/tests.js b/tests/tests.js index 39745c4..8133dcd 100644 --- a/tests/tests.js +++ b/tests/tests.js @@ -1,8 +1,22 @@ import CD from '../src/cropduster'; -import jQuery from 'jquery'; -import sinon from 'sinon'; +import { fakeServer, useFakeXMLHttpRequest, spy } from 'sinon'; -const container = jQuery("
").appendTo('body'); +const { module, test } = QUnit; +const container = document.createElement('DIV'); +container.style = 'position: absolute; left: -5000px;'; +document.body.appendChild(container); + +module('cropduster tests', { + beforeEach() { + window.MICapture = { + pause: spy(), + resume: spy(), + cancel: spy(), + error: spy(), + waitForAsset: spy() + }; + } +}); // Disable debugging output CD.log = function() {}; @@ -12,174 +26,176 @@ CD._searchString = function() { return 'foo=bar&baz%20test=quux%20value'; }; -var imageSuccessStub = function() { - var self = this; +const imageSuccessStub = function() { + const self = this; setTimeout(function() { self.onload(); }, 1); }; -var imageFailureStub = function() { - var self = this; +const imageFailureStub = function() { + const self = this; setTimeout(function() { self.onerror(); }, 1); }; -QUnit.test("CD.$", function(assert) { +test("CD.$", function(assert) { assert.equal(CD.$('body')[0], document.body, "finds elements" ); }); -QUnit.test("CD.param when parameter not found", function(assert) { +test("CD.param when parameter not found", function(assert) { assert.equal(CD.param('not_found'), null, "returns null"); }); -QUnit.test("CD.param when parameter is found", function(assert) { +test("CD.param when parameter is found", function(assert) { assert.equal(CD.param('foo'), 'bar', "returns value"); }); -QUnit.test("CD.params returns all query params", function(assert) { +test("CD.params returns all query params", function(assert) { assert.deepEqual(CD.params(), {'baz test': 'quux value', foo: 'bar'}, "returns the url params"); }); -QUnit.test("CD.params with argument returns that query param", function(assert) { +test("CD.params with argument returns that query param", function(assert) { assert.equal(CD.params('baz test'), 'quux value', "returns the url param"); }); // can't test CD.param returning query params from here, unfortunately... -QUnit.test("CD.autofill", function(assert) { - container.html(''); - var el = jQuery("
"); +test("CD.autofill", function(assert) { + container.innerHTML = ''; + const el = document.createElement('div'); + el.id = 'autofill_foo'; container.append(el); CD.autofill(); - assert.equal(el.html(), 'bar', "auto-fills the query param into the element"); + assert.equal(el.innerHTML, 'bar', "auto-fills the query param into the element"); }); -QUnit.test("CD.setImageRedirect", function(assert) { +test("CD.setImageRedirect", function(assert) { CD.setImageRedirect("http://example.com/foo.png"); - assert.equal(jQuery("#mi-redirect-image").attr('href'), "http://example.com/foo.png", - "sets the image redirect"); + const href = document.getElementById('mi-redirect-image').getAttribute('href'); + assert.equal(href, "http://example.com/foo.png", "sets the image redirect"); }); -QUnit.test("CD.setImageRedirect multiple times", function(assert) { +test("CD.setImageRedirect multiple times", function(assert) { CD.setImageRedirect("http://example.com/foo.png"); CD.setImageRedirect("http://example.com/bar.png"); - assert.equal(jQuery("#mi-redirect-image").attr('href'), "http://example.com/bar.png", - "uses the last setImageRedirect url"); + const href = document.getElementById('mi-redirect-image').getAttribute('href'); + assert.equal(href, "http://example.com/bar.png", "uses the last setImageRedirect url"); }); -QUnit.test("CD.setClickthrough", function(assert) { +test("CD.setClickthrough", function(assert) { + CD.setClickthrough("http://example.com/"); - assert.equal(jQuery("#mi_dynamic_link").attr('href'), "http://example.com/", + const href = document.getElementById('mi_dynamic_link').getAttribute('href'); + assert.equal(href, "http://example.com/", "sets the dynamic link"); }); -QUnit.test("CD.setExtraData with no existing data", function(assert) { +test("CD.setExtraData with no existing data", function(assert) { CD.setExtraData({foo: 'bar'}); - assert.equal(jQuery("#mi-data").attr('data-mi-data'), '{"foo":"bar"}', - "sets the data in json"); + const data = document.getElementById('mi-data').getAttribute('data-mi-data'); + assert.equal(data, '{"foo":"bar"}', "sets the data in json"); }); -QUnit.test("CD.setExtraData with existing data", function(assert) { +test("CD.setExtraData with existing data", function(assert) { CD.setExtraData({foo: 'bar'}); CD.setExtraData({foo: 'baz'}); CD.setExtraData({my: 'data'}); - assert.equal(jQuery("#mi-data").attr('data-mi-data'), '{"foo":"baz","my":"data"}', + const data = document.getElementById('mi-data').getAttribute('data-mi-data'); + assert.equal(data, '{"foo":"baz","my":"data"}', "sets the data in json"); }); -QUnit.test("CD.proxyUrl with http url", function(assert) { - var url = "http://google.com"; +test("CD.proxyUrl with http url", function(assert) { + const url = "http://google.com"; assert.equal(CD.proxyUrl(url), "http://cors.movableink.com/google.com/", "returns CORS url"); }); -QUnit.test("CD.proxyUrl with https url", function(assert) { - var url = "https://google.com"; +test("CD.proxyUrl with https url", function(assert) { + const url = "https://google.com"; assert.equal(CD.proxyUrl(url), "http://cors.movableink.com/google.com:443/", "returns CORS url"); }); -QUnit.test("CD.proxyUrl with port", function(assert) { - var url = "http://google.com:8080"; +test("CD.proxyUrl with port", function(assert) { + const url = "http://google.com:8080"; assert.equal(CD.proxyUrl(url), "http://cors.movableink.com/google.com:8080/", "returns CORS url"); }); -QUnit.test("CD.suspend", function(assert) { - CD._reset(); // clean out previous test - CD.suspend(); - assert.equal(CD._readyToCapture, false, "sets readyToCapture"); +test("CD.pause", function(assert) { + CD.pause(); + assert.equal(MICapture.pause.calledOnce, true, "calls MICapture.pause"); }); -QUnit.test("CD.capture", function(assert) { - CD._reset(); // clean out previous test - CD.capture(); - assert.equal(CD._readyToCapture, true, "sets readyToCapture"); +test("CD.resume", function(assert) { + CD.resume(); + assert.equal(MICapture.resume.calledOnce, true, "calls MICapture.resume"); }); -QUnit.test("CD.getImage load success", function(assert) { - var done = assert.async(); +test("DEPRECATED - CD.getImage with a callback and successful load", function(assert) { + const done = assert.async(); window.Image = imageSuccessStub; - var src = "http://example.com/foo.png"; + const src = "http://example.com/foo.png"; CD.getImage(src, function(img) { assert.equal(img.src, src, "called with src"); done(); }); }); -QUnit.test("CD.getImage load failure", function(assert) { - var done = assert.async(); - window.Image = imageFailureStub; - var src = "http://example.com/foo.png"; - CD.getImage(src, function(img) { - assert.equal(img, null, "called with null"); +test("CD.getImage with a promise and successful load", function(assert) { + const done = assert.async(); + window.Image = imageSuccessStub; + const src = "http://example.com/foo.png"; + CD.getImage(src).then((img) => { + assert.equal(img.src, src, "called with src"); done(); }); }); -QUnit.test("CD.getImages without callback", function(assert) { - assert.expect(0); - - window.Image = imageSuccessStub; - var srcA = "http://example.com/foo.png"; - var srcB = "http://example.com/bar.png"; - CD.getImages([srcA, srcB]); +test("DEPRECATED - CD.getImage with a callback and a failing load", function(assert) { + const done = assert.async(); + window.Image = imageFailureStub; + const src = "http://example.com/foo.png"; + CD.getImage(src, function(img) { + assert.equal(img, null, "called with null"); + done(); + }).catch(() => {}); }); -QUnit.test("CD.getImages with callback", function(assert) { - var done = assert.async(); - window.Image = imageSuccessStub; - var srcA = "http://example.com/foo.png"; - var srcB = "http://example.com/bar.png"; - var cb = sinon.spy(); - CD.getImages([srcA, srcB], cb); - - setTimeout(function() { - assert.ok(cb.calledOnce); - assert.equal(cb.firstCall.args[0].length, 2); - done(); - }, 10); +test("CD.getImage with a promise and a failing load", function(assert) { + const done = assert.async(); + window.Image = imageFailureStub; + const src = "http://example.com/foo.png"; + CD.getImage(src).then( + () => { + assert.ok(false, 'this function should never be called'); + done(); + }, + (error) => { + assert.ok(true, 'the promise rejects if the image fails to load'); + done(); + } + ); }); -QUnit.test("CD.waitForAsset", function(assert) { +test("CD.waitForAsset", function(assert) { assert.equal(CD.waitForAsset('http://example.com/foo.png'), undefined); }); -QUnit.test("CD.getImages with callback and single image callback", function(assert) { - var done = assert.async(); +test("DEPRECATED - CD.getImages with final callback and single image callback", function(assert) { + const done = assert.async(); window.Image = imageSuccessStub; - var srcA = "http://example.com/foo.png"; - var srcB = "http://example.com/bar.png"; - var cb = sinon.spy(); - var singleCb = sinon.spy(); - CD.getImages([srcA, srcB], cb, singleCb); - - setTimeout(function() { + const srcA = "http://example.com/foo.png"; + const srcB = "http://example.com/bar.png"; + const cb = spy(); + const singleCb = spy(); + CD.getImages([srcA, srcB], singleCb, cb).then(() => { assert.ok(cb.calledOnce, "callback is called only once"); assert.equal(cb.firstCall.args[0].length, 2, "called with both images"); @@ -188,64 +204,138 @@ QUnit.test("CD.getImages with callback and single image callback", function(asse assert.equal(singleCb.secondCall.args[0].src, srcB, "last image called last"); done(); - }, 10); + }); }); -QUnit.test("CD.get with response", function(assert) { - var server = sinon.fakeServer.create(); +test("CD.getImages with promises and a single callback", function(assert) { + const done = assert.async(); + window.Image = imageSuccessStub; + const srcA = "http://example.com/foo.png"; + const srcB = "http://example.com/bar.png"; + const singleCb = spy(); + CD.getImages([srcA, srcB], singleCb).then((images) => { + assert.ok(singleCb.calledTwice, "the single callback is called once for each resolved image"); + assert.ok(true, "the promise is resolved if all images resolve"); + assert.equal(images.length, 2, "called with both images"); - server.respondWith([200, {"Content-Type": "text/html"}, "response"]); + assert.equal(singleCb.firstCall.args[0].src, srcA, "first image called first"); + assert.equal(singleCb.secondCall.args[0].src, srcB, "last image called last"); - var spy = sinon.spy(); + done(); + }); +}); + +test("DEPRECATED - CD.get with callbacks and a successful response", function(assert) { + const xhr = useFakeXMLHttpRequest(); + const done = assert.async(); + const server = fakeServer.create(); + + server.respondWith([200, {"Content-Type": "text/html"}, "response"]); CD.get("http://google.com", { headers: { 'Accept': 'application/json' } - }, spy); + }, (data, status, contentType) => { + assert.ok(data === 'response', 'resolves with a response'); + assert.ok(status === 200, 'resolves with a status'); + assert.ok(contentType === 'text/html', 'resolves with a content type'); + + assert.ok(true, 'the promise resolves successfully'); + done(); + }); server.respond(); + server.restore(); +}); + +test("CD.get with promises and a successful response", function(assert) { + const xhr = useFakeXMLHttpRequest(); + const done = assert.async(); + const server = fakeServer.create(); - assert.ok(spy.calledWith('response'), 'calls the callback with a response'); + server.respondWith([200, {"Content-Type": "text/html"}, "response"]); + CD.get("http://google.com", { + headers: { + 'Accept': 'application/json' + } + }).then(({ data, status, contentType }) => { + assert.ok(data === 'response', 'resolves with a response'); + assert.ok(status === 200, 'resolves with a status'); + assert.ok(contentType === 'text/html', 'resolves with a content type'); + + assert.ok(true, 'the promise resolves successfully'); + done(); + }); + + server.respond(); server.restore(); }); -QUnit.test("CD.get with a failing response", function(assert) { - var server = sinon.fakeServer.create(); - - var spy = sinon.spy(); +test("DEPRECATED - CD.get with callbacks and a failing response", function(assert) { + const xhr = useFakeXMLHttpRequest(); + const server = fakeServer.create(); + const done = assert.async(); CD.get("http://google.com", { headers: { 'Accept': 'application/json' } - }, spy); + }, (value) => { + assert.equal(value, null, 'the callback is called with null if the request fails'); + done(); + }).catch(() => { + // do nothing + // silence "Uncaught Promise rejection" error that gets thrown here + }); server.requests[0].abort(); server.requests[0].onerror(); - assert.ok(spy.calledWith(null), 'calls the callback with a response'); + server.restore(); +}); + +test("CD.get with promises and a failing response", function(assert) { + const xhr = useFakeXMLHttpRequest(); + const server = fakeServer.create(); + const done = assert.async(); + + CD.get("http://google.com", { + headers: { + 'Accept': 'application/json' + } + }).then( + () => { + assert.ok(false, 'this should never be reached'); + done(); + }, + () => { + assert.ok(true, 'the promise is rejected if the request fails'); + done(); + } + ); + + server.requests[0].abort(); + server.requests[0].onerror(); server.restore(); }); -QUnit.test("CD.get", function(assert) { - var xhr = sinon.useFakeXMLHttpRequest(); - var requests = this.requests = []; +test("CD.get - request options", function(assert) { + const xhr = useFakeXMLHttpRequest(); + const requests = this.requests = []; xhr.onCreate = function (xhr) { requests.push(xhr); }; - var spy = sinon.spy(); - CD.get("http://google.com", { corsCacheTime: 5000, headers: { 'Accept': 'application/json' } - }, spy); + }); assert.equal(requests.length, 1); assert.equal(requests[0].requestHeaders['x-reverse-proxy-ttl'], null); // not automatically added @@ -258,21 +348,19 @@ QUnit.test("CD.get", function(assert) { xhr.restore(); }); -QUnit.test("CD.getCORS", function(assert) { - var xhr = sinon.useFakeXMLHttpRequest(); - var requests = this.requests = []; +test("CD.getCORS - request options", function(assert) { + const xhr = useFakeXMLHttpRequest(); + const requests = this.requests = []; xhr.onCreate = function (xhr) { requests.push(xhr); }; - var spy = sinon.spy(); - CD.getCORS("http://google.com", { corsCacheTime: 5000, headers: { 'Accept': 'application/json' } - }, spy); + }); assert.equal(requests.length, 1); assert.equal(requests[0].requestHeaders['x-reverse-proxy-ttl'], 5); @@ -285,16 +373,14 @@ QUnit.test("CD.getCORS", function(assert) { xhr.restore(); }); -QUnit.test("CD.getCORS without options", function(assert) { - var xhr = sinon.useFakeXMLHttpRequest(); - var requests = this.requests = []; +test("CD.getCORS without options", function(assert) { + const xhr = useFakeXMLHttpRequest(); + const requests = this.requests = []; xhr.onCreate = function (xhr) { requests.push(xhr); }; - var spy = sinon.spy(); - - CD.getCORS("http://google.com", spy); + CD.getCORS("http://google.com"); assert.equal(requests.length, 1); assert.equal(requests[0].requestHeaders['x-reverse-proxy-ttl'], 10); @@ -304,15 +390,13 @@ QUnit.test("CD.getCORS without options", function(assert) { xhr.restore(); }); -QUnit.test("CD.getCORS with POST", function(assert) { - var xhr = sinon.useFakeXMLHttpRequest(); - var requests = this.requests = []; +test("CD.getCORS with POST", function(assert) { + const xhr = useFakeXMLHttpRequest(); + const requests = this.requests = []; xhr.onCreate = function (xhr) { requests.push(xhr); }; - var spy = sinon.spy(); - CD.getCORS("http://google.com", { corsCacheTime: 5000, method: 'POST', @@ -320,7 +404,7 @@ QUnit.test("CD.getCORS with POST", function(assert) { headers: { 'Accept': 'application/json' } - }, spy); + }); assert.equal(requests.length, 1); assert.equal(requests[0].requestHeaders['x-reverse-proxy-ttl'], 5); @@ -334,45 +418,44 @@ QUnit.test("CD.getCORS with POST", function(assert) { xhr.restore(); }); -QUnit.test("concurrent calls", function(assert) { - CD._reset(); - - CD.suspend(1000); // 1 open call - CD.suspend(500); // 2 open calls - CD.capture(); // 1 open call - CD.suspend(1000); // 2 open calls - - CD.capture(); // 1 open call - assert.equal(CD._readyToCapture, false, "waits for open calls to get to zero"); - assert.equal(CD._openCalls, 1, "one open call"); - - CD.capture(); // 0 open calls - assert.equal(CD._readyToCapture, true, "sets readyToCapture"); - assert.equal(CD._openCalls, 0, "zero open calls"); -}); - - -QUnit.test("_hashForRequest", function(assert) { - var hash = CD._hashForRequest("http://www.google.com", {"foo": "bar"}); +test("_hashForRequest", function(assert) { + let hash = CD._hashForRequest("http://www.google.com", {"foo": "bar"}); assert.equal(hash, "387990350"); hash = CD._hashForRequest("http://www.google.com", {"foo": "bar"}); assert.equal(hash, "387990350"); - var different = CD._hashForRequest("http://www.google.com", {"foo": "baz"}); + const different = CD._hashForRequest("http://www.google.com", {"foo": "baz"}); assert.equal(different, "387998038"); - var another = CD._hashForRequest("http://www.example.com", {"foo": "baz"}); + const another = CD._hashForRequest("http://www.example.com", {"foo": "baz"}); assert.equal(another, "-164085129"); }); -QUnit.test("CD.cancelRequest", function(assert) { - var callback = sinon.spy(); - window.MICapture = { cancel: callback }; +test("CD.cancelRequest", function(assert) { CD.cancelRequest(); - assert.ok(callback.calledOnce); + assert.ok(MICapture.cancel.calledOnce); }); -QUnit.test("CD.throwError", function(assert) { - var callback = sinon.spy(); - window.MICapture = { error: callback }; +test("CD.throwError", function(assert) { CD.throwError(); - assert.ok(callback.calledOnce); + assert.ok(MICapture.error.calledOnce); +}); + +test('CD.miCaptureFallback - with MICapture', function(assert) { + window.MICapture = {}; + + assert.expect(1); + + CD.miCaptureFallback( + () => { assert.ok(true, 'the second callback is called if MICapture is defined as an object'); }, + () => { assert.ok(false, 'this should not be called'); } + ); +}); + +test('CD.miCaptureFallback - without MICapture', function(assert) { + window.MICapture = null; + assert.expect(1); + + CD.miCaptureFallback( + () => { assert.ok(false, 'this should not be called'); }, + () => { assert.ok(true, 'the second callback is called if MICapture is undefined'); } + ); }); diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..8fbb4e4 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,43 @@ +const path = require('path'); +const webpack = require('webpack'); +const uglifier = new webpack.optimize.UglifyJsPlugin({ sourceMap: true }); + +const inDev = process.env.NODE_ENV === 'development'; +const plugins = inDev ? [] : [uglifier]; + +const defaultConfig = { + plugins, + entry: './src/cropduster.js', + devtool: 'source-map', + module: { + rules: [ + { + test: /\.js$/, + exclude: /node_modules/, + use: ['babel-loader'] + } + ] + } +}; + +const importConfig = { + output: { + library: 'cropduster', + libraryTarget: 'umd', + filename: 'cropduster.js', + path: path.resolve(__dirname, 'dist') + }, + ...defaultConfig +}; + +const browserConfig = { + output: { + library: 'CD', + libraryTarget: 'var', + filename: 'cropduster.browser.js', + path: path.resolve(__dirname, 'dist') + }, + ...defaultConfig +}; + +module.exports = [importConfig, browserConfig]; diff --git a/yarn.lock b/yarn.lock index d921168..a4001bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13,6 +13,13 @@ accepts@1.3.3: mime-types "~2.1.11" negotiator "0.6.1" +accepts@~1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.4.tgz#86246758c7dd6d21a6474ff084a4740ec05eb21f" + dependencies: + mime-types "~2.1.16" + negotiator "0.6.1" + acorn-dynamic-import@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz#c752bd210bef679501b6c6cb7fc84f8f47158cc4" @@ -63,6 +70,10 @@ amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" +ansi-html@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" + ansi-regex@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" @@ -82,6 +93,13 @@ anymatch@^1.3.0: micromatch "^2.1.5" normalize-path "^2.0.0" +anymatch@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -99,18 +117,59 @@ arr-diff@^2.0.0: dependencies: arr-flatten "^1.0.1" -arr-flatten@^1.0.1: +arr-diff@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + +arr-flatten@^1.0.1, arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + +array-flatten@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" + +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" +array-unique@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + arraybuffer.slice@0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz#f33b2159f0532a3f3107a272c0ccfbd1ad2979ca" @@ -141,10 +200,18 @@ assert@^1.1.1: dependencies: util "0.10.3" +assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + async-each@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +async@^1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + async@^2.1.2: version "2.5.0" resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" @@ -159,6 +226,10 @@ asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" +atob@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/atob/-/atob-2.0.3.tgz#19c7a760473774468f20b2d2d03372ad7d4cbf5d" + aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" @@ -167,6 +238,27 @@ aws4@^1.2.1: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +babel-cli@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.26.0.tgz#502ab54874d7db88ad00b887a06383ce03d002f1" + dependencies: + babel-core "^6.26.0" + babel-polyfill "^6.26.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + commander "^2.11.0" + convert-source-map "^1.5.0" + fs-readdir-recursive "^1.0.0" + glob "^7.1.2" + lodash "^4.17.4" + output-file-sync "^1.1.2" + path-is-absolute "^1.0.1" + slash "^1.0.0" + source-map "^0.5.6" + v8flags "^2.1.1" + optionalDependencies: + chokidar "^1.6.1" + babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" @@ -175,7 +267,7 @@ babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.26.0: +babel-core@^6.0.0, babel-core@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" dependencies: @@ -212,14 +304,6 @@ babel-generator@^6.26.0: source-map "^0.5.6" trim-right "^1.0.1" -babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" - dependencies: - babel-helper-explode-assignable-expression "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" @@ -238,14 +322,6 @@ babel-helper-define-map@^6.24.1: babel-types "^6.26.0" lodash "^4.17.4" -babel-helper-explode-assignable-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" @@ -285,16 +361,6 @@ babel-helper-regex@^6.24.1: babel-types "^6.26.0" lodash "^4.17.4" -babel-helper-remap-async-to-generator@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - babel-helper-replace-supers@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz#bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a" @@ -313,7 +379,7 @@ babel-helpers@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-loader@^7.1.2: +babel-loader@^7.0.0: version "7.1.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.2.tgz#f6cbe122710f1aa2af4d881c6d5b54358ca24126" dependencies: @@ -333,26 +399,6 @@ babel-plugin-check-es2015-constants@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-syntax-async-functions@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" - -babel-plugin-syntax-exponentiation-operator@^6.8.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" - -babel-plugin-syntax-trailing-function-commas@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" - -babel-plugin-transform-async-to-generator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" - dependencies: - babel-helper-remap-async-to-generator "^6.24.1" - babel-plugin-syntax-async-functions "^6.8.0" - babel-runtime "^6.22.0" - babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" @@ -365,7 +411,7 @@ babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-block-scoping@^6.23.0: +babel-plugin-transform-es2015-block-scoping@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" dependencies: @@ -375,7 +421,7 @@ babel-plugin-transform-es2015-block-scoping@^6.23.0: babel-types "^6.26.0" lodash "^4.17.4" -babel-plugin-transform-es2015-classes@^6.23.0: +babel-plugin-transform-es2015-classes@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" dependencies: @@ -389,33 +435,33 @@ babel-plugin-transform-es2015-classes@^6.23.0: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-computed-properties@^6.22.0: +babel-plugin-transform-es2015-computed-properties@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" dependencies: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-destructuring@^6.23.0: +babel-plugin-transform-es2015-destructuring@^6.22.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz#997bb1f1ab967f682d2b0876fe358d60e765c56d" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: +babel-plugin-transform-es2015-duplicate-keys@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" dependencies: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-plugin-transform-es2015-for-of@^6.23.0: +babel-plugin-transform-es2015-for-of@^6.22.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-function-name@^6.22.0: +babel-plugin-transform-es2015-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" dependencies: @@ -429,7 +475,7 @@ babel-plugin-transform-es2015-literals@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: +babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" dependencies: @@ -437,7 +483,7 @@ babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015 babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1: +babel-plugin-transform-es2015-modules-commonjs@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" dependencies: @@ -446,7 +492,7 @@ babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-e babel-template "^6.26.0" babel-types "^6.26.0" -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: +babel-plugin-transform-es2015-modules-systemjs@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" dependencies: @@ -454,7 +500,7 @@ babel-plugin-transform-es2015-modules-systemjs@^6.23.0: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-modules-umd@^6.23.0: +babel-plugin-transform-es2015-modules-umd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" dependencies: @@ -462,14 +508,14 @@ babel-plugin-transform-es2015-modules-umd@^6.23.0: babel-runtime "^6.22.0" babel-template "^6.24.1" -babel-plugin-transform-es2015-object-super@^6.22.0: +babel-plugin-transform-es2015-object-super@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" dependencies: babel-helper-replace-supers "^6.24.1" babel-runtime "^6.22.0" -babel-plugin-transform-es2015-parameters@^6.23.0: +babel-plugin-transform-es2015-parameters@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" dependencies: @@ -480,7 +526,7 @@ babel-plugin-transform-es2015-parameters@^6.23.0: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: +babel-plugin-transform-es2015-shorthand-properties@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" dependencies: @@ -493,7 +539,7 @@ babel-plugin-transform-es2015-spread@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-sticky-regex@^6.22.0: +babel-plugin-transform-es2015-sticky-regex@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" dependencies: @@ -507,13 +553,13 @@ babel-plugin-transform-es2015-template-literals@^6.22.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-typeof-symbol@^6.23.0: +babel-plugin-transform-es2015-typeof-symbol@^6.22.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-unicode-regex@^6.22.0: +babel-plugin-transform-es2015-unicode-regex@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" dependencies: @@ -521,15 +567,7 @@ babel-plugin-transform-es2015-unicode-regex@^6.22.0: babel-runtime "^6.22.0" regexpu-core "^2.0.0" -babel-plugin-transform-exponentiation-operator@^6.22.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" - dependencies: - babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" - babel-plugin-syntax-exponentiation-operator "^6.8.0" - babel-runtime "^6.22.0" - -babel-plugin-transform-regenerator@^6.22.0: +babel-plugin-transform-regenerator@^6.24.1: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" dependencies: @@ -542,40 +580,42 @@ babel-plugin-transform-strict-mode@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" -babel-preset-env@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.6.1.tgz#a18b564cc9b9afdf4aae57ae3c1b0d99188e6f48" +babel-polyfill@^6.23.0, babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-es2015@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz#d44050d6bc2c9feea702aaf38d727a0210538939" dependencies: babel-plugin-check-es2015-constants "^6.22.0" - babel-plugin-syntax-trailing-function-commas "^6.22.0" - babel-plugin-transform-async-to-generator "^6.22.0" babel-plugin-transform-es2015-arrow-functions "^6.22.0" babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" - babel-plugin-transform-es2015-block-scoping "^6.23.0" - babel-plugin-transform-es2015-classes "^6.23.0" - babel-plugin-transform-es2015-computed-properties "^6.22.0" - babel-plugin-transform-es2015-destructuring "^6.23.0" - babel-plugin-transform-es2015-duplicate-keys "^6.22.0" - babel-plugin-transform-es2015-for-of "^6.23.0" - babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.24.1" + babel-plugin-transform-es2015-classes "^6.24.1" + babel-plugin-transform-es2015-computed-properties "^6.24.1" + babel-plugin-transform-es2015-destructuring "^6.22.0" + babel-plugin-transform-es2015-duplicate-keys "^6.24.1" + babel-plugin-transform-es2015-for-of "^6.22.0" + babel-plugin-transform-es2015-function-name "^6.24.1" babel-plugin-transform-es2015-literals "^6.22.0" - babel-plugin-transform-es2015-modules-amd "^6.22.0" - babel-plugin-transform-es2015-modules-commonjs "^6.23.0" - babel-plugin-transform-es2015-modules-systemjs "^6.23.0" - babel-plugin-transform-es2015-modules-umd "^6.23.0" - babel-plugin-transform-es2015-object-super "^6.22.0" - babel-plugin-transform-es2015-parameters "^6.23.0" - babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-plugin-transform-es2015-modules-commonjs "^6.24.1" + babel-plugin-transform-es2015-modules-systemjs "^6.24.1" + babel-plugin-transform-es2015-modules-umd "^6.24.1" + babel-plugin-transform-es2015-object-super "^6.24.1" + babel-plugin-transform-es2015-parameters "^6.24.1" + babel-plugin-transform-es2015-shorthand-properties "^6.24.1" babel-plugin-transform-es2015-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.24.1" babel-plugin-transform-es2015-template-literals "^6.22.0" - babel-plugin-transform-es2015-typeof-symbol "^6.23.0" - babel-plugin-transform-es2015-unicode-regex "^6.22.0" - babel-plugin-transform-exponentiation-operator "^6.22.0" - babel-plugin-transform-regenerator "^6.22.0" - browserslist "^2.1.2" - invariant "^2.2.2" - semver "^5.3.0" + babel-plugin-transform-es2015-typeof-symbol "^6.22.0" + babel-plugin-transform-es2015-unicode-regex "^6.24.1" + babel-plugin-transform-regenerator "^6.24.1" babel-register@^6.26.0: version "6.26.0" @@ -653,6 +693,22 @@ base64id@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/base64id/-/base64id-1.0.0.tgz#47688cb99bb6804f0e06d3e763b1c32e57d8e6b6" +base@^0.11.1: + version "0.11.2" + resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16" + bcrypt-pbkdf@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" @@ -691,7 +747,7 @@ bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.1.1, bn.js@^4.4.0: version "4.11.8" resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.8.tgz#2cde09eb5ee341f484746bb0309b3253b1b1442f" -body-parser@^1.16.1: +body-parser@1.18.2, body-parser@^1.16.1: version "1.18.2" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.2.tgz#87678a19d84b47d859b83199bd59bce222b10454" dependencies: @@ -706,6 +762,17 @@ body-parser@^1.16.1: raw-body "2.3.2" type-is "~1.6.15" +bonjour@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz#8e890a183d8ee9a2393b3844c691a42bcf7bc9f5" + dependencies: + array-flatten "^2.1.0" + deep-equal "^1.0.1" + dns-equal "^1.0.0" + dns-txt "^2.0.2" + multicast-dns "^6.0.1" + multicast-dns-service-types "^1.1.0" + boom@2.x.x: version "2.10.1" resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" @@ -733,6 +800,22 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" +braces@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.0.tgz#a46941cb5fb492156b3d6a656e06c35364e3e66e" + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + brorand@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" @@ -789,12 +872,9 @@ browserify-zlib@^0.1.4: dependencies: pako "~0.2.0" -browserslist@^2.1.2: - version "2.7.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.7.0.tgz#dc375dc70048fec3d989042a35022342902eff00" - dependencies: - caniuse-lite "^1.0.30000757" - electron-to-chromium "^1.3.27" +buffer-indexof@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz#52fabcc6a606d1a00302802648ef68f639da268c" buffer-xor@^1.0.3: version "1.0.3" @@ -820,22 +900,47 @@ bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" +cache-base@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + callsite@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20" +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + camelcase@^1.0.2: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +camelcase@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" + camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" -caniuse-lite@^1.0.30000757: - version "1.0.30000758" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000758.tgz#e261140076651049cf6891ed4bc649b5c8c26c69" - caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -872,7 +977,7 @@ chokidar@1.6.1: optionalDependencies: fsevents "^1.0.0" -chokidar@^1.4.1, chokidar@^1.7.0: +chokidar@^1.4.1, chokidar@^1.6.1, chokidar@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" dependencies: @@ -887,6 +992,23 @@ chokidar@^1.4.1, chokidar@^1.7.0: optionalDependencies: fsevents "^1.0.0" +chokidar@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.0.0.tgz#6686313c541d3274b2a5c01233342037948c911b" + dependencies: + anymatch "^2.0.0" + async-each "^1.0.0" + braces "^2.3.0" + glob-parent "^3.1.0" + inherits "^2.0.1" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^2.1.1" + path-is-absolute "^1.0.0" + readdirp "^2.0.0" + optionalDependencies: + fsevents "^1.0.0" + cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz#8760e4ecc272f4c363532f926d874aae2c1397de" @@ -894,6 +1016,15 @@ cipher-base@^1.0.0, cipher-base@^1.0.1, cipher-base@^1.0.3: inherits "^2.0.1" safe-buffer "^5.0.1" +class-utils@^0.3.5: + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + cliui@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1" @@ -918,6 +1049,13 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" +collection-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + colors@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" @@ -940,6 +1078,14 @@ commander@2.9.0: dependencies: graceful-readlink ">= 1.0.0" +commander@^2.11.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + +commander@~2.12.1: + version "2.12.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -952,7 +1098,7 @@ component-emitter@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.1.2.tgz#296594f2753daa63996d2af08d15a95116c9aec3" -component-emitter@1.2.1: +component-emitter@1.2.1, component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" @@ -960,17 +1106,31 @@ component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" +compressible@~2.0.11: + version "2.0.12" + resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.12.tgz#c59a5c99db76767e9876500e271ef63b3493bd66" + dependencies: + mime-db ">= 1.30.0 < 2" + +compression@^1.5.2: + version "1.7.1" + resolved "https://registry.yarnpkg.com/compression/-/compression-1.7.1.tgz#eff2603efc2e22cf86f35d2eb93589f9875373db" + dependencies: + accepts "~1.3.4" + bytes "3.0.0" + compressible "~2.0.11" + debug "2.6.9" + on-headers "~1.0.1" + safe-buffer "5.1.1" + vary "~1.1.2" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" -concat-stream@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" - dependencies: - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" +connect-history-api-fallback@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz#b06873934bc5e344fef611a196a6faae0aee015a" connect@^3.6.0: version "3.6.5" @@ -995,22 +1155,38 @@ constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" +content-disposition@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" + content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" convert-source-map@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" cookie@0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" -core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0: +copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + +core-js@^2.2.0: version "2.5.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" +core-js@^2.4.0, core-js@^2.5.0: + version "2.5.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" + core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" @@ -1072,6 +1248,12 @@ crypto-browserify@^3.11.0: randombytes "^2.0.0" randomfill "^1.0.3" +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + custom-event@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/custom-event/-/custom-event-1.0.1.tgz#5d02a46850adf1b4a317946a3928fccb5bfd0425" @@ -1104,20 +1286,64 @@ debug@2.3.3: dependencies: ms "0.7.2" -debug@2.6.9, debug@^2.2.0, debug@^2.6.8: +debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" -decamelize@^1.0.0, decamelize@^1.1.1: +debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + +decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" +decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + +deep-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" + deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" +define-properties@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" + dependencies: + foreach "^2.0.5" + object-keys "^1.0.8" + +define-property@^0.2.5: + version "0.2.5" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + dependencies: + is-descriptor "^0.1.0" + +define-property@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + dependencies: + is-descriptor "^1.0.0" + +del@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/del/-/del-3.0.0.tgz#53ecf699ffcbcb39637691ab13baf160819766e5" + dependencies: + 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" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1137,6 +1363,10 @@ des.js@^1.0.0: inherits "^2.0.1" minimalistic-assert "^1.0.0" +destroy@~1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + detect-file@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-0.1.0.tgz#4935dedfd9488648e006b0129566e9386711ea63" @@ -1149,6 +1379,10 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" +detect-node@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.3.tgz#a2033c09cc8e158d37748fbde7507832bd6ce127" + di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" @@ -1165,6 +1399,23 @@ diffie-hellman@^5.0.0: miller-rabin "^4.0.0" randombytes "^2.0.0" +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz#b39e7f1da6eb0a75ba9c17324b34753c47e0654d" + +dns-packet@^1.0.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.2.2.tgz#a8a26bec7646438963fc86e06f8f8b16d6c8bf7a" + dependencies: + ip "^1.1.0" + safe-buffer "^5.0.1" + +dns-txt@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz#b91d806f5d27188e4ab3e7d107d881a1cc4642b6" + dependencies: + buffer-indexof "^1.0.0" + dom-serialize@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b" @@ -1188,10 +1439,6 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" -electron-to-chromium@^1.3.27: - version "1.3.27" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" - elliptic@^6.0.0: version "6.4.0" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" @@ -1280,6 +1527,24 @@ error-ex@^1.2.0: dependencies: is-arrayish "^0.2.1" +es-abstract@^1.7.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: version "0.10.35" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.35.tgz#18ee858ce6a3c45c7d79e91c15fcca9ec568494f" @@ -1306,10 +1571,6 @@ es6-map@^0.1.3: es6-symbol "~3.1.1" event-emitter "~0.3.5" -es6-promise@~4.0.3: - version "4.0.5" - resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.0.5.tgz#7882f30adde5b240ccfa7f7d78c548330951ae42" - es6-set@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" @@ -1368,6 +1629,10 @@ esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + event-emitter@~0.3.5: version "0.3.5" resolved "https://registry.yarnpkg.com/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" @@ -1383,6 +1648,12 @@ events@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" +eventsource@0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" + dependencies: + original ">=0.0.5" + evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz#7fcbdb198dc71959432efe13842684e0525acb02" @@ -1420,6 +1691,18 @@ expand-brackets@^0.1.4: dependencies: is-posix-bracket "^0.1.0" +expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + expand-range@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-0.1.1.tgz#4cb8eda0993ca56fa4f41fc42f3cbb4ccadff044" @@ -1439,6 +1722,54 @@ expand-tilde@^1.2.2: dependencies: os-homedir "^1.0.1" +express@^4.16.2: + version "4.16.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" + dependencies: + accepts "~1.3.4" + array-flatten "1.1.1" + body-parser "1.18.2" + content-disposition "0.5.2" + content-type "~1.0.4" + cookie "0.3.1" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.1" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.1.0" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.2" + path-to-regexp "0.1.7" + proxy-addr "~2.0.2" + qs "6.5.1" + range-parser "~1.2.0" + safe-buffer "5.1.1" + send "0.16.1" + serve-static "1.13.1" + setprototypeof "1.1.0" + statuses "~1.3.1" + type-is "~1.6.15" + utils-merge "1.0.1" + vary "~1.1.2" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend-shallow@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + extend@^3.0.0, extend@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -1449,14 +1780,18 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" -extract-zip@~1.6.5: - version "1.6.5" - resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.5.tgz#99a06735b6ea20ea9b705d779acffcc87cff0440" +extglob@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.3.tgz#55e019d0c95bf873949c737b7e5172dba84ebb29" dependencies: - concat-stream "1.6.0" - debug "2.2.0" - mkdirp "0.5.0" - yauzl "2.4.1" + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" extsprintf@1.3.0, extsprintf@^1.2.0: version "1.3.0" @@ -1470,11 +1805,17 @@ fast-json-stable-stringify@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" +faye-websocket@^0.10.0: + version "0.10.0" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" + dependencies: + websocket-driver ">=0.5.1" + +faye-websocket@~0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" dependencies: - pend "~1.2.0" + websocket-driver ">=0.5.1" filename-regex@^2.0.0: version "2.0.1" @@ -1490,6 +1831,15 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" +fill-range@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + finalhandler@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f" @@ -1502,6 +1852,18 @@ finalhandler@1.0.6: statuses "~1.3.1" unpipe "~1.0.0" +finalhandler@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.0.tgz#ce0b6855b45853e791b2fcc680046d88253dd7f5" + dependencies: + debug "2.6.9" + encodeurl "~1.0.1" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.2" + statuses "~1.3.1" + unpipe "~1.0.0" + find-cache-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-1.0.0.tgz#9288e3e9e3cc3748717d39eade17cf71fc30ee6f" @@ -1510,6 +1872,13 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + find-up@^2.0.0, find-up@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" @@ -1525,7 +1894,7 @@ findup-sync@0.4.3: micromatch "^2.3.7" resolve-dir "^0.1.0" -for-in@^1.0.1: +for-in@^1.0.1, for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -1535,6 +1904,10 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" +foreach@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" + forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -1553,6 +1926,20 @@ formatio@1.2.0, formatio@^1.2.0: dependencies: samsam "1.x" +forwarded@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + +fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + dependencies: + map-cache "^0.2.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + fs-access@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/fs-access/-/fs-access-1.0.1.tgz#d6a87f262271cefebec30c553407fb995da8777a" @@ -1563,13 +1950,9 @@ fs-exists-sync@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz#982d6893af918e72d08dec9e8673ff2b5a8d6add" -fs-extra@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^2.1.0" - klaw "^1.0.0" +fs-readdir-recursive@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz#e32fc030a2ccee44a6b5371308da54be0b397d27" fs.realpath@^1.0.0: version "1.0.0" @@ -1599,6 +1982,10 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" +function-bind@^1.0.2, function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + gauge@~2.7.3: version "2.7.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" @@ -1616,10 +2003,18 @@ get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" +get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -1639,9 +2034,16 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@^7.0.5, glob@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" +glob-parent@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -1670,7 +2072,17 @@ globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c" + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.2, graceful-fs@^4.1.4: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -1678,6 +2090,10 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" +handle-thing@^1.2.5: + version "1.2.5" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" + har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" @@ -1713,6 +2129,39 @@ has-unicode@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" +has-value@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + +has-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + +has-values@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + +has-values@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +has@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" + dependencies: + function-bind "^1.0.2" + hash-base@^2.0.0: version "2.0.2" resolved "https://registry.yarnpkg.com/hash-base/-/hash-base-2.0.2.tgz#66ea1d856db4e8a5470cadf6fce23ae5244ef2e1" @@ -1733,13 +2182,6 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.0" -hasha@~2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/hasha/-/hasha-2.2.0.tgz#78d7cbfc1e6d66303fe79837365984517b2f6ee1" - dependencies: - is-stream "^1.0.1" - pinkie-promise "^2.0.0" - hawk@3.1.3, hawk@~3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" @@ -1778,6 +2220,23 @@ hosted-git-info@^2.1.4: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz#87774c0949e513f42e84575b3c45681fade2a0b2" + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-entities@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" + http-errors@1.6.2, http-errors@~1.6.2: version "1.6.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.2.tgz#0a002cc85707192a7e7946ceedc11155f60ec736" @@ -1787,7 +2246,20 @@ http-errors@1.6.2, http-errors@~1.6.2: setprototypeof "1.0.3" statuses ">= 1.3.1 < 2" -http-proxy@^1.13.0: +http-parser-js@>=0.4.0: + version "0.4.9" + resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.4.9.tgz#ea1a04fb64adff0242e9974f297dd4c3cad271e1" + +http-proxy-middleware@~0.17.4: + version "0.17.4" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz#642e8848851d66f09d4f124912846dbaeb41b833" + dependencies: + http-proxy "^1.16.2" + is-glob "^3.1.0" + lodash "^4.17.2" + micromatch "^2.3.11" + +http-proxy@^1.13.0, http-proxy@^1.16.2: version "1.16.2" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.16.2.tgz#06dff292952bf64dbe8471fa9df73066d4f37742" dependencies: @@ -1814,6 +2286,19 @@ ieee754@^1.1.4: version "1.1.8" resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" +import-local@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" + dependencies: + pkg-dir "^2.0.0" + resolve-cwd "^2.0.0" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + indexof@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/indexof/-/indexof-0.0.1.tgz#82dc336d232b9062179d05ab3293a66059fd435d" @@ -1837,6 +2322,12 @@ ini@^1.3.4, ini@~1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" +internal-ip@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" + dependencies: + meow "^3.3.0" + interpret@^1.0.0: version "1.0.4" resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" @@ -1851,6 +2342,26 @@ invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" +ip@^1.1.0, ip@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a" + +ipaddr.js@1.5.2: + version "1.5.2" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.5.2.tgz#d4b505bde9946987ccf0fc58d9010ff9607e3fa0" + +is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + dependencies: + kind-of "^3.0.2" + +is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + dependencies: + kind-of "^6.0.0" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -1871,6 +2382,42 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + +is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + dependencies: + kind-of "^3.0.2" + +is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + dependencies: + kind-of "^6.0.0" + +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + +is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + +is-descriptor@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + is-dotfile@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" @@ -1881,14 +2428,24 @@ is-equal-shallow@^0.1.3: dependencies: is-primitive "^2.0.0" -is-extendable@^0.1.1: +is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" +is-extendable@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + dependencies: + is-plain-object "^2.0.4" + is-extglob@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" +is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + is-finite@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" @@ -1911,6 +2468,18 @@ is-glob@^2.0.0, is-glob@^2.0.1: dependencies: is-extglob "^1.0.0" +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-glob@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" + dependencies: + is-extglob "^2.1.1" + is-number@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" @@ -1927,6 +2496,34 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" +is-odd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-odd/-/is-odd-1.0.0.tgz#3b8a932eb028b3775c39bb09e91767accdb69088" + dependencies: + is-number "^3.0.0" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + dependencies: + isobject "^3.0.1" + is-posix-bracket@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" @@ -1935,18 +2532,36 @@ is-primitive@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" -is-stream@^1.0.1, is-stream@^1.1.0: +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + is-windows@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-0.2.0.tgz#de1aa6d63ea29dd248737b69f1ff8b8002d2108c" +is-wsl@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -1969,14 +2584,14 @@ isobject@^2.0.0: dependencies: isarray "1.0.0" +isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -jquery@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.2.1.tgz#5c4d9de652af6cd0a770154a631bba12b015c787" - js-reporters@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/js-reporters/-/js-reporters-1.2.0.tgz#7cf2cb698196684790350d0c4ca07f4aed9ec17e" @@ -2019,7 +2634,7 @@ json-stringify-safe@~5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" -json3@3.3.2: +json3@3.3.2, json3@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" @@ -2027,12 +2642,6 @@ json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" -jsonfile@^2.1.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" - optionalDependencies: - graceful-fs "^4.1.6" - jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" @@ -2050,9 +2659,11 @@ just-extend@^1.1.26: version "1.1.27" resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905" -karma-babel-preprocessor@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/karma-babel-preprocessor/-/karma-babel-preprocessor-7.0.0.tgz#18756d818f97a5e88f91902674cd9130177a8dce" +karma-babel-preprocessor@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/karma-babel-preprocessor/-/karma-babel-preprocessor-6.0.1.tgz#7ae1d3e64950dbe11f421b74040ab08fb5a66c21" + dependencies: + babel-core "^6.0.0" karma-chrome-launcher@^2.2.0: version "2.2.0" @@ -2061,13 +2672,6 @@ karma-chrome-launcher@^2.2.0: fs-access "^1.0.0" which "^1.2.1" -karma-phantomjs-launcher@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/karma-phantomjs-launcher/-/karma-phantomjs-launcher-1.0.4.tgz#d23ca34801bda9863ad318e3bb4bd4062b13acd2" - dependencies: - lodash "^4.0.1" - phantomjs-prebuilt "^2.1.7" - karma-qunit@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/karma-qunit/-/karma-qunit-1.2.1.tgz#88252afd2127bc03b0cc31978ed6882b139f470a" @@ -2124,11 +2728,11 @@ karma@^1.7.1: tmp "0.0.31" useragent "^2.1.12" -kew@~0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" +killable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/killable/-/killable-1.0.0.tgz#da8b84bd47de5395878f95d64d02f2449fe05e6b" -kind-of@^3.0.2: +kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" dependencies: @@ -2140,22 +2744,40 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -klaw@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/klaw/-/klaw-1.3.1.tgz#4088433b46b3b1ba259d78785d8e96f73ba02439" - optionalDependencies: - graceful-fs "^4.1.9" +kind-of@^5.0.0, kind-of@^5.0.2: + version "5.1.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + +kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.2.tgz#01146b36a6218e64e58f3a8d66de5d7fc6f6d051" lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" +lazy-cache@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264" + dependencies: + set-getter "^0.1.0" + lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" dependencies: invert-kv "^1.0.0" +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + load-json-file@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-2.0.0.tgz#7947e42149af80d696cbf797bcaabcfe1fe29ca8" @@ -2201,7 +2823,7 @@ lodash@^3.8.0: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.0.1, lodash@^4.14.0, lodash@^4.17.4, lodash@^4.5.0: +lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.5.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -2212,6 +2834,10 @@ log4js@^0.6.31: readable-stream "~1.0.2" semver "~4.3.3" +loglevel@^1.4.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.0.tgz#ae0caa561111498c5ba13723d6fb631d24003934" + lolex@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" @@ -2230,6 +2856,13 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0" +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + lru-cache@2.2.x: version "2.2.4" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" @@ -2247,6 +2880,20 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" +map-cache@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +map-visit@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + dependencies: + object-visit "^1.0.0" + matcher-collection@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/matcher-collection/-/matcher-collection-1.0.5.tgz#2ee095438372cb8884f058234138c05c644ec339" @@ -2277,7 +2924,30 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" -micromatch@^2.1.5, micromatch@^2.3.7: +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + 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" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + +micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: @@ -2295,6 +2965,24 @@ micromatch@^2.1.5, micromatch@^2.3.7: parse-glob "^3.0.4" regex-cache "^0.4.2" +micromatch@^3.1.4: + version "3.1.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.0" + define-property "^1.0.0" + extend-shallow "^2.0.1" + extglob "^2.0.2" + fragment-cache "^0.2.1" + kind-of "^6.0.0" + nanomatch "^1.2.5" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -2302,20 +2990,28 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" +"mime-db@>= 1.30.0 < 2": + version "1.32.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" + mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" -mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7: +mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.16, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" dependencies: mime-db "~1.30.0" -mime@^1.3.4: +mime@1.4.1, mime@^1.3.4: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" +mime@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + mimic-fn@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.1.0.tgz#e667783d92e89dbd342818b5230b9d62a672ad18" @@ -2338,7 +3034,7 @@ minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" -minimist@^1.2.0: +minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -2346,13 +3042,14 @@ minimist@~0.0.1: version "0.0.10" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" -mkdirp@0.5.0: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.0.tgz#1d73076a6df986cd9344e15e71fcc05a4c9abf12" +mixin-deep@^1.2.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" dependencies: - minimist "0.0.8" + for-in "^1.0.2" + is-extendable "^1.0.1" -"mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0: +mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.1, mkdirp@~0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" dependencies: @@ -2370,10 +3067,37 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +multicast-dns-service-types@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz#899f11d9686e5e05cb91b35d5f0e63b773cfc901" + +multicast-dns@^6.0.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.1.tgz#c5035defa9219d30640558a49298067352098060" + dependencies: + dns-packet "^1.0.1" + thunky "^0.1.0" + nan@^2.3.0: version "2.7.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.7.0.tgz#d95bf721ec877e08db276ed3fc6eb78f9083ad46" +nanomatch@^1.2.5: + version "1.2.7" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^1.0.0" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + is-odd "^1.0.0" + kind-of "^5.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + negotiator@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" @@ -2388,6 +3112,10 @@ nise@^1.2.0: path-to-regexp "^1.7.0" text-encoding "^0.6.4" +node-forge@0.6.33: + version "0.6.33" + resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.6.33.tgz#463811879f573d45155ad6a9f43dc296e8e85ebc" + node-libs-browser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.0.0.tgz#a3a59ec97024985b46e958379646f96c4b616646" @@ -2438,7 +3166,7 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2: +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" dependencies: @@ -2447,7 +3175,7 @@ normalize-package-data@^2.3.2: semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.0.0, normalize-path@^2.0.1, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: @@ -2492,6 +3220,24 @@ object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" +object-copy@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + +object-keys@^1.0.8: + version "1.0.11" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" + +object-visit@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + dependencies: + isobject "^3.0.0" + object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -2499,18 +3245,38 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" +object.pick@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + dependencies: + isobject "^3.0.1" + +obuf@^1.0.0, obuf@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.1.tgz#104124b6c602c6796881a042541d36db43a5264e" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" dependencies: ee-first "1.1.1" +on-headers@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" + once@^1.3.0, once@^1.3.3: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: wrappy "1" +opn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" + dependencies: + is-wsl "^1.1.0" + optimist@^0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" @@ -2522,6 +3288,12 @@ options@>=0.0.5: version "0.0.6" resolved "https://registry.yarnpkg.com/options/-/options-0.0.6.tgz#ec22d312806bb53e731773e7cdaefcf1c643128f" +original@>=0.0.5: + version "1.0.0" + resolved "https://registry.yarnpkg.com/original/-/original-1.0.0.tgz#9147f93fa1696d04be61e01bd50baeaca656bd3b" + dependencies: + url-parse "1.0.x" + os-browserify@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.2.1.tgz#63fc4ccee5d2d7763d26bbf8601078e6c2e0044f" @@ -2530,6 +3302,12 @@ os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" +os-locale@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" + dependencies: + lcid "^1.0.0" + os-locale@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" @@ -2549,6 +3327,14 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +output-file-sync@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76" + dependencies: + graceful-fs "^4.1.4" + mkdirp "^0.5.1" + object-assign "^4.1.0" + p-finally@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" @@ -2563,6 +3349,10 @@ p-locate@^2.0.0: dependencies: p-limit "^1.1.0" +p-map@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" + pako@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75" @@ -2618,10 +3408,24 @@ parseurl@~1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" +pascalcase@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -2630,6 +3434,10 @@ path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" +path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + path-key@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" @@ -2638,12 +3446,24 @@ path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + path-to-regexp@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" dependencies: isarray "0.0.1" +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + path-type@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-2.0.0.tgz#f012ccb8415b7096fc2daa1054c3d72389594c73" @@ -2660,28 +3480,10 @@ pbkdf2@^3.0.3: safe-buffer "^5.0.1" sha.js "^2.4.8" -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" -phantomjs-prebuilt@^2.1.7: - version "2.1.15" - resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.15.tgz#20f86e82d3349c505917527745b7a411e08b3903" - dependencies: - es6-promise "~4.0.3" - extract-zip "~1.6.5" - fs-extra "~1.0.0" - hasha "~2.2.0" - kew "~0.7.0" - progress "~1.1.8" - request "~2.81.0" - request-progress "~2.0.1" - which "~1.2.10" - pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -2706,6 +3508,18 @@ pkg-dir@^2.0.0: dependencies: find-up "^2.1.0" +portfinder@^1.0.9: + version "1.0.13" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.13.tgz#bb32ecd87c27104ae6ee44b5a3ccbf0ebb1aede9" + dependencies: + async "^1.5.2" + debug "^2.2.0" + mkdirp "0.5.x" + +posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" @@ -2722,9 +3536,12 @@ process@^0.11.0: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" -progress@~1.1.8: - version "1.1.8" - resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" +proxy-addr@~2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.5.2" prr@~0.0.0: version "0.0.0" @@ -2772,7 +3589,15 @@ querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" -qunitjs@^2.4.1: +querystringify@0.0.x: + version "0.0.4" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-0.0.4.tgz#0cf7f84f9463ff0ae51c4c4b142d95be37724d9c" + +querystringify@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-1.0.0.tgz#6286242112c5b712fa654e526652bf6a13ff05cb" + +qunitjs@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/qunitjs/-/qunitjs-2.4.1.tgz#88aba055a9e2ec3dbebfaad02471b2cb002c530b" dependencies: @@ -2804,7 +3629,7 @@ randomfill@^1.0.3: randombytes "^2.0.5" safe-buffer "^5.1.0" -range-parser@^1.0.3, range-parser@^1.2.0: +range-parser@^1.0.3, range-parser@^1.2.0, range-parser@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" @@ -2826,6 +3651,13 @@ rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~2.0.1" +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + read-pkg-up@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-2.0.0.tgz#6b72a8048984e0c41e79510fd5e9fa99b3b549be" @@ -2833,6 +3665,14 @@ read-pkg-up@^2.0.0: find-up "^2.0.0" read-pkg "^2.0.0" +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + read-pkg@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-2.0.0.tgz#8ef1c0623c6a6db0dc6713c4bfac46332b2368f8" @@ -2841,7 +3681,7 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.2.6: +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.6, readable-stream@^2.2.9: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -2871,13 +3711,24 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + regenerate@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" +regenerator-runtime@^0.10.5: + version "0.10.5" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" + regenerator-runtime@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" regenerator-transform@^0.10.0: version "0.10.1" @@ -2893,6 +3744,12 @@ regex-cache@^0.4.2: dependencies: is-equal-shallow "^0.1.3" +regex-not@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.0.tgz#42f83e39771622df826b02af176525d6a5f157f9" + dependencies: + extend-shallow "^2.0.1" + regexpu-core@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" @@ -2923,7 +3780,7 @@ repeat-string@^0.2.2: version "0.2.2" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" -repeat-string@^1.5.2: +repeat-string@^1.5.2, repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" @@ -2933,13 +3790,7 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request-progress@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/request-progress/-/request-progress-2.0.1.tgz#5d36bb57961c673aa5b788dbc8141fdf23b44e08" - dependencies: - throttleit "^1.0.0" - -request@2.81.0, request@~2.81.0: +request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -2974,10 +3825,16 @@ require-main-filename@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" -requires-port@1.x.x: +requires-port@1.0.x, requires-port@1.x.x, requires-port@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" +resolve-cwd@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" + dependencies: + resolve-from "^3.0.0" + resolve-dir@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-0.1.1.tgz#b219259a5602fac5c5c496ad894a6e8cc430261e" @@ -2985,6 +3842,14 @@ resolve-dir@^0.1.0: expand-tilde "^1.2.2" global-modules "^0.2.3" +resolve-from@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" + +resolve-url@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + resolve@1.3.2: version "1.3.2" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.2.tgz#1f0442c9e0cbb8136e87b9305f932f46c7f28235" @@ -2997,7 +3862,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.5.1, rimraf@^2.6.0, rimraf@^2.6.1: +rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.0, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -3010,7 +3875,7 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^2.0.0" inherits "^2.0.1" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: +safe-buffer@5.1.1, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -3018,6 +3883,16 @@ samsam@1.x: version "1.3.0" resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" + +selfsigned@^1.9.1: + version "1.10.1" + resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.1.tgz#bf8cb7b83256c4551e31347c6311778db99eec52" + dependencies: + node-forge "0.6.33" + "semver@2 || 3 || 4 || 5", semver@^5.3.0: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" @@ -3026,14 +3901,77 @@ semver@~4.3.3: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" +send@0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/send/-/send-0.16.1.tgz#a70e1ca21d1382c11d0d9f6231deb281080d7ab3" + dependencies: + debug "2.6.9" + depd "~1.1.1" + destroy "~1.0.4" + encodeurl "~1.0.1" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.6.2" + mime "1.4.1" + ms "2.0.0" + on-finished "~2.3.0" + range-parser "~1.2.0" + statuses "~1.3.1" + +serve-index@^1.7.2: + version "1.9.1" + resolved "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz#d3768d69b1e7d82e5ce050fff5b453bea12a9239" + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.13.1: + version "1.13.1" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.1.tgz#4c57d53404a761d8f2e7c1e8a18a47dbf278a719" + dependencies: + encodeurl "~1.0.1" + escape-html "~1.0.3" + parseurl "~1.3.2" + send "0.16.1" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" +set-getter@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376" + dependencies: + to-object-path "^0.3.0" + set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" +set-value@^0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-0.4.3.tgz#7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.1" + to-object-path "^0.3.0" + +set-value@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.0.tgz#71ae4a88f0feefbbf52d1ea604f3fb315ebb6274" + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + setimmediate@^1.0.4: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -3042,6 +3980,10 @@ setprototypeof@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" + sha.js@^2.4.0, sha.js@^2.4.8: version "2.4.9" resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.9.tgz#98f64880474b74f4a38b8da9d3c0f2d104633e7d" @@ -3079,6 +4021,33 @@ slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" +snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + +snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + dependencies: + kind-of "^3.2.0" + +snapdragon@^0.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.1.tgz#e12b5487faded3e3dea0ac91e9400bf75b401370" + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^2.0.0" + sntp@1.x.x: version "1.0.9" resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" @@ -3129,16 +4098,48 @@ socket.io@1.7.3: socket.io-client "1.7.3" socket.io-parser "2.3.1" +sockjs-client@1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.4.tgz#5babe386b775e4cf14e7520911452654016c8b12" + dependencies: + debug "^2.6.6" + eventsource "0.1.6" + faye-websocket "~0.11.0" + inherits "^2.0.1" + json3 "^3.3.2" + url-parse "^1.1.8" + +sockjs@0.3.19: + version "0.3.19" + resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.19.tgz#d976bbe800af7bd20ae08598d582393508993c0d" + dependencies: + faye-websocket "^0.10.0" + uuid "^3.0.1" + source-list-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" +source-map-resolve@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.1.tgz#7ad0f593f2281598e854df80f19aae4b92d7a11a" + dependencies: + atob "^2.0.0" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" dependencies: source-map "^0.5.6" +source-map-url@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" + source-map@^0.1.41: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" @@ -3167,6 +4168,35 @@ spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" +spdy-transport@^2.0.18: + version "2.0.20" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.0.20.tgz#735e72054c486b2354fe89e702256004a39ace4d" + dependencies: + debug "^2.6.8" + detect-node "^2.0.3" + hpack.js "^2.1.6" + obuf "^1.1.1" + readable-stream "^2.2.9" + safe-buffer "^5.0.1" + wbuf "^1.7.2" + +spdy@^3.4.1: + version "3.4.7" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" + dependencies: + debug "^2.6.8" + handle-thing "^1.2.5" + http-deceiver "^1.2.7" + safe-buffer "^5.0.1" + select-hose "^2.0.0" + spdy-transport "^2.0.18" + +split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + dependencies: + extend-shallow "^3.0.0" + sshpk@^1.7.0: version "1.13.1" resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" @@ -3181,6 +4211,13 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" +static-extend@^0.1.1: + version "0.1.2" + resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + "statuses@>= 1.3.1 < 2", statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" @@ -3243,6 +4280,12 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -3251,6 +4294,12 @@ strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -3265,6 +4314,12 @@ supports-color@^4.2.1, supports-color@^4.4.0: dependencies: has-flag "^2.0.0" +supports-color@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5" + dependencies: + has-flag "^2.0.0" + tapable@^0.2.7: version "0.2.8" resolved "https://registry.yarnpkg.com/tapable/-/tapable-0.2.8.tgz#99372a5c999bf2df160afc0d74bed4f47948cd22" @@ -3294,9 +4349,9 @@ text-encoding@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" -throttleit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/throttleit/-/throttleit-1.0.0.tgz#9e785836daf46743145a5984b6268d828528ac6c" +thunky@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/thunky/-/thunky-0.1.0.tgz#bf30146824e2b6e67b0f2d7a4ac8beb26908684e" time-stamp@^2.0.0: version "2.0.0" @@ -3332,12 +4387,37 @@ to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" +to-object-path@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + dependencies: + kind-of "^3.0.2" + +to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + +to-regex@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.1.tgz#15358bee4a2c83bd76377ba1dc049d0f18837aae" + dependencies: + define-property "^0.2.5" + extend-shallow "^2.0.1" + regex-not "^1.0.0" + tough-cookie@~2.3.0: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" dependencies: punycode "^1.4.1" +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" @@ -3367,10 +4447,6 @@ type-is@~1.6.15: media-typer "0.3.0" mime-types "~2.1.15" -typedarray@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - uglify-js@^2.8.29: version "2.8.29" resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd" @@ -3380,6 +4456,13 @@ uglify-js@^2.8.29: optionalDependencies: uglify-to-browserify "~1.0.0" +uglify-js@^3.0.18: + version "3.3.5" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.3.5.tgz#4c4143dfe08e8825746675cc49a6874a933b543e" + dependencies: + commander "~2.12.1" + source-map "~0.6.1" + uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" @@ -3400,10 +4483,44 @@ ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" +union-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.0.tgz#5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4" + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^0.4.3" + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" +unset-value@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + +urix@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + +url-parse@1.0.x: + version "1.0.5" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.0.5.tgz#0854860422afdcfefeb6c965c662d4800169927b" + dependencies: + querystringify "0.0.x" + requires-port "1.0.x" + +url-parse@^1.1.8: + version "1.2.0" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.2.0.tgz#3a19e8aaa6d023ddd27dcc44cb4fc8f7fec23986" + dependencies: + querystringify "~1.0.0" + requires-port "~1.0.0" + url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -3411,6 +4528,18 @@ url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/use/-/use-2.0.2.tgz#ae28a0d72f93bf22422a18a2e379993112dec8e8" + dependencies: + define-property "^0.2.5" + isobject "^3.0.0" + lazy-cache "^2.0.2" + +user-home@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" + useragent@^2.1.12: version "2.2.1" resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.2.1.tgz#cf593ef4f2d175875e8bb658ea92e18a4fd06d8e" @@ -3432,10 +4561,16 @@ utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" -uuid@^3.0.0: +uuid@^3.0.0, uuid@^3.0.1: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" +v8flags@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4" + dependencies: + user-home "^1.1.1" + validate-npm-package-license@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" @@ -3443,6 +4578,10 @@ validate-npm-package-license@^3.0.1: spdx-correct "~1.0.0" spdx-expression-parse "~1.0.0" +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + verror@1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" @@ -3476,6 +4615,22 @@ watchpack@^1.4.0: chokidar "^1.7.0" graceful-fs "^4.1.2" +wbuf@^1.1.0, wbuf@^1.7.2: + version "1.7.2" + resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.2.tgz#d697b99f1f59512df2751be42769c1580b5801fe" + dependencies: + minimalistic-assert "^1.0.0" + +webpack-dev-middleware@1.12.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e" + dependencies: + memory-fs "~0.4.1" + mime "^1.5.0" + path-is-absolute "^1.0.0" + range-parser "^1.0.3" + time-stamp "^2.0.0" + webpack-dev-middleware@^1.0.11: version "1.12.0" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.0.tgz#d34efefb2edda7e1d3b5dbe07289513219651709" @@ -3486,6 +4641,38 @@ webpack-dev-middleware@^1.0.11: range-parser "^1.0.3" time-stamp "^2.0.0" +webpack-dev-server@^2.10.0: + version "2.10.1" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.10.1.tgz#a9768375346e62155860fe3cef3d4d641b24273e" + dependencies: + ansi-html "0.0.7" + array-includes "^3.0.3" + bonjour "^3.5.0" + chokidar "^2.0.0" + compression "^1.5.2" + connect-history-api-fallback "^1.3.0" + debug "^3.1.0" + del "^3.0.0" + express "^4.16.2" + html-entities "^1.2.0" + http-proxy-middleware "~0.17.4" + import-local "^1.0.0" + internal-ip "1.2.0" + ip "^1.1.5" + killable "^1.0.0" + loglevel "^1.4.1" + opn "^5.1.0" + portfinder "^1.0.9" + selfsigned "^1.9.1" + serve-index "^1.7.2" + sockjs "0.3.19" + sockjs-client "1.1.4" + spdy "^3.4.1" + strip-ansi "^4.0.0" + supports-color "^5.1.0" + webpack-dev-middleware "1.12.2" + yargs "6.6.0" + webpack-sources@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.2.tgz#d0148ec083b3b5ccef1035a6b3ec16442983b27a" @@ -3493,9 +4680,9 @@ webpack-sources@^1.0.1: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.8.1.tgz#b16968a81100abe61608b0153c9159ef8bb2bd83" +webpack@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.10.0.tgz#5291b875078cf2abf42bdd23afe3f8f96c17d725" dependencies: acorn "^5.0.0" acorn-dynamic-import "^2.0.0" @@ -3520,6 +4707,21 @@ webpack@^3.8.1: webpack-sources "^1.0.1" yargs "^8.0.2" +websocket-driver@>=0.5.1: + version "0.7.0" + resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.0.tgz#0caf9d2d755d93aee049d4bdd0d3fe2cca2a24eb" + dependencies: + http-parser-js ">=0.4.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.3" + resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" + +which-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" + which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -3530,12 +4732,6 @@ which@^1.2.1, which@^1.2.12, which@^1.2.9: dependencies: isexe "^2.0.0" -which@~1.2.10: - version "1.2.14" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" - dependencies: - isexe "^2.0.0" - wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" @@ -3592,12 +4788,36 @@ yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" +yargs-parser@^4.2.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" + dependencies: + camelcase "^3.0.0" + yargs-parser@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-7.0.0.tgz#8d0ac42f16ea55debd332caf4c4038b3e3f5dfd9" dependencies: camelcase "^4.1.0" +yargs@6.6.0: + version "6.6.0" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" + dependencies: + camelcase "^3.0.0" + cliui "^3.2.0" + decamelize "^1.1.1" + get-caller-file "^1.0.1" + os-locale "^1.4.0" + read-pkg-up "^1.0.1" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^1.0.2" + which-module "^1.0.0" + y18n "^3.2.1" + yargs-parser "^4.2.0" + yargs@^8.0.2: version "8.0.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-8.0.2.tgz#6299a9055b1cefc969ff7e79c1d918dceb22c360" @@ -3625,12 +4845,6 @@ yargs@~3.10.0: decamelize "^1.0.0" window-size "0.1.0" -yauzl@2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" - dependencies: - fd-slicer "~1.0.1" - yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"