From d6c5559fade412627b169bf18379e3e23b72164f Mon Sep 17 00:00:00 2001 From: John Bartos Date: Fri, 22 Feb 2019 14:16:36 -0500 Subject: [PATCH] Sync with master for TS changes (#193) * isCodecSupportedInMp4 test audio codecs as audio Fixes #1824. * Do not show `undefined` * package: rm npm-run-all as it contains "event-stream" (and maybe other dormant exploits?). see "flatmap-stream" * rewrite package-lock: removed event-stream and all deps got not fixed versions instead of a hat * update lock-file generated with npm v6.4.1 * package deps: npm remove --save mversion jshint * Added OpenPlayerJS to the list of players that support HLS.js (#2023) * NIT: fix typos in readme 1. Fix spelling of interdependent and environment 2. Correct the agreement in the phrase: 'imported/required by each other.' * Revert #2004 (#2027) * Fix 0.11.1 Regressions (#2028) * Create sourceBuffers if the max of 2 tracks has been reached, regardless of buffer codec events received * Replace Object.values with [].slice.call * Remux according to initial PTS so that streams start at 0 (#2030) * Buffer streams starting at 0 initPTS * Use PTS to determine if segments are contiguous * Remove code setting startPosition to buffer start * Remove seek to buffered start logic * Simplify EOS check by using frag states, move logic into shared superclass (#2040) * Simplify EOS check by using frag states, move logic into shared superclass * Move shared seek logic into base, clear fragCurrent on seek out of buffered range * Revert PTS wrapping code which produces incorrect cue times (#2044) * deploy demo/docs to netlify, not gh-pages * update demo links in issue template * format commit as code because it is slightly more readable * remove accidental "/" in readme * update note to access specific version api docs * include tag in idShort * escape ` * Check if PTS has wrapped after applying PTS time offset (#2056) * Check if PTS has wrapped after applying PTS time offset * Fix bug accessing buffered track array * Intialize vttCCs map with cc 0 (#2058) * Intiialize vttCCs map with cc 0 * use the version from package.json when deploying and include this in the deployments readme * fix: abrFactor greater than in docs * Changes clone function used in webpack config to be the webpack recommended merging library. * prod: add bandwidthEstimate method * docs: add bandwidthEstimate * test: add autotest * Convert buffer-controller.js to TypeScript Thank you to Tom Jenkinson for acting as a reviewer for this work, including writing some suggestions via the GitHub PR github.com/video-dev/hls.js/pull/2073. The commit history has been squashed as it was a fairly lengthly process to get everything working to support the conversion to TypeScript. Early in the history of this commit, we converted properties to be initialized to `null`. This was incorrect, as it changes the behaviour of code that uses `Object.keys` calls to check if an object has any keys on it. Before, they would be empty, but if the properties are set to null, this check is no longer valid and it changes the behaviour. This is something to look out for in the future of other conversions, as the values themselves are often times reset to the `null`, but begin as undefined. Added a common `types` folder for interfaces where the ownership of the type wasn't clear for the individual file. The default no-op logger which is the inferred usage did not have any arguments in it's method signature. By adding an argument, TypeScript is able to infer the correct interface. As well the Karma and Webpack configuration had to be updated to enable building TypeScript, and getting testing coverage information from Istanbul. Define lib "es2015" and "dom" to add HTMLMediaElement, SourceBuffer and Number.isFinite definitions to the TypeScript binary when it is doing type-checking. When attempting to lint the older version of `typescript-eslint-parser` would emit `no-undef` errors for TypeScript interfaces. Updating the package fixes this issue. Tom pointed out that we should not use global module declarations to extend default HTML types since users will eventually be importing *.d.ts files from the hls.js project and this would also extend their types. Due to this feedback switched to defining a module local type `ExtendedSourceBuffer`. Which instead extends with the `ended` prop. Event Handlers were set to be part of the private scope. While this has no effect now, it will be important to ensure other modules do not directly invoke the event handlers. Other methods that were prefixed with a `_` were also set into the private scope. Where possible, code was switched to early-exit to lower the cognitive load in conditional statements, an example of this was the doAppend method. Another cleanup statement was switching handling of error codes and the comments to be closer to the conditional to which they applied. Switched to using the Record type to help support access via the index signature [key: T] syntax in the future. An issue that was fixed in this commit was that The controller previous exposed the local `pendingTracks` property through the event and did not set the buffer on `this.tracks` instead opting to set it on the individual track, which bubbled up to the pendingTracks object, whose reference was lost in the buffer-controller module. This commit changes this behaviour so that the controller publishes `tracks` from the public variable on the controller rather than the pendingTracks which are passed into createSourceBuffers. This also means that this fixes the `.buffer.buffered` being undefined on the demo page. Added unit tests to cover the new behaviour of throwing an error if createSourceBuffer is called without an attached media element. * test: review changes * docs: review fix * prod: add review fix * docs: update Co-Authored-By: Beraliv * docs: update 2 * docs: fix link * test: equal => strictEqual * test: add mocked _bwEstimator * test: change description * test: (() => { ... }) => function () { ... } * Increase BufferHelper test coverage to 100% (#2052) * Increase adts.js test coverage to 100% (#2053) * Increase adts.js test coverage to 100% * Convert eme-controller to TypeScript. Added TypeScript types to the code. Handled media detached and removing the encrypted event listener. * Listen to media detached Clears the encrypted event listener from the HTMLMediaElement in controller, and releases the stored reference. * Choose bitrate in Bps (#2091) Simplify bandwidth calculation by making; change docs to correctly reference bandwidth in bits/s * Upgrade tests to Chai BDD & optimize runner (#2037) * Convert tests to Chai BDD * Invoke mocha with exit so that travis doesnt hang on func test completion * Fix #2061 * configure netlify for PR's this follows the same process that runs for canary releases * check if repo is shallow before fetching because on netlify it clones the whole thing * handle 'netlifyPr' in set-package-version * tabs => spaces * add commit to version when PR * always trim command output * Update Fragment and LevelKey to typescript. * Update usage of Fragment and LevelKey. * Don't pass prevFrag into EXT-X-MAP handling. * Add tests for parsing byte range as seperate call. * Only parse byte range if it exists. * Apply suggestions from code review Co-Authored-By: itsjamie <1956521+itsjamie@users.noreply.github.com> * Review changes. parseByteRange -> setByteRange - removed it returning the parsed value since its usage was like a setter. * Review comments pt.2 * Change tests to call setByteRange * Explicit handling of 'initSegment' conversion for bitwise operation. * Fix lint warnings in m3u8-parser.js in prep for TS conversion. (#2106) * fix console null reference in logger (in webworkers) (#2095) Fix null reference in logger when console is not available * (misc) Adding ace editor to demo to enable advanced customization (#2077) * Add handling for AES-128 encrypted initialization segments needing IV. * Change IV handling for initSegments to just log a warning. * Update webpack to use babel loader with support for TS. (#2119) * Upgrade to webpack 4, babel 7 * Use straight git link for webworkify dep * Use simpler git url * Re-add globalObject workaround * Bump karma dep versions * Dont preprocess non-test files * Use @babel/register over ts-node * Update demo `const` usage. * Use webpack debug config in Karma configuration rather than duplication. * Delete duplicate declaration --- .eslintrc.js | 1 + .github/ISSUE_TEMPLATE/bug_report.md | 4 +- .gitignore | 2 +- README.md | 17 +- demo/index.html | 112 +- demo/main.js | 1324 +++--- demo/style.css | 165 +- docs/API.md | 15 +- karma.conf.js | 67 +- netlify.toml | 14 + package.json | 57 +- scripts/build-deploy-gh-pages.sh | 60 - scripts/build-netlify.sh | 17 + scripts/deploy-netlify.sh | 42 + scripts/set-package-version.js | 20 +- scripts/travis.sh | 90 +- src/controller/audio-stream-controller.js | 7 +- ...fer-controller.js => buffer-controller.ts} | 515 ++- .../{eme-controller.js => eme-controller.ts} | 333 +- src/controller/level-controller.js | 2 +- src/controller/stream-controller.js | 8 +- src/demux/adts.js | 5 +- src/demux/demuxer-inline.js | 2 +- src/hls.js | 16 +- src/loader/fragment.js | 150 - src/loader/fragment.ts | 183 + src/loader/level-key.js | 18 - src/loader/level-key.ts | 24 + src/loader/m3u8-parser.js | 49 +- src/loader/playlist-loader.js | 4 +- src/types/segment.ts | 6 + src/types/track.ts | 20 + src/utils/ewma-bandwidth-estimator.js | 13 +- src/utils/logger.js | 5 +- tests/.eslintrc.js | 31 +- tests/functional/auto/setup.js | 4 +- tests/test-streams.js | 4 - tests/unit/controller/abr-controller.js | 5 + .../unit/controller/audio-track-controller.js | 14 +- tests/unit/controller/buffer-controller.js | 36 +- tests/unit/controller/eme-controller.js | 4 +- tests/unit/controller/stream-controller.js | 20 +- tests/unit/demuxer/adts.js | 415 ++ tests/unit/demuxer/demuxer.js | 7 +- tests/unit/hls.js | 19 + tests/unit/loader/fragment.js | 31 +- tests/unit/loader/playlist-loader.js | 4 +- tests/unit/utils/attr-list.js | 6 +- tests/unit/utils/buffer-helper.js | 224 +- tsconfig.json | 20 +- webpack.config.js | 319 +- yarn.lock | 4082 ++++++++++------- 52 files changed, 5310 insertions(+), 3302 deletions(-) create mode 100644 netlify.toml delete mode 100755 scripts/build-deploy-gh-pages.sh create mode 100755 scripts/build-netlify.sh create mode 100755 scripts/deploy-netlify.sh rename src/controller/{buffer-controller.js => buffer-controller.ts} (55%) rename src/controller/{eme-controller.js => eme-controller.ts} (56%) delete mode 100644 src/loader/fragment.js create mode 100644 src/loader/fragment.ts delete mode 100644 src/loader/level-key.js create mode 100644 src/loader/level-key.ts create mode 100644 src/types/segment.ts create mode 100644 src/types/track.ts create mode 100644 tests/unit/demuxer/adts.js create mode 100644 tests/unit/hls.js diff --git a/.eslintrc.js b/.eslintrc.js index d78d772b9b2..d7ee0dabcae 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,5 +1,6 @@ module.exports = { 'env': { + 'browser': true, 'commonjs': true, 'es6': true }, diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index c75eb6ff5d2..16c540fa66f 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -15,9 +15,9 @@ about: Create a report to help us improve ### Checklist - [ ] The issue observed is not already reported by searching on Github under https://github.com/video-dev/hls.js/issues -- [ ] The issue occurs in the stable client on https://video-dev.github.io/hls.js/stable/demo and not just on my page +- [ ] The issue occurs in the stable client on https://hls-js.netlify.com/demo and not just on my page -- [ ] The issue occurs in the latest client on https://video-dev.github.io/hls.js/latest/demo and not just on my page +- [ ] The issue occurs in the latest client on https://hls-js-latest.netlify.com/demo and not just on my page - [ ] The stream has correct Access-Control-Allow-Origin headers (CORS) - [ ] There are no network errors such as 404s in the browser console when trying to play the stream diff --git a/.gitignore b/.gitignore index c7315c28262..72b0c8ab87b 100644 --- a/.gitignore +++ b/.gitignore @@ -14,5 +14,5 @@ coverage/ # Build /dist -/gh-pages +/netlify /api-docs diff --git a/README.md b/README.md index 19e908698da..98b085fcc44 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ hls.js does not need any player, it works directly on top of a standard HTML```< hls.js is written in [ECMAScript6] (`*.js`) and [TypeScript] (`*.ts`) (strongly typed superset of ES6), and transpiled in ECMAScript5 using the [TypeScript compiler]. -Modules written in TS and plain JS/ES6 can be interdepent and imported/required by each others. +Modules written in TS and plain JS/ES6 can be interdependent and imported/required by each other. To build our distro bundle and serve our development environment we use [Webpack]. @@ -35,21 +35,21 @@ To build our distro bundle and serve our development environment we use [Webpack * [API and usage docs, with code examples](./docs/API.md) -* [Auto-Generated Docs (Latest Release)](http://video-dev.github.io/hls.js/stable/api-docs) -* [Auto-Generated Docs (Master)](http://video-dev.github.io/hls.js/latest/api-docs) +* [Auto-Generated Docs (Latest Release)](https://hls-js.netlify.com/api-docs) +* [Auto-Generated Docs (Master)](https://hls-js-latest.netlify.com/api-docs) -_Note you can access the docs for a particular version using "http://video-dev.github.io/hls.js/v[x.y.z]/api-docs"_ +_Note you can access the docs for a particular version using "[https://github.com/video-dev/hls.js/blob/deployments/README.md](https://github.com/video-dev/hls.js/blob/deployments/README.md)"_ ## Demo ### Latest Release -[https://video-dev.github.io/hls.js/stable/demo](https://video-dev.github.io/hls.js/stable/demo) +[https://hls-js.netlify.com/demo](https://hls-js.netlify.com/demo) ### Master -[https://video-dev.github.io/hls.js/latest/demo](https://video-dev.github.io/hls.js/latest/demo) +[https://hls-js-latest.netlify.com/demo](https://hls-js-latest.netlify.com/demo) ### Specific Version -"http://video-dev.github.io/hls.js/v[x.y.z]/demo" +Find the commit on [https://github.com/video-dev/hls.js/blob/deployments/README.md](https://github.com/video-dev/hls.js/blob/deployments/README.md). ## Getting Started @@ -114,6 +114,7 @@ hls.js is (being) integrated in the following players: - [Videojs](http://videojs.com) through [videojs-hls.js](https://github.com/streamroot/videojs-hls.js). hls.js is integrated as a SourceHandler -- new feature in Video.js 5. - [Videojs](http://videojs.com) through [videojs-contrib-hls.js](https://github.com/Peer5/videojs-contrib-hls.js). Production ready plug-in with full fallback compatibility built-in. - [Fluid Player](https://www.fluidplayer.com) + - [OpenPlayerJS](https://www.openplayerjs.com), as part of the [OpenPlayer project](https://github.com/openplayerjs) ## Chrome/Firefox integration @@ -254,7 +255,7 @@ Pull requests are welcome. Here is a quick guide on how to start. - First, checkout the repository and install required dependencies ```sh git clone https://github.com/video-dev/hls.js.git -# setup dev environement +# setup dev environment cd hls.js npm install # build dist/hls.js, watch file change for rebuild and launch demo page diff --git a/demo/index.html b/demo/index.html index 566ae4de8cf..6605d88c59c 100644 --- a/demo/index.html +++ b/demo/index.html @@ -1,23 +1,16 @@ - - - - + hls.js demo - - - - + -
@@ -50,49 +43,27 @@

+
+ -
- - - - - - + - + - + - - - - - - - +
+ +
+
+
+ Loading... +
+
+
+ + +
+
-
+ +
+
+ +

 
-      
-
-      

- -

+      
+      

 
       
diff --git a/demo/main.js b/demo/main.js index 29b20fd0325..c2350a00281 100644 --- a/demo/main.js +++ b/demo/main.js @@ -1,37 +1,52 @@ -const testStreams = require('../tests/test-streams'); +import {sortObject, copyTextToClipboard} from './demo-utils' + +const STORAGE_KEYS = { + Editor_Persistence: 'hlsjs:config-editor-persist', + Hls_Config : 'hlsjs:config' +}; +const testStreams = require('../tests/test-streams'); const defaultTestStreamUrl = testStreams['bbb'].url; +const sourceURL = decodeURIComponent(getURLParam('src', defaultTestStreamUrl)) -let bufferingIdx = -1; +let demoConfig = getURLParam('demoConfig', null) +if (demoConfig) { + demoConfig = JSON.parse(atob(demoConfig)) +} else { + demoConfig = {} +} -let selectedTestStream = null; +const hlsjsDefaults = { + debug: true, + enableWorker: true +}; -let lastSeekingIdx, - lastStartPosition, - lastDuration, - lastAudioTrackSwitchingIdx; - -let hls, - url, - events, - stats, - tracks, - fmp4Data, - enableStreaming = JSON.parse(getURLParam('enableStreaming', true)); - autoRecoverError = JSON.parse(getURLParam('autoRecoverError', true)), - enableWorker = JSON.parse(getURLParam('enableWorker', true)), - levelCapping = JSON.parse(getURLParam('levelCapping', -1)), - defaultAudioCodec = getURLParam('defaultAudioCodec', undefined), - widevineLicenseUrl = getURLParam('widevineLicenseURL', undefined), - dumpfMP4 = getURLParam('dumpfMP4', false); +let enableStreaming = getDemoConfigPropOrDefault('enableStreaming', true); +let autoRecoverError = getDemoConfigPropOrDefault('autoRecoverError', true); +let levelCapping = getDemoConfigPropOrDefault('levelCapping', -1); +let limitMetrics = getDemoConfigPropOrDefault('limitMetrics', -1); +let dumpfMP4 = getDemoConfigPropOrDefault('dumpfMP4', false); +let bufferingIdx = -1; +let selectedTestStream = null; let video = $('#video')[0]; - -video.volume = 0.05; +let startTime = Date.now() + +let lastSeekingIdx; +let lastStartPosition; +let lastDuration; +let lastAudioTrackSwitchingIdx; +let hls; +let url; +let events; +let stats; +let tracks; +let fmp4Data; +let configPersistenceEnabled = false; +let configEditor = null; $(document).ready(function() { - - //console.log(testStreams) + setupConfigEditor(); Object.keys(testStreams).forEach((key) => { const stream = testStreams[key]; @@ -53,17 +68,9 @@ $(document).ready(function() { $('#videoSize').change(function() { $('#video').width($('#videoSize').val()); - $('#buffered_c').width($('#videoSize').val()); + $('#bufferedCanvas').width($('#videoSize').val()); }); - $('#PlaybackControl').hide(); - $('#QualityLevelControl').hide(); - $('#AudioTrackControl').hide(); - $('#MetricsDisplay').hide(); - $('#StatsDisplay').hide(); - $('#metricsButtonWindow').toggle(windowSliding); - $('#metricsButtonFixed').toggle(!windowSliding); - $('#enableStreaming').click(function() { enableStreaming = this.checked; loadSelectedStream(); @@ -71,46 +78,47 @@ $(document).ready(function() { $('#autoRecoverError').click(function() { autoRecoverError = this.checked; - updatePermalink(); - }); - - $('#enableWorker').click(function() { - enableWorker = this.checked; - updatePermalink(); + onDemoConfigChanged(); }); $('#dumpfMP4').click(function() { dumpfMP4 = this.checked; - updatePermalink(); + onDemoConfigChanged(); }); + $('#limitMetrics').change(function() { + limitMetrics = this.value; + onDemoConfigChanged(); + }) + $('#levelCapping').change(function() { levelCapping = this.value; - updatePermalink(); - }); - - $('#defaultAudioCodec').change(function() { - defaultAudioCodec = this.value; - updatePermalink(); + onDemoConfigChanged(); }); - $('#enableStreaming').prop( 'checked', enableStreaming ); - $('#autoRecoverError').prop( 'checked', autoRecoverError ); - $('#enableWorker').prop( 'checked', enableWorker ); - $('#dumpfMP4').prop( 'checked', dumpfMP4 ); + $('#limitMetrics').val(limitMetrics); + $('#enableStreaming').prop('checked', enableStreaming ); + $('#autoRecoverError').prop('checked', autoRecoverError ); + $('#dumpfMP4').prop('checked', dumpfMP4 ); $('#levelCapping').val(levelCapping); - $('#defaultAudioCodec').val(defaultAudioCodec || 'undefined'); - $('h2').append(' v' + Hls.version + ''); + $('h2').append(' v' + Hls.version + ''); $('#currentVersion').html('Hls version:' + Hls.version); - $('#streamURL').val(decodeURIComponent(getURLParam('src', defaultTestStreamUrl))) + $('#streamURL').val(sourceURL) + + video.volume = 0.05; + + hideAllTabs(); + + $('#metricsButtonWindow').toggle(windowSliding); + $('#metricsButtonFixed').toggle(!windowSliding); loadSelectedStream(); }); -function resetGlobals() { +function setupGlobals() { window.events = events = { url : url, t0 : performance.now(), @@ -133,510 +141,546 @@ function resetGlobals() { window.onClickBufferedRange = onClickBufferedRange; window.updateLevelInfo = updateLevelInfo; - window.updatePermalink = updatePermalink; + window.onDemoConfigChanged = onDemoConfigChanged; window.createfMP4 = createfMP4; window.goToMetricsPermaLink = goToMetricsPermaLink; + window.toggleTab = toggleTab; + window.applyConfigEditorValue = applyConfigEditorValue; } -function loadSelectedStream() { +function trimArray( target, limit ) { + if( limit < 0 ) { + return; + } - url = $('#streamURL').val() + while(target.length > limit ) + { + target.shift(); + } +} - hideCanvas(); +function trimEventHistory() { + const x = limitMetrics; - if(Hls.isSupported()) { + if(x < 0) { + return; + } - if(hls) { - hls.destroy(); - if(hls.bufferTimer) { - clearInterval(hls.bufferTimer); - hls.bufferTimer = undefined; - } - hls = null; - } + trimArray(events.load, x); + trimArray(events.buffer, x); + trimArray(events.video, x); + trimArray(events.level, x); + trimArray(events.bitrate, x); +} - if(!enableStreaming) { - $('#HlsStatus').text('Streaming disabled'); - return; - } +function loadSelectedStream() { + + if (!Hls.isSupported()) { + handleUnsupported(); + return; + } - $('#HlsStatus').text('loading ' + url); + url = $('#streamURL').val() - resetGlobals(); + setupGlobals(); + hideCanvas(); - if (widevineLicenseUrl) { - widevineLicenseUrl = unescape(widevineLicenseUrl) + if(hls) { + hls.destroy(); + if(hls.bufferTimer) { + clearInterval(hls.bufferTimer); + hls.bufferTimer = undefined; } + hls = null; + } - const hlsConfig = { - debug : true, - enableWorker : enableWorker, - defaultAudioCodec: defaultAudioCodec, - widevineLicenseUrl: widevineLicenseUrl - }; + if(!enableStreaming) { + logStatus('Streaming disabled'); + return; + } - if (selectedTestStream && selectedTestStream.config) { - Object.assign(hlsConfig, selectedTestStream.config) - console.log('Using Hls.js config:', hlsConfig); - } + logStatus('Loading ' + url); - if (hlsConfig.widevineLicenseUrl) { - $('#widevineLicenseUrl').val(hlsConfig.widevineLicenseUrl); - } - widevineLicenseUrl = hlsConfig.widevineLicenseUrl = $('#widevineLicenseUrl').val(); + // Extending both a demo-specific config and the user config which can override all + const hlsConfig = $.extend({}, hlsjsDefaults, getEditorValue({ parse: true })); - if (hlsConfig.widevineLicenseUrl) { - hlsConfig.emeEnabled = true; - } + if (selectedTestStream && selectedTestStream.config) { + console.info('[loadSelectedStream] extending hls config with stream-specific config: ', selectedTestStream.config); + $.extend(hlsConfig, selectedTestStream.config); + updateConfigEditorValue(hlsConfig); + } - updatePermalink(); + onDemoConfigChanged(); + console.log('Using Hls.js config:', hlsConfig); - window.hls = hls = new Hls(hlsConfig); + window.hls = hls = new Hls(hlsConfig); - $('#HlsStatus').text('loading manifest and attaching video element...'); + logStatus('Loading manifest and attaching video element...'); - hls.loadSource(url); - hls.autoLevelCapping = levelCapping; - hls.attachMedia(video); + hls.loadSource(url); + hls.autoLevelCapping = levelCapping; + hls.attachMedia(video); - hls.on(Hls.Events.MEDIA_ATTACHED, function() { - $('#HlsStatus').text('MediaSource attached...'); - bufferingIdx = -1; - events.video.push({ - time: performance.now() - events.t0, - type: 'Media attached' - }); + hls.on(Hls.Events.MEDIA_ATTACHED, function() { + logStatus('Media element attached'); + bufferingIdx = -1; + events.video.push({ + time: performance.now() - events.t0, + type: 'Media attached' }); + trimEventHistory(); + }); - hls.on(Hls.Events.MEDIA_DETACHED, function() { - $('#HlsStatus').text('MediaSource detached...'); - bufferingIdx = -1; - tracks = []; - events.video.push({ - time: performance.now() - events.t0, - type: 'Media detached' - }); + hls.on(Hls.Events.MEDIA_DETACHED, function() { + logStatus('Media element detached'); + bufferingIdx = -1; + tracks = []; + events.video.push({ + time: performance.now() - events.t0, + type: 'Media detached' }); + trimEventHistory(); + }); - hls.on(Hls.Events.FRAG_PARSING_INIT_SEGMENT, function(event, data) { - showCanvas(); - var event = { - time: performance.now() - events.t0, - type: data.id + ' init segment' - }; - events.video.push(event); - }); + hls.on(Hls.Events.FRAG_PARSING_INIT_SEGMENT, function(event, data) { + showCanvas(); + var event = { + time: performance.now() - events.t0, + type: data.id + ' init segment' + }; + events.video.push(event); + trimEventHistory(); + }); - hls.on(Hls.Events.FRAG_PARSING_METADATA, function(event, data) { - //console.log("Id3 samples ", data.samples); - }); + hls.on(Hls.Events.FRAG_PARSING_METADATA, function(event, data) { + //console.log("Id3 samples ", data.samples); + }); - hls.on(Hls.Events.LEVEL_SWITCHING, function(event, data) { - events.level.push({ - time : performance.now() - events.t0, - id : data.level, - bitrate: Math.round(hls.levels[data.level].bitrate/1000) - }); - updateLevelInfo(); + hls.on(Hls.Events.LEVEL_SWITCHING, function(event, data) { + events.level.push({ + time : performance.now() - events.t0, + id : data.level, + bitrate: Math.round(hls.levels[data.level].bitrate/1000) }); + trimEventHistory(); + updateLevelInfo(); + }); - hls.on(Hls.Events.MANIFEST_PARSED, function(event, data) { - var event = { - type : 'manifest', - name : '', - start : 0, - end : data.levels.length, - time : data.stats.trequest - events.t0, - latency : data.stats.tfirst - data.stats.trequest, - load : data.stats.tload - data.stats.tfirst, - duration: data.stats.tload - data.stats.tfirst, - }; - events.load.push(event); - refreshCanvas(); - }); + hls.on(Hls.Events.MANIFEST_PARSED, function(event, data) { + var event = { + type : 'manifest', + name : '', + start : 0, + end : data.levels.length, + time : data.stats.trequest - events.t0, + latency : data.stats.tfirst - data.stats.trequest, + load : data.stats.tload - data.stats.tfirst, + duration: data.stats.tload - data.stats.tfirst, + }; + events.load.push(event); + trimEventHistory(); + refreshCanvas(); + }); - hls.on(Hls.Events.MANIFEST_PARSED, function(event, data) { - $('#HlsStatus').text('manifest successfully loaded,' + hls.levels.length + ' levels found'); - stats = { - levelNb : data.levels.length, - levelParsed: 0 - }; - updateLevelInfo(); - }); + hls.on(Hls.Events.MANIFEST_PARSED, function(event, data) { + logStatus('No of quality levels found: ' + hls.levels.length); + logStatus('Manifest successfully loaded'); + stats = { + levelNb : data.levels.length, + levelParsed: 0 + }; + trimEventHistory(); + updateLevelInfo(); + }); - hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, function(event, data) { - $('#HlsStatus').text(data.audioTracks.length + ' audio tracks found'); - updateAudioTrackInfo(); - }); + hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, function(event, data) { + logStatus('No of audio tracks found: ' + data.audioTracks.length); + updateAudioTrackInfo(); + }); - hls.on(Hls.Events.AUDIO_TRACK_SWITCHING, function(event, data) { - updateAudioTrackInfo(); - var event = { - time: performance.now() - events.t0, - type: 'audio switching', - name: '@' + data.id - }; - events.video.push(event); - lastAudioTrackSwitchingIdx = events.video.length-1; - }); + hls.on(Hls.Events.AUDIO_TRACK_SWITCHING, function(event, data) { + logStatus('Audio track switching...'); + updateAudioTrackInfo(); + var event = { + time: performance.now() - events.t0, + type: 'audio switching', + name: '@' + data.id + }; + events.video.push(event); + trimEventHistory(); + lastAudioTrackSwitchingIdx = events.video.length-1; + }); - hls.on(Hls.Events.AUDIO_TRACK_SWITCHED, function(event, data) { - updateAudioTrackInfo(); - var event = { - time: performance.now() - events.t0, - type: 'audio switched', - name: '@' + data.id - }; - if (lastAudioTrackSwitchingIdx !== undefined) { - events.video[lastAudioTrackSwitchingIdx].duration = event.time - events.video[lastAudioTrackSwitchingIdx].time; - lastAudioTrackSwitchingIdx = undefined; - } - events.video.push(event); - }); + hls.on(Hls.Events.AUDIO_TRACK_SWITCHED, function(event, data) { + logStatus('Audio track switched'); + updateAudioTrackInfo(); + var event = { + time: performance.now() - events.t0, + type: 'audio switched', + name: '@' + data.id + }; + if (lastAudioTrackSwitchingIdx !== undefined) { + events.video[lastAudioTrackSwitchingIdx].duration = event.time - events.video[lastAudioTrackSwitchingIdx].time; + lastAudioTrackSwitchingIdx = undefined; + } + events.video.push(event); + trimEventHistory(); + }); - hls.on(Hls.Events.LEVEL_LOADED, function(event, data) { - events.isLive = data.details.live; - var event = { - type : 'level', - id : data.level, - start : data.details.startSN, - end : data.details.endSN, - time : data.stats.trequest - events.t0, - latency : data.stats.tfirst - data.stats.trequest, - load : data.stats.tload - data.stats.tfirst, - parsing : data.stats.tparsed - data.stats.tload, - duration: data.stats.tload - data.stats.tfirst - }; - const parsingDuration = data.stats.tparsed - data.stats.tload; - if (stats.levelParsed) - {this.sumLevelParsingMs += parsingDuration;} - else - {this.sumLevelParsingMs = parsingDuration;} + hls.on(Hls.Events.LEVEL_LOADED, function(event, data) { + events.isLive = data.details.live; + var event = { + type : 'level', + id : data.level, + start : data.details.startSN, + end : data.details.endSN, + time : data.stats.trequest - events.t0, + latency : data.stats.tfirst - data.stats.trequest, + load : data.stats.tload - data.stats.tfirst, + parsing : data.stats.tparsed - data.stats.tload, + duration: data.stats.tload - data.stats.tfirst + }; + const parsingDuration = data.stats.tparsed - data.stats.tload; + if (stats.levelParsed) + {this.sumLevelParsingMs += parsingDuration;} + else + {this.sumLevelParsingMs = parsingDuration;} - stats.levelParsed++; - stats.levelParsingUs = Math.round(1000*this.sumLevelParsingMs / stats.levelParsed); - console.log('parsing level duration :' + stats.levelParsingUs + 'us,count:' + stats.levelParsed); - events.load.push(event); - refreshCanvas(); - }); + stats.levelParsed++; + stats.levelParsingUs = Math.round(1000*this.sumLevelParsingMs / stats.levelParsed); - hls.on(Hls.Events.AUDIO_TRACK_LOADED, function(event, data) { - events.isLive = data.details.live; - var event = { - type : 'audio track', - id : data.id, - start : data.details.startSN, - end : data.details.endSN, - time : data.stats.trequest - events.t0, - latency : data.stats.tfirst - data.stats.trequest, - load : data.stats.tload - data.stats.tfirst, - parsing : data.stats.tparsed - data.stats.tload, - duration: data.stats.tload - data.stats.tfirst - }; - events.load.push(event); - refreshCanvas(); - }); + //console.log('parsing level duration :' + stats.levelParsingUs + 'us,count:' + stats.levelParsed); - hls.on(Hls.Events.FRAG_BUFFERED, function(event, data) { - var event = { - type : data.frag.type + ' fragment', - id : data.frag.level, - id2 : data.frag.sn, - time : data.stats.trequest - events.t0, - latency : data.stats.tfirst - data.stats.trequest, - load : data.stats.tload - data.stats.tfirst, - parsing : data.stats.tparsed - data.stats.tload, - buffer : data.stats.tbuffered - data.stats.tparsed, - duration: data.stats.tbuffered - data.stats.tfirst, - bw : Math.round(8*data.stats.total/(data.stats.tbuffered - data.stats.trequest)), - size : data.stats.total - }; - events.load.push(event); - events.bitrate.push({ - time : performance.now() - events.t0, - bitrate : event.bw, - duration: data.frag.duration, - level : event.id - }); - if(hls.bufferTimer === undefined) { - events.buffer.push({ - time : 0, - buffer: 0, - pos : 0 - }); - hls.bufferTimer = window.setInterval(checkBuffer, 100); - } - refreshCanvas(); - updateLevelInfo(); - - let latency = data.stats.tfirst - data.stats.trequest, - parsing = data.stats.tparsed - data.stats.tload, - process = data.stats.tbuffered - data.stats.trequest, - bitrate = Math.round(8 * data.stats.length / (data.stats.tbuffered - data.stats.tfirst)); - if (stats.fragBuffered) { - stats.fragMinLatency = Math.min(stats.fragMinLatency, latency); - stats.fragMaxLatency = Math.max(stats.fragMaxLatency, latency); - stats.fragMinProcess = Math.min(stats.fragMinProcess, process); - stats.fragMaxProcess = Math.max(stats.fragMaxProcess, process); - stats.fragMinKbps = Math.min(stats.fragMinKbps, bitrate); - stats.fragMaxKbps = Math.max(stats.fragMaxKbps, bitrate); - stats.autoLevelCappingMin = Math.min(stats.autoLevelCappingMin, hls.autoLevelCapping); - stats.autoLevelCappingMax = Math.max(stats.autoLevelCappingMax, hls.autoLevelCapping); - stats.fragBuffered++; - } else { - stats.fragMinLatency = stats.fragMaxLatency = latency; - stats.fragMinProcess = stats.fragMaxProcess = process; - stats.fragMinKbps = stats.fragMaxKbps = bitrate; - stats.fragBuffered = 1; - stats.fragBufferedBytes = 0; - stats.autoLevelCappingMin = stats.autoLevelCappingMax = hls.autoLevelCapping; - this.sumLatency = 0; - this.sumKbps = 0; - this.sumProcess = 0; - this.sumParsing = 0; - } - stats.fraglastLatency = latency; - this.sumLatency += latency; - stats.fragAvgLatency = Math.round(this.sumLatency / stats.fragBuffered); - stats.fragLastProcess = process; - this.sumProcess += process; - this.sumParsing += parsing; - stats.fragAvgProcess = Math.round(this.sumProcess / stats.fragBuffered); - stats.fragLastKbps = bitrate; - this.sumKbps += bitrate; - stats.fragAvgKbps = Math.round(this.sumKbps / stats.fragBuffered); - stats.fragBufferedBytes += data.stats.total; - stats.fragparsingKbps = Math.round(8*stats.fragBufferedBytes / this.sumParsing); - stats.fragparsingMs = Math.round(this.sumParsing); - stats.autoLevelCappingLast = hls.autoLevelCapping; - }); + events.load.push(event); + trimEventHistory(); + refreshCanvas(); + }); + + hls.on(Hls.Events.AUDIO_TRACK_LOADED, function(event, data) { + events.isLive = data.details.live; + var event = { + type : 'audio track', + id : data.id, + start : data.details.startSN, + end : data.details.endSN, + time : data.stats.trequest - events.t0, + latency : data.stats.tfirst - data.stats.trequest, + load : data.stats.tload - data.stats.tfirst, + parsing : data.stats.tparsed - data.stats.tload, + duration: data.stats.tload - data.stats.tfirst + }; + events.load.push(event); + trimEventHistory(); + refreshCanvas(); + }); - hls.on(Hls.Events.LEVEL_SWITCHED, function(event, data) { - var event = { - time: performance.now() - events.t0, - type: 'level switched', - name: data.level - }; - events.video.push(event); - refreshCanvas(); - updateLevelInfo(); + hls.on(Hls.Events.FRAG_BUFFERED, function(event, data) { + var event = { + type : data.frag.type + ' fragment', + id : data.frag.level, + id2 : data.frag.sn, + time : data.stats.trequest - events.t0, + latency : data.stats.tfirst - data.stats.trequest, + load : data.stats.tload - data.stats.tfirst, + parsing : data.stats.tparsed - data.stats.tload, + buffer : data.stats.tbuffered - data.stats.tparsed, + duration: data.stats.tbuffered - data.stats.tfirst, + bw : Math.round(8*data.stats.total/(data.stats.tbuffered - data.stats.trequest)), + size : data.stats.total + }; + events.load.push(event); + events.bitrate.push({ + time : performance.now() - events.t0, + bitrate : event.bw, + duration: data.frag.duration, + level : event.id }); + if(hls.bufferTimer === undefined) { + events.buffer.push({ + time : 0, + buffer: 0, + pos : 0 + }); + hls.bufferTimer = window.setInterval(checkBuffer, 100); + } + trimEventHistory(); + refreshCanvas(); + updateLevelInfo(); + + let latency = data.stats.tfirst - data.stats.trequest, + parsing = data.stats.tparsed - data.stats.tload, + process = data.stats.tbuffered - data.stats.trequest, + bitrate = Math.round(8 * data.stats.length / (data.stats.tbuffered - data.stats.tfirst)); + if (stats.fragBuffered) { + stats.fragMinLatency = Math.min(stats.fragMinLatency, latency); + stats.fragMaxLatency = Math.max(stats.fragMaxLatency, latency); + stats.fragMinProcess = Math.min(stats.fragMinProcess, process); + stats.fragMaxProcess = Math.max(stats.fragMaxProcess, process); + stats.fragMinKbps = Math.min(stats.fragMinKbps, bitrate); + stats.fragMaxKbps = Math.max(stats.fragMaxKbps, bitrate); + stats.autoLevelCappingMin = Math.min(stats.autoLevelCappingMin, hls.autoLevelCapping); + stats.autoLevelCappingMax = Math.max(stats.autoLevelCappingMax, hls.autoLevelCapping); + stats.fragBuffered++; + } else { + stats.fragMinLatency = stats.fragMaxLatency = latency; + stats.fragMinProcess = stats.fragMaxProcess = process; + stats.fragMinKbps = stats.fragMaxKbps = bitrate; + stats.fragBuffered = 1; + stats.fragBufferedBytes = 0; + stats.autoLevelCappingMin = stats.autoLevelCappingMax = hls.autoLevelCapping; + this.sumLatency = 0; + this.sumKbps = 0; + this.sumProcess = 0; + this.sumParsing = 0; + } + stats.fraglastLatency = latency; + this.sumLatency += latency; + stats.fragAvgLatency = Math.round(this.sumLatency / stats.fragBuffered); + stats.fragLastProcess = process; + this.sumProcess += process; + this.sumParsing += parsing; + stats.fragAvgProcess = Math.round(this.sumProcess / stats.fragBuffered); + stats.fragLastKbps = bitrate; + this.sumKbps += bitrate; + stats.fragAvgKbps = Math.round(this.sumKbps / stats.fragBuffered); + stats.fragBufferedBytes += data.stats.total; + stats.fragparsingKbps = Math.round(8*stats.fragBufferedBytes / this.sumParsing); + stats.fragparsingMs = Math.round(this.sumParsing); + stats.autoLevelCappingLast = hls.autoLevelCapping; + }); - hls.on(Hls.Events.FRAG_CHANGED, function(event, data) { - var event = { - time: performance.now() - events.t0, - type: 'frag changed', - name: data.frag.sn + ' @ ' + data.frag.level - }; - events.video.push(event); - refreshCanvas(); - updateLevelInfo(); - stats.tagList = data.frag.tagList; - - let level = data.frag.level, autoLevel = data.frag.autoLevel; - if (stats.levelStart === undefined) - {stats.levelStart = level;} - - if (autoLevel) { - if (stats.fragChangedAuto) { - stats.autoLevelMin = Math.min(stats.autoLevelMin, level); - stats.autoLevelMax = Math.max(stats.autoLevelMax, level); - stats.fragChangedAuto++; - if (this.levelLastAuto && level !== stats.autoLevelLast) - {stats.autoLevelSwitch++;} + hls.on(Hls.Events.LEVEL_SWITCHED, function(event, data) { + var event = { + time: performance.now() - events.t0, + type: 'level switched', + name: data.level + }; + events.video.push(event); + trimEventHistory(); + refreshCanvas(); + updateLevelInfo(); + }); - } else { - stats.autoLevelMin = stats.autoLevelMax = level; - stats.autoLevelSwitch = 0; - stats.fragChangedAuto = 1; - this.sumAutoLevel = 0; - } - this.sumAutoLevel += level; - stats.autoLevelAvg = Math.round(1000 * this.sumAutoLevel / stats.fragChangedAuto) / 1000; - stats.autoLevelLast = level; - } else { - if (stats.fragChangedManual) { - stats.manualLevelMin = Math.min(stats.manualLevelMin, level); - stats.manualLevelMax = Math.max(stats.manualLevelMax, level); - stats.fragChangedManual++; - if (!this.levelLastAuto && level !== stats.manualLevelLast) - {stats.manualLevelSwitch++;} + hls.on(Hls.Events.FRAG_CHANGED, function(event, data) { + var event = { + time: performance.now() - events.t0, + type: 'frag changed', + name: data.frag.sn + ' @ ' + data.frag.level + }; + events.video.push(event); + trimEventHistory(); + refreshCanvas(); + updateLevelInfo(); + stats.tagList = data.frag.tagList; - } else { - stats.manualLevelMin = stats.manualLevelMax = level; - stats.manualLevelSwitch = 0; - stats.fragChangedManual = 1; - } - stats.manualLevelLast = level; - } - this.levelLastAuto = autoLevel; - }); + let level = data.frag.level, autoLevel = data.frag.autoLevel; + if (stats.levelStart === undefined) + {stats.levelStart = level;} - hls.on(Hls.Events.FRAG_LOAD_EMERGENCY_ABORTED, function(event, data) { - if (stats) { - if (stats.fragLoadEmergencyAborted === undefined) - {stats.fragLoadEmergencyAborted = 1;} - else - {stats.fragLoadEmergencyAborted++;} + if (autoLevel) { + if (stats.fragChangedAuto) { + stats.autoLevelMin = Math.min(stats.autoLevelMin, level); + stats.autoLevelMax = Math.max(stats.autoLevelMax, level); + stats.fragChangedAuto++; + if (this.levelLastAuto && level !== stats.autoLevelLast) + {stats.autoLevelSwitch++;} + } else { + stats.autoLevelMin = stats.autoLevelMax = level; + stats.autoLevelSwitch = 0; + stats.fragChangedAuto = 1; + this.sumAutoLevel = 0; } - }); + this.sumAutoLevel += level; + stats.autoLevelAvg = Math.round(1000 * this.sumAutoLevel / stats.fragChangedAuto) / 1000; + stats.autoLevelLast = level; + } else { + if (stats.fragChangedManual) { + stats.manualLevelMin = Math.min(stats.manualLevelMin, level); + stats.manualLevelMax = Math.max(stats.manualLevelMax, level); + stats.fragChangedManual++; + if (!this.levelLastAuto && level !== stats.manualLevelLast) + {stats.manualLevelSwitch++;} - hls.on(Hls.Events.FRAG_DECRYPTED, function(event, data) { - if (!stats.fragDecrypted) { - stats.fragDecrypted = 0; - this.totalDecryptTime = 0; - stats.fragAvgDecryptTime = 0; + } else { + stats.manualLevelMin = stats.manualLevelMax = level; + stats.manualLevelSwitch = 0; + stats.fragChangedManual = 1; } - stats.fragDecrypted++; - this.totalDecryptTime += data.stats.tdecrypt - data.stats.tstart; - stats.fragAvgDecryptTime = this.totalDecryptTime / stats.fragDecrypted; - }); + stats.manualLevelLast = level; + } + this.levelLastAuto = autoLevel; + }); + + hls.on(Hls.Events.FRAG_LOAD_EMERGENCY_ABORTED, function(event, data) { + if (stats) { + if (stats.fragLoadEmergencyAborted === undefined) + {stats.fragLoadEmergencyAborted = 1;} + else + {stats.fragLoadEmergencyAborted++;} - hls.on(Hls.Events.ERROR, function(event, data) { - console.warn(data); - switch(data.details) { - case Hls.ErrorDetails.MANIFEST_LOAD_ERROR: - try { - $('#HlsStatus').html('cannot Load ' + url + '
HTTP response code:' + data.response.code + '
' + data.response.text); - if(data.response.code === 0) - {$('#HlsStatus').append('this might be a CORS issue, consider installing Allow-Control-Allow-Origin Chrome Extension');} - - } catch(err) { - $('#HlsStatus').html('cannot Load ' + url + '
Reason:Load ' + data.response.text); + } + }); + + hls.on(Hls.Events.FRAG_DECRYPTED, function(event, data) { + if (!stats.fragDecrypted) { + stats.fragDecrypted = 0; + this.totalDecryptTime = 0; + stats.fragAvgDecryptTime = 0; + } + stats.fragDecrypted++; + this.totalDecryptTime += data.stats.tdecrypt - data.stats.tstart; + stats.fragAvgDecryptTime = this.totalDecryptTime / stats.fragDecrypted; + }); + + hls.on(Hls.Events.ERROR, function(event, data) { + console.warn('Error event:', data); + switch(data.details) { + case Hls.ErrorDetails.MANIFEST_LOAD_ERROR: + try { + $('#errorOut').html('Cannot load ' + url + '
HTTP response code:' + data.response.code + '
' + data.response.text); + if(data.response.code === 0){ + $('#errorOut').append('This might be a CORS issue, consider installing Allow-Control-Allow-Origin Chrome Extension'); } + } catch(err) { + $('#errorOut').html('Cannot load ' + url + '
Response body: ' + data.response.text); + } + break; + case Hls.ErrorDetails.MANIFEST_LOAD_TIMEOUT: + logError('Timeout while loading manifest'); + break; + case Hls.ErrorDetails.MANIFEST_PARSING_ERROR: + logError('Error while parsing manifest:' + data.reason); + break; + case Hls.ErrorDetails.LEVEL_LOAD_ERROR: + logError('Error while loading level playlist'); + break; + case Hls.ErrorDetails.LEVEL_LOAD_TIMEOUT: + logError('Timeout while loading level playlist'); + break; + case Hls.ErrorDetails.LEVEL_SWITCH_ERROR: + logError('Error while trying to switch to level ' + data.level); + break; + case Hls.ErrorDetails.FRAG_LOAD_ERROR: + logError('Error while loading fragment ' + data.frag.url); + break; + case Hls.ErrorDetails.FRAG_LOAD_TIMEOUT: + logError('Timeout while loading fragment ' + data.frag.url); + break; + case Hls.ErrorDetails.FRAG_LOOP_LOADING_ERROR: + logError('Fragment-loop loading error'); + break; + case Hls.ErrorDetails.FRAG_DECRYPT_ERROR: + logError('Decrypting error:' + data.reason); + break; + case Hls.ErrorDetails.FRAG_PARSING_ERROR: + logError('Parsing error:' + data.reason); + break; + case Hls.ErrorDetails.KEY_LOAD_ERROR: + logError('Error while loading key ' + data.frag.decryptdata.uri); + break; + case Hls.ErrorDetails.KEY_LOAD_TIMEOUT: + logError('Timeout while loading key ' + data.frag.decryptdata.uri); + break; + case Hls.ErrorDetails.BUFFER_APPEND_ERROR: + logError('Buffer append error'); + break; + case Hls.ErrorDetails.BUFFER_ADD_CODEC_ERROR: + logError('Buffer add codec error for ' + data.mimeType + ':' + data.err.message); + break; + case Hls.ErrorDetails.BUFFER_APPENDING_ERROR: + logError('Buffer appending error'); + break; + case Hls.ErrorDetails.BUFFER_STALLED_ERROR: + logError('Buffer stalled error'); + break; + default: + break; + } + if(data.fatal) { + console.error('Fatal error :' + data.details); + switch(data.type) { + case Hls.ErrorTypes.MEDIA_ERROR: + handleMediaError(); break; - case Hls.ErrorDetails.MANIFEST_LOAD_TIMEOUT: - $('#HlsStatus').text('timeout while loading manifest'); - break; - case Hls.ErrorDetails.MANIFEST_PARSING_ERROR: - $('#HlsStatus').text('error while parsing manifest:' + data.reason); - break; - case Hls.ErrorDetails.LEVEL_LOAD_ERROR: - $('#HlsStatus').text('error while loading level playlist'); - break; - case Hls.ErrorDetails.LEVEL_LOAD_TIMEOUT: - $('#HlsStatus').text('timeout while loading level playlist'); - break; - case Hls.ErrorDetails.LEVEL_SWITCH_ERROR: - $('#HlsStatus').text('error while trying to switch to level ' + data.level); - break; - case Hls.ErrorDetails.FRAG_LOAD_ERROR: - $('#HlsStatus').text('error while loading fragment ' + data.frag.url); - break; - case Hls.ErrorDetails.FRAG_LOAD_TIMEOUT: - $('#HlsStatus').text('timeout while loading fragment ' + data.frag.url); - break; - case Hls.ErrorDetails.FRAG_LOOP_LOADING_ERROR: - $('#HlsStatus').text('Frag Loop Loading Error'); - break; - case Hls.ErrorDetails.FRAG_DECRYPT_ERROR: - $('#HlsStatus').text('Decrypting Error:' + data.reason); - break; - case Hls.ErrorDetails.FRAG_PARSING_ERROR: - $('#HlsStatus').text('Parsing Error:' + data.reason); - break; - case Hls.ErrorDetails.KEY_LOAD_ERROR: - $('#HlsStatus').text('error while loading key ' + data.frag.decryptdata.uri); - break; - case Hls.ErrorDetails.KEY_LOAD_TIMEOUT: - $('#HlsStatus').text('timeout while loading key ' + data.frag.decryptdata.uri); - break; - case Hls.ErrorDetails.BUFFER_APPEND_ERROR: - $('#HlsStatus').text('Buffer Append Error'); - break; - case Hls.ErrorDetails.BUFFER_ADD_CODEC_ERROR: - $('#HlsStatus').text('Buffer Add Codec Error for ' + data.mimeType + ':' + data.err.message); - break; - case Hls.ErrorDetails.BUFFER_APPENDING_ERROR: - $('#HlsStatus').text('Buffer Appending Error'); + case Hls.ErrorTypes.NETWORK_ERROR: + logError('A network error occured'); break; default: + logError('An unrecoverable error occured'); + hls.destroy(); break; } - if(data.fatal) { - console.log('fatal error :' + data.details); - switch(data.type) { - case Hls.ErrorTypes.MEDIA_ERROR: - handleMediaError(); - break; - case Hls.ErrorTypes.NETWORK_ERROR: - $('#HlsStatus').append(',network error ...'); - break; - default: - $('#HlsStatus').append(', unrecoverable error'); - hls.destroy(); - break; - } - console.log($('#HlsStatus').text()); - } - if(!stats) { - stats = { - }; + } + if(!stats) { + stats = {}; + } + // track all errors independently + if (stats[data.details] === undefined) + {stats[data.details] = 1;} + else + {stats[data.details] += 1;} + + // track fatal error + if (data.fatal) { + if (stats.fatalError === undefined) { + stats.fatalError = 1; + } else { + stats.fatalError += 1; } - // track all errors independently - if (stats[data.details] === undefined) - {stats[data.details] = 1;} - else - {stats[data.details] += 1;} + } + $('#statisticsOut').text(JSON.stringify(sortObject(stats), null, '\t')); + }); - // track fatal error - if (data.fatal) { - if (stats.fatalError === undefined) - {stats.fatalError = 1;} - else - {stats.fatalError += 1;} + hls.on(Hls.Events.BUFFER_CREATED, function(event, data) { + tracks = data.tracks; + }); - } - $('#HlsStats').text(JSON.stringify(sortObject(stats), null, '\t')); - }); + hls.on(Hls.Events.BUFFER_APPENDING, function(event, data) { + if (dumpfMP4) { + fmp4Data[data.type].push(data.data); + } + }); - hls.on(Hls.Events.BUFFER_CREATED, function(event, data) { - tracks = data.tracks; - }); + hls.on(Hls.Events.FPS_DROP, function(event, data) { + let evt = { + time: performance.now() - events.t0, + type: 'frame drop', + name: data.currentDropped + '/' + data.currentDecoded + }; + events.video.push(evt); + trimEventHistory(); + if (stats) { + if (stats.fpsDropEvent === undefined) + {stats.fpsDropEvent = 1;} + else + {stats.fpsDropEvent++;} - hls.on(Hls.Events.BUFFER_APPENDING, function(event, data) { - if (dumpfMP4) - {fmp4Data[data.type].push(data.data);} + stats.fpsTotalDroppedFrames = data.totalDroppedFrames; + } + }); - }); + video.addEventListener('resize', handleVideoEvent); + video.addEventListener('seeking', handleVideoEvent); + video.addEventListener('seeked', handleVideoEvent); + video.addEventListener('pause', handleVideoEvent); + video.addEventListener('play', handleVideoEvent); + video.addEventListener('canplay', handleVideoEvent); + video.addEventListener('canplaythrough', handleVideoEvent); + video.addEventListener('ended', handleVideoEvent); + video.addEventListener('playing', handleVideoEvent); + video.addEventListener('error', handleVideoEvent); + video.addEventListener('loadedmetadata', handleVideoEvent); + video.addEventListener('loadeddata', handleVideoEvent); + video.addEventListener('durationchange', handleVideoEvent); +} - hls.on(Hls.Events.FPS_DROP, function(event, data) { - let evt = { - time: performance.now() - events.t0, - type: 'frame drop', - name: data.currentDropped + '/' + data.currentDecoded - }; - events.video.push(evt); - if (stats) { - if (stats.fpsDropEvent === undefined) - {stats.fpsDropEvent = 1;} - else - {stats.fpsDropEvent++;} - - stats.fpsTotalDroppedFrames = data.totalDroppedFrames; - } - }); - video.addEventListener('resize', handleVideoEvent); - video.addEventListener('seeking', handleVideoEvent); - video.addEventListener('seeked', handleVideoEvent); - video.addEventListener('pause', handleVideoEvent); - video.addEventListener('play', handleVideoEvent); - video.addEventListener('canplay', handleVideoEvent); - video.addEventListener('canplaythrough', handleVideoEvent); - video.addEventListener('ended', handleVideoEvent); - video.addEventListener('playing', handleVideoEvent); - video.addEventListener('error', handleVideoEvent); - video.addEventListener('loadedmetadata', handleVideoEvent); - video.addEventListener('loadeddata', handleVideoEvent); - video.addEventListener('durationchange', handleVideoEvent); +function handleUnsupported() { + if(navigator.userAgent.toLowerCase().indexOf('firefox') !== -1) { + logStatus('You are using Firefox, it looks like MediaSource is not enabled,
please ensure the following keys are set appropriately in about:config
media.mediasource.enabled=true
media.mediasource.mp4.enabled=true
media.mediasource.whitelist=false'); } else { - if(navigator.userAgent.toLowerCase().indexOf('firefox') !== -1) - {$('#HlsStatus').text('you are using Firefox, it looks like MediaSource is not enabled,
please ensure the following keys are set appropriately in about:config
media.mediasource.enabled=true
media.mediasource.mp4.enabled=true
media.mediasource.whitelist=false');} - else - {$('#HlsStatus').text('your Browser does not support MediaSourceExtension / MP4 mediasource');} - + logStatus('Your Browser does not support MediaSourceExtension / MP4 mediasource'); } } @@ -645,7 +689,7 @@ function handleVideoEvent(evt) { switch(evt.type) { case 'durationchange': if(evt.target.duration - lastDuration <= 0.5) { - // some browsers reports several duration change events with almost the same value ... avoid spamming video events + // some browsers report several duration change events with almost the same value ... avoid spamming video events return; } lastDuration = evt.target.duration; @@ -655,8 +699,6 @@ function handleVideoEvent(evt) { data = evt.target.videoWidth + '/' + evt.target.videoHeight; break; case 'loadedmetadata': - // data = 'duration:' + evt.target.duration + '/videoWidth:' + evt.target.videoWidth + '/videoHeight:' + evt.target.videoHeight; - // break; case 'loadeddata': case 'canplay': case 'canplaythrough': @@ -688,31 +730,35 @@ function handleVideoEvent(evt) { errorTxt = 'The video could not be loaded, either because the server or network failed or because the format is not supported'; break; } - if (mediaError.message) - {errorTxt += ' - ' + mediaError.message;} - $('#HlsStatus').text(errorTxt); + if (mediaError.message) { + errorTxt += ' - ' + mediaError.message; + } + + logStatus(errorTxt); console.error(errorTxt); } break; - // case 'progress': - // data = 'currentTime:' + evt.target.currentTime + ',bufferRange:[' + this.video.buffered.start(0) + ',' + this.video.buffered.end(0) + ']'; - // break; default: break; } + let event = { time: performance.now() - events.t0, type: evt.type, name: data }; + events.video.push(event); - if(evt.type === 'seeking') - {lastSeekingIdx = events.video.length-1;} + if(evt.type === 'seeking') { + lastSeekingIdx = events.video.length-1; + } - if(evt.type === 'seeked') - {events.video[lastSeekingIdx].duration = event.time - events.video[lastSeekingIdx].time;} + if(evt.type === 'seeked') { + events.video[lastSeekingIdx].duration = event.time - events.video[lastSeekingIdx].time; + } + trimEventHistory(); } function handleMediaError() { @@ -720,16 +766,16 @@ function handleMediaError() { let now = performance.now(); if(!recoverDecodingErrorDate || (now - recoverDecodingErrorDate) > 3000) { recoverDecodingErrorDate = performance.now(); - $('#HlsStatus').append(',try to recover media Error ...'); + $('#statusOut').append(', trying to recover media error.'); hls.recoverMediaError(); } else { if(!recoverSwapAudioCodecDate || (now - recoverSwapAudioCodecDate) > 3000) { recoverSwapAudioCodecDate = performance.now(); - $('#HlsStatus').append(',try to swap Audio Codec and recover media Error ...'); + $('#statusOut').append(', trying to swap audio codec and recover media error.'); hls.swapAudioCodec(); hls.recoverMediaError(); } else { - $('#HlsStatus').append(',cannot recover, last media error recovery failed ...'); + $('#statusOut').append(', cannot recover. Last media error recovery failed.'); } } } @@ -737,15 +783,16 @@ function handleMediaError() { function timeRangesToString(r) { let log = ''; - for (let i=0; i' - + 'Buffered:' - + timeRangesToString(v.buffered) + '
' - + 'Seekable:' - + timeRangesToString(v.seekable) + '
' - + 'Played:' - + timeRangesToString(v.played) + '
'; + let log = 'Duration: ' + + v.duration + '\n' + + 'Buffered: ' + + timeRangesToString(v.buffered) + '\n' + + 'Seekable: ' + + timeRangesToString(v.seekable) + '\n' + + 'Played: ' + + timeRangesToString(v.played) + '\n'; if (hls.media) { - for(let type in tracks) - {log += type + ' Buffered:' + timeRangesToString(tracks[type].buffer.buffered) + '
';} - + for(let type in tracks) { + log += 'Buffer for ' + type + ' contains: ' + timeRangesToString(tracks[type].buffer.buffered) + '\n'; + } - let videoPlaybackQuality = v.getVideoPlaybackQuality; + const videoPlaybackQuality = v.getVideoPlaybackQuality; if(videoPlaybackQuality && typeof (videoPlaybackQuality) === typeof (Function)) { - log+='Dropped Frames:'+ v.getVideoPlaybackQuality().droppedVideoFrames + '
'; - log+='Corrupted Frames:'+ v.getVideoPlaybackQuality().corruptedVideoFrames + '
'; + log += 'Dropped frames: '+ v.getVideoPlaybackQuality().droppedVideoFrames + '\n'; + log += 'Corrupted frames:'+ v.getVideoPlaybackQuality().corruptedVideoFrames + '\n'; } else if(v.webkitDroppedFrameCount) { - log+='Dropped Frames:'+ v.webkitDroppedFrameCount + '
'; + log+='Dropped frames:'+ v.webkitDroppedFrameCount + '\n'; } } - $('#buffered_log').html(log); - $('#HlsStats').text(JSON.stringify(sortObject(stats), null, '\t')); + $('#bufferedOut').text(log); + + $('#statisticsOut').text(JSON.stringify(sortObject(stats), null, '\t')); + ctx.fillStyle = 'blue'; - let x = v.currentTime / v.duration * canvas.width; + + const x = v.currentTime / v.duration * canvas.width; ctx.fillRect(x, 0, 2, 15); } } -function sortObject(obj) { - if(typeof obj !== 'object') - {return obj;} - let temp = { - }; - let keys = []; - for(let key in obj) - {keys.push(key);} - keys.sort(); - for(let index in keys) - {temp[keys[index]] = sortObject(obj[keys[index]]);} - return temp; -} - function showCanvas() { showMetrics(); - $('#buffered_log').show(); - $('#buffered_c').show(); + $('#bufferedOut').show(); + $('#bufferedCanvas').show(); } function hideCanvas() { hideMetrics(); - $('#buffered_log').hide(); - $('#buffered_c').hide(); + $('#bufferedOut').hide(); + $('#bufferedCanvas').hide(); } function getMetrics() { let json = JSON.stringify(events); let jsonpacked = jsonpack.pack(json); - console.log('packing JSON from ' + json.length + ' to ' + jsonpacked.length + ' bytes'); + // console.log('packing JSON from ' + json.length + ' to ' + jsonpacked.length + ' bytes'); return btoa(jsonpacked); } @@ -886,25 +924,9 @@ function copyMetricsToClipBoard() { copyTextToClipboard(getMetrics()); } -function copyTextToClipboard(text) { - let textArea = document.createElement('textarea'); - textArea.value = text; - document.body.appendChild(textArea); - textArea.select(); - try { - let successful = document.execCommand('copy'); - let msg = successful ? 'successful' : 'unsuccessful'; - console.log('Copying text command was ' + msg); - } catch (err) { - console.log('Oops, unable to copy'); - } - document.body.removeChild(textArea); -} - function goToMetrics() { let url = document.URL; url = url.substr(0, url.lastIndexOf('/')+1) + 'metrics.html'; - console.log(url); window.open(url, '_blank'); } @@ -912,7 +934,6 @@ function goToMetricsPermaLink() { let url = document.URL; let b64 = getMetrics(); url = url.substr(0, url.lastIndexOf('/')+1) + 'metrics.html#data=' + b64; - console.log(url); window.open(url, '_blank'); } @@ -923,7 +944,7 @@ function minsecs(ts) { } function onClickBufferedRange(event) { - let canvas = $('#buffered_c')[0]; + let canvas = $('#bufferedCanvas')[0]; let v = $('#video')[0]; let target = (event.clientX - canvas.offsetLeft) / canvas.width * v.duration; v.currentTime = target; @@ -964,7 +985,7 @@ function updateLevelInfo() { html3 += button_disabled; } - html3 += 'onclick="levelCapping=hls.autoLevelCapping=-1;updateLevelInfo();updatePermalink();">auto'; + html3 += 'onclick="levelCapping=hls.autoLevelCapping=-1;updateLevelInfo();onDemoConfigChanged();">auto'; let html4 = button_template; if(hls.autoLevelEnabled) { @@ -983,9 +1004,10 @@ function updateLevelInfo() { html1 += button_disabled; } - let levelName = i, label = level2label(i); + let levelName = i; + let label = level2label(i); if(label) { - levelName += '(' + level2label(i) + ')'; + levelName += ' (' + level2label(i) + 'p)'; } html1 += 'onclick="hls.currentLevel=' + i + '">' + levelName + ''; @@ -1006,7 +1028,7 @@ function updateLevelInfo() { html3 += button_disabled; } - html3 += 'onclick="levelCapping=hls.autoLevelCapping=' + i + ';updateLevelInfo();updatePermalink();">' + levelName + ''; + html3 += 'onclick="levelCapping=hls.autoLevelCapping=' + i + ';updateLevelInfo();onDemoConfigChanged();">' + levelName + ''; html4 += button_template; if(hls.nextLevel === i) { @@ -1070,16 +1092,20 @@ function level2label(index) { if (level.height) { return(level.height + 'p / ' + Math.round(level.bitrate / 1024) + 'kb'); } else { - if(level.bitrate) - {return(Math.round(level.bitrate / 1024) + 'kb');} - else - {return null;} - + if(level.bitrate) { + return(Math.round(level.bitrate / 1024) + 'kb'); + } else { + return null; + } } } } } +function getDemoConfigPropOrDefault(propName, defaultVal) { + return typeof demoConfig[propName] !== 'undefined' ? demoConfig[propName] : defaultVal; +} + function getURLParam(sParam, defaultValue) { let sPageURL = window.location.search.substring(1); let sURLVariables = sPageURL.split('&'); @@ -1092,19 +1118,102 @@ function getURLParam(sParam, defaultValue) { return defaultValue; } -function updatePermalink() { +function onDemoConfigChanged() { + demoConfig = { + enableStreaming, + autoRecoverError, + dumpfMP4, + levelCapping, + limitMetrics, + }; + + if (configPersistenceEnabled) { + persistEditorValue(); + } + + const serializedDemoConfig = btoa(JSON.stringify(demoConfig)); + const baseURL = document.URL.split('?')[0]; + const streamURL = $('#streamURL').val(); + const permalinkURL = `${baseURL}?src=${encodeURIComponent(streamURL)}&demoConfig=${serializedDemoConfig}`; + + $('#StreamPermalink').html(`${permalinkURL}`); +} + +function onConfigPersistenceChanged(event) { + configPersistenceEnabled = event.target.checked; + localStorage.setItem(STORAGE_KEYS.Editor_Persistence, JSON.stringify(configPersistenceEnabled)); + + if (configPersistenceEnabled) { + persistEditorValue(); + } else { + localStorage.removeItem(STORAGE_KEYS.Hls_Config); + } +} + +function getEditorValue(options) { + options = $.extend({ parse: false }, options || {}); + let value = configEditor.session.getValue(); + + if (options.parse) { + try { + value = JSON.parse(value); + } catch (e) { + console.warn('[getEditorValue] could not parse editor value', e); + value = {}; + } + } + + return value; +} + +function getPersistedHlsConfig() { + var value = localStorage.getItem(STORAGE_KEYS.Hls_Config); + + if (value === null) { + return value; + } + + try { + value = JSON.parse(value); + } catch (e) { + console.warn('[getPersistedHlsConfig] could not hls config json', e); + value = {}; + } + + return value; +} + +function persistEditorValue() { + localStorage.setItem(STORAGE_KEYS.Hls_Config, getEditorValue()); +} + +function setupConfigEditor() { + configEditor = ace.edit('config-editor'); + configEditor.setTheme('ace/theme/github'); + configEditor.session.setMode('ace/mode/json'); + + const contents = hlsjsDefaults; + const shouldRestorePersisted = JSON.parse(localStorage.getItem(STORAGE_KEYS.Editor_Persistence)) === true; - const url = $('#streamURL').val(); - const hlsLink = document.URL.split('?')[0] + '?src=' + encodeURIComponent(url) + - '&enableStreaming=' + enableStreaming + - '&autoRecoverError=' + autoRecoverError + - '&enableWorker=' + enableWorker + - '&dumpfMP4=' + dumpfMP4 + - '&levelCapping=' + levelCapping + - '&defaultAudioCodec=' + defaultAudioCodec + - '&widevineLicenseURL=' + escape(widevineLicenseUrl); + if (shouldRestorePersisted) { + $.extend(contents, getPersistedHlsConfig()); + } + + const elPersistence = document.querySelector('#configPersistence'); + elPersistence.addEventListener('change', onConfigPersistenceChanged); + elPersistence.checked = shouldRestorePersisted; + + updateConfigEditorValue(contents); +} - $('#StreamPermalink').html('' + hlsLink + ''); +function updateConfigEditorValue(obj) { + const json = JSON.stringify(obj, null, 2); + configEditor.session.setValue(json); +} + +function applyConfigEditorValue() { + onDemoConfigChanged(); + loadSelectedStream(); } function createfMP4(type) { @@ -1128,3 +1237,38 @@ function arrayConcat(inputArray) { }); return result; } + +function hideAllTabs() { + $('#playbackControlTab').hide(); + $('#qualityLevelControlTab').hide(); + $('#audioTrackControlTab').hide(); + $('#metricsDisplayTab').hide(); + $('#statsDisplayTab').hide(); +} + +function toggleTab(tabElId) { + hideAllTabs(); + hideMetrics(); + $('#' + tabElId).show(); +} + +function appendLog(textElId, message) { + const el = $('#' + textElId) + let logText = el.text() + if (logText.length) { + logText += '\n' + } + const timestamp = (Date.now() - startTime) / 1000 + const newMessage = timestamp + ' | ' + message + logText += newMessage + // update + el.text(logText) +} + +function logStatus(message) { + appendLog('statusOut', message) +} + +function logError(message) { + appendLog('errorOut', message) +} diff --git a/demo/style.css b/demo/style.css index 21ff4f6dbaf..e27a04b80b4 100644 --- a/demo/style.css +++ b/demo/style.css @@ -9,12 +9,12 @@ th, td { select { padding: 2px 15px; background-color: rgb(181, 222, 255); - font-weight: bolder; - + font-weight: 600; + padding: 5px 0; } select option { - font-size: 10pt; + font-size: 11px; } .innerControls input { @@ -23,44 +23,86 @@ select option { } #controls { - width: 70%; - min-width: 615px; - padding: 3px; - margin: 0px auto 20px auto; - border: 1px solid #606060; - overflow: hidden; + display: flex; + flex-direction: column; + width: 80%; + max-width: 1200px; + margin: 0 auto 20px auto; + border: 1px solid #606060; + overflow: hidden; +} + +.demo-controls-wrapper { + flex: 1 1 auto; + max-width: 100%; + padding: 5px 5px 0 3px; +} + +.config-editor-wrapper { + flex: 1 1 auto; + display: flex; + flex-direction: column; + border-top: solid 1px #ccc; + height: 256px; +} + +.config-editor-container { + flex: 1 1 auto; + position: relative; + width: 100%; + height: 100%; +} + +#config-editor { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +.config-editor-commands { + flex: 1 1 auto; + background-color: #ddd; + border-top: solid 1px #ccc; + padding: 5px; + display: flex; + justify-content: space-between; + align-items: center; +} + +.config-editor-commands label { + margin-bottom: 0; +} + +.config-editor-commands button { + padding: 5px 8px; + font-size: 14px; } .innerControls { - display:block; - float: left; - width: 99%; - margin: 3px; - padding-left: 3px; - font-size: 10pt + display: flex; + font-size: 12px; + align-items: center; + margin-bottom: 5px; + padding-left: 5px; + justify-content: space-between; } .videoCentered { - width: 720px; - margin-left: auto; - margin-right: auto; - display: block + width: 720px; + margin-left: auto; + margin-right: auto; + display: block } .center { - width: 70%; - min-width: 615px; - overflow: hidden; - margin-left: auto; - margin-right: auto; - display: block -} - -#customButtons input { - width: 25%; - display : inline-block; - text-align: center; - font-size: 8pt; + width: 70%; + min-width: 615px; + overflow: hidden; + margin-left: auto; + margin-right: auto; + display: block } #toggleButtons button { @@ -71,3 +113,62 @@ select option { font-weight: bolder; background-color: rgb(181, 222, 255) } + +#statusOut { + height: auto; + max-height: 4em; + overflow: auto; +} + +#errorOut { + height: auto; + max-height: 4em; + overflow: auto; +} + + +#streamURL, +#streamSelect { + width: calc(100% - 4px); + margin-left: 3px; +} + +#streamURL { + margin-bottom: 10px; + padding-left: 3px; +} + +#streamSelect { + padding: 5px 0; +} + +#StreamPermalink { + flex: 1 1 auto; + min-width: 0; + overflow-wrap: break-word; + overflow: hidden; /* for IE11 */ + padding: 10px 0 0 10px; +} + +#StreamPermalink a { + font-size: 10px; + font-family: monospace; +} + +/* Small devices (portrait tablets and large phones, 600px and up) */ +@media only screen and (min-width: 600px) { + #controls { + flex-direction: row; + } + + .demo-controls-wrapper { + max-width: 50%; + } + + .config-editor-wrapper { + height: auto; + border-top: 0; + border-left: solid 1px #ccc; + } + +} \ No newline at end of file diff --git a/docs/API.md b/docs/API.md index e6a29a891bc..b65eb9678f7 100644 --- a/docs/API.md +++ b/docs/API.md @@ -89,6 +89,7 @@ - [`hls.startLevel`](#hlsstartlevel) - [`hls.autoLevelEnabled`](#hlsautolevelenabled) - [`hls.autoLevelCapping`](#hlsautolevelcapping) + - [`hls.bandwidthEstimate`](#hlsbandwidthestimate) - [Version Control](#version-control) - [`Hls.version`](#hlsversion) - [Network Loading Control API](#network-loading-control-api) @@ -651,7 +652,7 @@ Note: If `fLoader` or `pLoader` are used, they overwrite `loader`! @param stats.tfirst {number} - performance.now() of first received byte @param stats.tload {number} - performance.now() on load complete @param stats.loaded {number} - nb of loaded bytes - @param [stats.bw] {number} - download bandwidth in bit/s + @param [stats.bw] {number} - download bandwidth in bits/s @param stats.total {number} - total nb of bytes @param context {object} - loader context @param networkDetails {object} - loader network details (the xhr for default loaders) @@ -662,7 +663,7 @@ Note: If `fLoader` or `pLoader` are used, they overwrite `loader`! @param stats.tfirst {number} - performance.now() of first received byte @param stats.loaded {number} - nb of loaded bytes @param [stats.total] {number} - total nb of bytes - @param [stats.bw] {number} - current download bandwidth in bit/s (monitored by ABR controller to control emergency switch down) + @param [stats.bw] {number} - current download bandwidth in bits/s (monitored by ABR controller to control emergency switch down) @param context {object} - loader context @param data {string/arraybuffer/sharedarraybuffer} - onProgress data (should be defined only if context.progressData === true) @param networkDetails {object} - loader network details (the xhr for default loaders) @@ -938,7 +939,7 @@ parameter should be a float greater than [abrEwmaFastVoD](#abrewmafastvod) (default: `500000`) -Default bandwidth estimate in bits/second prior to collecting fragment bandwidth samples. +Default bandwidth estimate in bits/s prior to collecting fragment bandwidth samples. parameter should be a float @@ -947,14 +948,14 @@ parameter should be a float (default: `0.95`) Scale factor to be applied against measured bandwidth average, to determine whether we can stay on current or lower quality level. -If `abrBandWidthFactor * bandwidth average < level.bitrate` then ABR can switch to that level providing that it is equal or less than current level. +If `abrBandWidthFactor * bandwidth average > level.bitrate` then ABR can switch to that level providing that it is equal or less than current level. ### `abrBandWidthUpFactor` (default: `0.7`) Scale factor to be applied against measured bandwidth average, to determine whether we can switch up to a higher quality level. -If `abrBandWidthUpFactor * bandwidth average < level.bitrate` then ABR can switch up to that quality level. +If `abrBandWidthUpFactor * bandwidth average > level.bitrate` then ABR can switch up to that quality level. ### `abrMaxWithRealBitrate` @@ -1053,6 +1054,10 @@ Default value is `hls.firstLevel`. Default value is `-1` (no level capping). +### `hls.bandwidthEstimate` + +get: Returns the current bandwidth estimate in bits/s, if available. Otherwise, `NaN` is returned. + ## Version Control ### `Hls.version` diff --git a/karma.conf.js b/karma.conf.js index f861b780b66..f39857641a5 100644 --- a/karma.conf.js +++ b/karma.conf.js @@ -1,9 +1,30 @@ // Karma configuration // Generated on Tue Jul 18 2017 12:17:16 GMT-0700 (PDT) - -const pkgJson = require('./package.json'); -const webpack = require('webpack'); const path = require('path'); +const merge = require('webpack-merge'); +const webpackConfig = require('./webpack.config')({ debug: true })[0]; +delete webpackConfig.entry; +delete webpackConfig.output; +const mergeConfig = merge(webpackConfig, { + devtool: 'inline-source-map', + module: { + rules: [ + { + test: /\.(ts|js)$/, + exclude: path.resolve(__dirname, 'node_modules'), + enforce: 'post', + use: [ + { + loader: 'istanbul-instrumenter-loader', + options: { + esModules: true + } + } + ] + } + ] + } +}); module.exports = function (config) { config.set({ @@ -22,12 +43,11 @@ module.exports = function (config) { // list of files to exclude exclude: [], - // preprocess matching files before serving them to the browser - // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor - // node_modules must not be webpacked or else Karma will fail to load frameworks - preprocessors: { - 'tests/index.js': ['webpack', 'sourcemap'] - }, + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + // node_modules must not be webpacked or else Karma will fail to load frameworkspreprocessors: { + 'tests/index.js': ['webpack', 'sourcemap'] + }, // test results reporter to use // possible values: 'dots', 'progress' @@ -39,34 +59,7 @@ module.exports = function (config) { fixWebpackSourcePaths: true }, - webpack: { - mode: 'development', - devtool: 'inline-source-map', - module: { - rules: [ - // instrument only testing sources with Istanbul - { - test: /\.js$/, - include: path.resolve('src/'), - exclude: path.resolve(__dirname, 'node_modules'), - use: [ - { - loader: 'istanbul-instrumenter-loader', - options: { esModules: true } - } - ] - } - ] - }, - plugins: [ - new webpack.DefinePlugin({ - __VERSION__: JSON.stringify(pkgJson.version), - __USE_SUBTITLES__: JSON.stringify(true), - __USE_ALT_AUDIO__: JSON.stringify(true), - __USE_EME_DRM__: JSON.stringify(true) - }) - ] - }, + webpack: mergeConfig, // web server port port: 9876, diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 00000000000..4467e681793 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,14 @@ +# https://www.netlify.com/docs/netlify-toml-reference/ + +# Settings in the [build] context are global and are applied to all contexts +# unless otherwise overridden by more specific contexts. +[build] + # Directory (relative to root of your repo) that contains the deploy-ready + # HTML files and assets generated by the build. If a base directory has + # been specified, include it in the publish directory path. + publish = "netlify" + +# Deploy Preview context: all deploys resulting from a pull/merge request will +# inherit these settings. +[context.deploy-preview] + command = "TRAVIS_MODE=netlifyPr ./scripts/travis.sh" diff --git a/package.json b/package.json index 29baad13483..7c4f0be3fca 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,5 @@ { "name": "hls.js", - "version": "0.11.0", "license": "Apache-2.0", "description": "JavaScript HLS client using MediaSourceExtension", "homepage": "https://github.com/video-dev/hls.js", @@ -13,11 +12,14 @@ "url": "https://github.com/video-dev/hls.js/issues" }, "main": "./dist/hls.js", + "publishConfig": { + "access": "public" + }, "scripts": { - "build": "webpack", - "build:watch": "webpack --env.debug --watch", - "build:release": "yarn build && yarn test && git add dist/* && git commit -m 'Update dist' && yarn docs:release", - "commit:release": "yarn build:release && git add dist/* && git commit -m 'update dist'", + "build": "webpack --progress", + "build:debug": "webpack --progress --env.debug", + "build:watch": "webpack --progress --env.debug --watch", + "build:types": "tsc --emitDeclarationOnly", "dev": "webpack-dev-server --progress --env.debug --port 8000", "docs": "esdoc", "lint": "eslint src/ && eslint tests/", @@ -30,49 +32,58 @@ "test": "yarn test:unit && yarn test:func", "test:unit": "karma start karma.conf.js", "test:unit:watch": "karma start karma.conf.js --auto-watch --no-single-run", - "test:func": "mocha --require ts-node/register tests/functional/auto/setup.js --timeout 40000" + "test:func": "BABEL_ENV=development mocha --require @babel/register tests/functional/auto/setup.js --timeout 40000 --exit", + "type-check": "tsc --noEmit", + "type-check:watch": "yarn type-check -- --watch" }, "dependencies": { "url-toolkit": "^2.1.2" }, "devDependencies": { - "babel-core": "^6.25.0", - "babel-loader": "^7.1.1", - "babel-preset-env": "^1.7.0", - "babel-register": "^6.24.0", - "chai": "^4.2.0", + "@babel/core": "7.2.0", + "@babel/helper-module-imports": "7.0.0", + "@babel/plugin-proposal-class-properties": "^7.3.0", + "@babel/plugin-proposal-object-rest-spread": "^7.3.2", + "@babel/preset-env": "7.2.0", + "@babel/preset-typescript": "^7.1.0", + "@babel/register": "^7.0.0", + "arraybuffer-equal": "^1.0.4", + "babel-loader": "8.0.4", + "chai": "4.2.0", "chromedriver": "^2.38.3", - "cross-env": "^5.0.2", "esdoc": "^1.1.0", "esdoc-standard-plugin": "^1.0.0", "eslint": "^4.13.1", "eslint-config-standard": "^11.0.0", "eslint-plugin-import": "^2.9.0", + "eslint-plugin-mocha": "^5.2.1", "eslint-plugin-node": "^6.0.1", "eslint-plugin-promise": "^3.6.0", "eslint-plugin-standard": "^3.0.1", - "git-commit-info": "^1.0.0", - "git-tag-version": "^1.2.0", + "eslint-plugin-typescript": "^0.12.0", "http-server": "^0.11.0", "husky": "^0.14.3", "istanbul-instrumenter-loader": "^3.0.1", - "karma": "^3.1.1", + "karma": "3.1.3", "karma-chrome-launcher": "^2.2.0", - "karma-coverage-istanbul-reporter": "^2.0.4", + "karma-coverage-istanbul-reporter": "2.0.4", "karma-mocha": "^1.3.0", - "karma-mocha-reporter": "^2.2.3", + "karma-mocha-reporter": "^2.2.5", "karma-sinon": "^1.0.5", "karma-sinon-chai": "^2.0.2", "karma-sourcemap-loader": "^0.3.7", "karma-webpack": "^3.0.5", "mocha": "^5.2.0", - "mversion": "^1.10.1", + "netlify-cli": "^2.5.1", "selenium-webdriver": "^3.1.0", - "sinon": "^7.1.1", - "sinon-chai": "^3.2.0", - "webpack": "^4.19.1", + "sinon": "7.1.1", + "sinon-chai": "3.3.0", + "typescript": "^3.3.1", + "typescript-eslint-parser": "^21.0.2", + "webpack": "^4.27.1", "webpack-cli": "^3.1.2", - "webpack-dev-server": "^2.7.1", - "webworkify-webpack": "git+ssh://git@github.com:johnBartos/webworkify-webpack.git#refs/heads/master" + "webpack-dev-server": "^3.1.4", + "webpack-merge": "^4.2.1", + "webworkify-webpack": "johnBartos/webworkify-webpack#refs/heads/master" } } diff --git a/scripts/build-deploy-gh-pages.sh b/scripts/build-deploy-gh-pages.sh deleted file mode 100755 index 8494350939d..00000000000 --- a/scripts/build-deploy-gh-pages.sh +++ /dev/null @@ -1,60 +0,0 @@ -#!/bin/bash -set -e - -id=$(git rev-parse HEAD) -root="./gh-pages" -base="$root/$id" -latest="$root/latest" -stable="$root/stable" -topDemo="$root/demo" -topDist="$root/dist" -tag=$(git describe --exact-match --tags HEAD 2>/dev/null || echo "") - -echo "Cloning current gh-pages..." - -rm -rf "$root" -mkdir "$root" -cd "$root" -git clone --depth 1 "https://${GITHUB_TOKEN}@github.com/video-dev/hls.js.git" -b gh-pages . -cd .. - -echo "Building gh-pages for $id" - -mkdir -p "$base" -cp "./README.md" "$base/README.md" -cp -r "./dist" "$base/dist" -cp -r "./demo" "$base/demo" -cp -r "./docs" "$base/docs" -cp -r "./api-docs" "$base/api-docs" - -if [ ! -z "$tag" ] && [[ $tag == v* ]]; then - echo "Detected tag: $tag" - tagloc="./gh-pages/$tag" - rm -rf "$tagloc" - # would be nicer as a symlink, but doesn't work on github - cp -r "$root/$id" "$tagloc" - rm -rf "$stable" - cp -r "$root/$id" "$stable" - rm -rf "$topDemo" - cp -r "./demo" "$topDemo" - rm -rf "$topDist" - cp -r "./dist" "$topDist" -fi - -rm -rf "$latest" -cp -r "$root/$id" "$latest" - -echo "Built gh-pages." - -echo "Deploying gh-pages." -cd "$root" -git add -A -if ! git diff --cached --quiet; then - git -c user.name="HLS.JS CI" commit -m "gh-pages for $id" - # GITHUB_TOKEN set in travis - git push "https://${GITHUB_TOKEN}@github.com/video-dev/hls.js.git" -else - echo "No changed to deploy." -fi -cd .. -echo "Deployed gh-pages." diff --git a/scripts/build-netlify.sh b/scripts/build-netlify.sh new file mode 100755 index 00000000000..d409884c48f --- /dev/null +++ b/scripts/build-netlify.sh @@ -0,0 +1,17 @@ +#!/bin/bash +set -e + +root="./netlify" + +rm -rf "$root" +mkdir "$root" + +echo "Building netlify..." + +# redirect / to /demo +echo "/ /demo" > "$root/_redirects" +cp -r "./dist" "$root/dist" +cp -r "./demo" "$root/demo" +cp -r "./api-docs" "$root/api-docs" + +echo "Built netlify." diff --git a/scripts/deploy-netlify.sh b/scripts/deploy-netlify.sh new file mode 100755 index 00000000000..a5bf197f459 --- /dev/null +++ b/scripts/deploy-netlify.sh @@ -0,0 +1,42 @@ +#!/bin/bash +set -e + +# GITHUB_TOKEN and NETLIFY_ACCESS_TOKEN set in travis + +id=$(git rev-parse HEAD) +root="./netlify" +version=$(jq -r -e '.version' "./package.json") +idShort="$(echo "$id" | cut -c 1-8) ($version)" +latestSiteId="642d9ad4-f002-4104-9309-40ed9cd81a1f" +stableSiteId="deef7ecf-4c3e-4de0-b6bb-676b02e1c20e" + +deploy () { + siteId=$1 + echo "Deploying netlify to '$siteId'." + ./node_modules/.bin/netlify deploy -d "$root" -m "deploy for $id" -s "$siteId" --prod -a "$NETLIFY_ACCESS_TOKEN" + echo "Deployed netlify to '$siteId'." +} + +echo "Creating site for current commit ($id)." +uuid=$(uuidgen) +commitSiteName="hls-js-$uuid" +commitSiteId=$(curl --fail -d "{\"name\":\"$commitSiteName\"}" -H "Content-Type: application/json" -X POST "https://api.netlify.com/api/v1/sites?access_token=$NETLIFY_ACCESS_TOKEN" | jq -r '.site_id') +echo "Created site '$commitSiteId'." + +deploy "$commitSiteId" +deploy "$latestSiteId" +if [[ $version != *"-"* ]]; then + echo "Detected new version: $version" + deploy "$stableSiteId" +fi +echo "Finished deploying to netlify." + +echo "Updating deployments branch." +git clone --depth 1 "https://${GITHUB_TOKEN}@github.com/video-dev/hls.js.git" -b deployments "$root/deployments" +cd "$root/deployments" +echo "- [\`$idShort\`](https://github.com/video-dev/hls.js/commit/$id): [https://$commitSiteName.netlify.com/](https://$commitSiteName.netlify.com/)" >> "README.md" +git add "README.md" +git -c user.name="HLS.JS CI" commit -m "update for $id" +git push "https://${GITHUB_TOKEN}@github.com/video-dev/hls.js.git" +cd .. +echo "Updated deployments branch." diff --git a/scripts/set-package-version.js b/scripts/set-package-version.js index 6eb8835a547..521ff28de30 100755 --- a/scripts/set-package-version.js +++ b/scripts/set-package-version.js @@ -17,7 +17,7 @@ try { } // remove v newVersion = tag.substring(1); - } else if (TRAVIS_MODE === 'releaseCanary') { + } else if (TRAVIS_MODE === 'releaseCanary' || TRAVIS_MODE === 'netlifyPr') { // bump patch in version from latest git tag let currentVersion = getLatestVersionTag(); if (!VALID_VERSION_REGEX.test(currentVersion)) { @@ -34,7 +34,11 @@ try { if (!matched) { throw new Error('Error calculating version.'); } - newVersion += '-canary.' + getCommitNum(); + if (TRAVIS_MODE === 'netlifyPr') { + newVersion += `-pr.${getCommitHash().substr(0, 8)}`; + } else { + newVersion += `-canary.${getCommitNum()}`; + } } else { throw new Error('Unsupported travis mode: ' + TRAVIS_MODE); } @@ -49,9 +53,17 @@ try { process.exit(0); function getCommitNum() { - return parseInt(require('child_process').execSync('git rev-list --count HEAD').toString(), 10); + return parseInt(exec('git rev-list --count HEAD'), 10); +} + +function getCommitHash() { + return exec('git rev-parse HEAD'); } function getLatestVersionTag() { - return require('child_process').execSync('git describe --abbrev=0 --match="v*"').toString().trim(); + return exec('git describe --abbrev=0 --match="v*"'); +} + +function exec(cmd) { + return require('child_process').execSync(cmd).toString().trim(); } diff --git a/scripts/travis.sh b/scripts/travis.sh index 2faa6992803..bc3be8874b0 100755 --- a/scripts/travis.sh +++ b/scripts/travis.sh @@ -11,54 +11,62 @@ if [ "${TRAVIS_MODE}" = "build" ]; then # see https://github.com/video-dev/hls.js/pull/1642 node -e 'require("./" + require("./package.json").main)' elif [ "${TRAVIS_MODE}" = "unitTests" ]; then - npm run test:unit + npm run test:unit elif [ "${TRAVIS_MODE}" = "funcTests" ]; then - npm run build - n=0 - maxRetries=1 - until [ $n -ge ${maxRetries} ] - do - if [ $n -gt 0 ]; then - echo "Retrying... Attempt: $((n+1))" - delay=$((n*60)) - echo "Waiting ${delay} seconds..." - sleep $delay - fi - npm run test:func && break - n=$[$n+1] - done - if [ ${n} = ${maxRetries} ]; then - exit 1 - fi -elif [ "${TRAVIS_MODE}" = "release" ] || [ "${TRAVIS_MODE}" = "releaseCanary" ]; then + npm run build + n=0 + maxRetries=1 + until [ $n -ge ${maxRetries} ] + do + if [ $n -gt 0 ]; then + echo "Retrying... Attempt: $((n+1))" + delay=$((n*60)) + echo "Waiting ${delay} seconds..." + sleep $delay + fi + npm run test:func && break + n=$[$n+1] + done + if [ ${n} = ${maxRetries} ]; then + exit 1 + fi +elif [ "${TRAVIS_MODE}" = "release" ] || [ "${TRAVIS_MODE}" = "releaseCanary" ] || [ "${TRAVIS_MODE}" = "netlifyPr" ]; then # update the version - # make sure everything is fetched https://github.com/travis-ci/travis-ci/issues/3412 - git fetch --unshallow + if [[ $(git rev-parse --is-shallow-repository) = "true" ]]; then + # make sure everything is fetched https://github.com/travis-ci/travis-ci/issues/3412 + git fetch --unshallow + fi node ./scripts/set-package-version.js npm run lint npm run build - npm run test:unit - if [[ $(node ./scripts/check-already-published.js) = "not published" ]]; then - # write the token to config - # see https://docs.npmjs.com/private-modules/ci-server-config - echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" >> .npmrc - if [ "${TRAVIS_MODE}" = "releaseCanary" ]; then - npm publish --tag canary - echo "Published canary." - curl https://purge.jsdelivr.net/npm/hls.js@canary - curl https://purge.jsdelivr.net/npm/hls.js@canary/dist/hls-demo.js - echo "Cleared jsdelivr cache." - elif [ "${TRAVIS_MODE}" = "release" ]; then - npm publish - curl https://purge.jsdelivr.net/npm/hls.js@latest - echo "Published." + if [ "${TRAVIS_MODE}" != "netlifyPr" ]; then + npm run test:unit + if [[ $(node ./scripts/check-already-published.js) = "not published" ]]; then + # write the token to config + # see https://docs.npmjs.com/private-modules/ci-server-config + echo "//registry.npmjs.org/:_authToken=${NPM_TOKEN}" >> .npmrc + if [ "${TRAVIS_MODE}" = "releaseCanary" ]; then + npm publish --tag canary + echo "Published canary." + curl https://purge.jsdelivr.net/npm/hls.js@canary + curl https://purge.jsdelivr.net/npm/hls.js@canary/dist/hls-demo.js + echo "Cleared jsdelivr cache." + elif [ "${TRAVIS_MODE}" = "release" ]; then + npm publish + curl https://purge.jsdelivr.net/npm/hls.js@latest + echo "Published." + fi + else + echo "Already published." fi - else - echo "Already published." fi npm run docs - ./scripts/build-deploy-gh-pages.sh + + ./scripts/build-netlify.sh + if [ "${TRAVIS_MODE}" != "netlifyPr" ]; then + ./scripts/deploy-netlify.sh + fi else - echo "Unknown travis mode: ${TRAVIS_MODE}" 1>&2 - exit 1 + echo "Unknown travis mode: ${TRAVIS_MODE}" 1>&2 + exit 1 fi diff --git a/src/controller/audio-stream-controller.js b/src/controller/audio-stream-controller.js index 22e109c48e1..6e73387b2fa 100644 --- a/src/controller/audio-stream-controller.js +++ b/src/controller/audio-stream-controller.js @@ -11,7 +11,7 @@ import { ErrorTypes, ErrorDetails } from '../errors'; import { logger } from '../utils/logger'; import { findFragWithCC } from '../utils/discontinuities'; import { FragmentState } from './fragment-tracker'; -import Fragment from '../loader/fragment'; +import { ElementaryStreamTypes } from '../loader/fragment'; import { findFragmentByPTS } from './fragment-finders'; import BaseStreamController, { State } from './base-stream-controller'; const { performance } = window; @@ -546,11 +546,14 @@ class AudioStreamController extends BaseStreamController { this.state === State.PARSING) { const { audioSwitch, hls, media, pendingData, trackId } = this; - fragCurrent.addElementaryStream(Fragment.ElementaryStreamTypes.AUDIO); + fragCurrent.addElementaryStream(ElementaryStreamTypes.AUDIO); if (!Number.isFinite(data.endPTS)) { data.endPTS = data.startPTS + fragCurrent.duration; data.endDTS = data.startDTS + fragCurrent.duration; } + + fragCurrent.addElementaryStream(ElementaryStreamTypes.AUDIO); + logger.log(`parsed ${data.type},PTS:[${data.startPTS.toFixed(3)},${data.endPTS.toFixed(3)}],DTS:[${data.startDTS.toFixed(3)}/${data.endDTS.toFixed(3)}],nb:${data.nb}`); const track = this.tracks[trackId]; diff --git a/src/controller/buffer-controller.js b/src/controller/buffer-controller.ts similarity index 55% rename from src/controller/buffer-controller.js rename to src/controller/buffer-controller.ts index eb6b006faa1..a5eb9c5c8bc 100644 --- a/src/controller/buffer-controller.js +++ b/src/controller/buffer-controller.ts @@ -1,55 +1,100 @@ /* * Buffer Controller -*/ + */ -import Event from '../events'; +import Events from '../events'; import EventHandler from '../event-handler'; import { logger } from '../utils/logger'; import { ErrorTypes, ErrorDetails } from '../errors'; import { getMediaSource } from '../utils/mediasource-helper'; +import { TrackSet } from '../types/track'; +import { Segment } from '../types/segment'; + +// Add extension properties to SourceBuffers from the DOM API. +type ExtendedSourceBuffer = SourceBuffer & { + ended?: boolean +}; + +type SourceBufferName = 'video' | 'audio'; +type SourceBuffers = Partial>; + +interface SourceBufferFlushRange { + start: number; + end: number; + type: SourceBufferName +} + const MediaSource = getMediaSource(); class BufferController extends EventHandler { - constructor (hls) { + // the value that we have set mediasource.duration to + // (the actual duration may be tweaked slighly by the browser) + private _msDuration: number | null = null; + // the value that we want to set mediaSource.duration to + private _levelDuration: number | null = null; + // the target duration of the current media playlist + private _levelTargetDuration: number = 10; + // current stream state: true - for live broadcast, false - for VoD content + private _live: boolean | null = null; + // cache the self generated object url to detect hijack of video tag + private _objectUrl: string | null = null; + + // signals that the sourceBuffers need to be flushed + private _needsFlush: boolean = false; + + // signals that mediaSource should have endOfStream called + private _needsEos: boolean = false; + + // this is optional because this property is removed from the class sometimes + public audioTimestampOffset?: number; + + // The number of BUFFER_CODEC events received before any sourceBuffers are created + public bufferCodecEventsExpected: number = 0; + + // A reference to the attached media element + public media: HTMLMediaElement | null = null; + + // A reference to the active media source + public mediaSource: MediaSource | null = null; + + // List of pending segments to be appended to source buffer + public segments: Segment[] = []; + + public parent?: string; + + // A guard to see if we are currently appending to the source buffer + public appending: boolean = false; + + // counters + public appended: number = 0; + public appendError: number = 0; + public flushBufferCounter: number = 0; + + public tracks: TrackSet = {}; + public pendingTracks: TrackSet = {}; + public sourceBuffer: SourceBuffers = {}; + public flushRange: SourceBufferFlushRange[] = []; + + constructor (hls: any) { super(hls, - Event.MEDIA_ATTACHING, - Event.MEDIA_DETACHING, - Event.MANIFEST_PARSED, - Event.BUFFER_RESET, - Event.BUFFER_APPENDING, - Event.BUFFER_CODECS, - Event.BUFFER_EOS, - Event.BUFFER_FLUSHING, - Event.LEVEL_PTS_UPDATED, - Event.LEVEL_UPDATED); - - // the value that we have set mediasource.duration to - // (the actual duration may be tweaked slighly by the browser) - this._msDuration = null; - // the value that we want to set mediaSource.duration to - this._levelDuration = null; - // the target duration of the current media playlist - this._levelTargetDuration = 10; - // current stream state: true - for live broadcast, false - for VoD content - this._live = null; - // cache the self generated object url to detect hijack of video tag - this._objectUrl = null; - // The number of BUFFER_CODEC events received before any sourceBuffers are created - this.bufferCodecEventsExpected = 0; - - // Source Buffer listeners - this.onsbue = this.onSBUpdateEnd.bind(this); - this.onsbe = this.onSBUpdateError.bind(this); - this.pendingTracks = {}; - this.tracks = {}; + Events.MEDIA_ATTACHING, + Events.MEDIA_DETACHING, + Events.MANIFEST_PARSED, + Events.BUFFER_RESET, + Events.BUFFER_APPENDING, + Events.BUFFER_CODECS, + Events.BUFFER_EOS, + Events.BUFFER_FLUSHING, + Events.LEVEL_PTS_UPDATED, + Events.LEVEL_UPDATED); } destroy () { EventHandler.prototype.destroy.call(this); } - onLevelPtsUpdated (data) { + onLevelPtsUpdated (data: { type: SourceBufferName, start: number }) { let type = data.type; let audioTrack = this.tracks.audio; @@ -62,6 +107,10 @@ class BufferController extends EventHandler { if (type === 'audio' && audioTrack && audioTrack.container === 'audio/mpeg') { // Chrome audio mp3 track let audioBuffer = this.sourceBuffer.audio; + if (!audioBuffer) { + throw Error('Level PTS Updated and source buffer for audio uninitalized'); + } + let delta = Math.abs(audioBuffer.timestampOffset - data.start); // adjust timestamp offset if time delta is greater than 100ms @@ -84,7 +133,7 @@ class BufferController extends EventHandler { } } - onManifestParsed (data) { + onManifestParsed (data: { altAudio: boolean }) { // in case of alt audio 2 BUFFER_CODECS events will be triggered, one per stream controller // sourcebuffers will be created all at once when the expected nb of tracks will be reached // in case alt audio is not used, only one BUFFER_CODEC event will be fired from main stream controller @@ -93,18 +142,15 @@ class BufferController extends EventHandler { logger.log(`${this.bufferCodecEventsExpected} bufferCodec event(s) expected`); } - onMediaAttaching (data) { + onMediaAttaching (data: { media: HTMLMediaElement }) { let media = this.media = data.media; if (media) { // setup the media source let ms = this.mediaSource = new MediaSource(); // Media Source listeners - this.onmso = this.onMediaSourceOpen.bind(this); - this.onmse = this.onMediaSourceEnded.bind(this); - this.onmsc = this.onMediaSourceClose.bind(this); - ms.addEventListener('sourceopen', this.onmso); - ms.addEventListener('sourceended', this.onmse); - ms.addEventListener('sourceclose', this.onmsc); + ms.addEventListener('sourceopen', this._onMediaSourceOpen); + ms.addEventListener('sourceended', this._onMediaSourceEnded); + ms.addEventListener('sourceclose', this._onMediaSourceClose); // link video and media Source media.src = window.URL.createObjectURL(ms); // cache the locally generated object url @@ -127,14 +173,16 @@ class BufferController extends EventHandler { logger.warn(`onMediaDetaching:${err.message} while calling endOfStream`); } } - ms.removeEventListener('sourceopen', this.onmso); - ms.removeEventListener('sourceended', this.onmse); - ms.removeEventListener('sourceclose', this.onmsc); + ms.removeEventListener('sourceopen', this._onMediaSourceOpen); + ms.removeEventListener('sourceended', this._onMediaSourceEnded); + ms.removeEventListener('sourceclose', this._onMediaSourceClose); // Detach properly the MediaSource from the HTMLMediaElement as // suggested in https://github.com/w3c/media-source/issues/53. if (this.media) { - window.URL.revokeObjectURL(this._objectUrl); + if (this._objectUrl) { + window.URL.revokeObjectURL(this._objectUrl); + } // clean up video tag src only if it's our own url. some external libraries might // hijack the video tag and change its 'src' without destroying the Hls instance first @@ -156,23 +204,13 @@ class BufferController extends EventHandler { this.segments = []; this.appended = 0; } - this.onmso = this.onmse = this.onmsc = null; - this.hls.trigger(Event.MEDIA_DETACHED); - } - onMediaSourceOpen () { - logger.log('media source opened'); - this.hls.trigger(Event.MEDIA_ATTACHED, { media: this.media }); - let mediaSource = this.mediaSource; - if (mediaSource) { - // once received, don't listen anymore to sourceopen event - mediaSource.removeEventListener('sourceopen', this.onmso); - } - this.checkPendingTracks(); + this.hls.trigger(Events.MEDIA_DETACHED); } checkPendingTracks () { let { bufferCodecEventsExpected, pendingTracks } = this; + // Check if we've received all of the expected bufferCodec events. When none remain, create all the sourceBuffers at once. // This is important because the MSE spec allows implementations to throw QuotaExceededErrors if creating new sourceBuffers after // data has been appended to existing ones. @@ -187,18 +225,30 @@ class BufferController extends EventHandler { } } - onMediaSourceClose () { + private _onMediaSourceOpen = () => { + logger.log('media source opened'); + this.hls.trigger(Events.MEDIA_ATTACHED, { media: this.media }); + let mediaSource = this.mediaSource; + if (mediaSource) { + // once received, don't listen anymore to sourceopen event + mediaSource.removeEventListener('sourceopen', this._onMediaSourceOpen); + } + this.checkPendingTracks(); + } + + private _onMediaSourceClose = () => { logger.log('media source closed'); } - onMediaSourceEnded () { + private _onMediaSourceEnded = () => { logger.log('media source ended'); } - onSBUpdateEnd () { + private _onSBUpdateEnd = () => { // update timestampOffset - if (this.audioTimestampOffset) { + if (this.audioTimestampOffset && this.sourceBuffer.audio) { let audioBuffer = this.sourceBuffer.audio; + logger.warn(`change mpeg audio timestamp offset from ${audioBuffer.timestampOffset} to ${this.audioTimestampOffset}`); audioBuffer.timestampOffset = this.audioTimestampOffset; delete this.audioTimestampOffset; @@ -218,13 +268,17 @@ class BufferController extends EventHandler { let pending = this.segments.reduce((counter, segment) => (segment.parent === parent) ? counter + 1 : counter, 0); // this.sourceBuffer is better to use than media.buffered as it is closer to the PTS data from the fragments - let timeRanges = {}; - const sourceBuffer = this.sourceBuffer; - for (let streamType in sourceBuffer) { - timeRanges[streamType] = sourceBuffer[streamType].buffered; + const timeRanges: Partial> = {}; + const sbSet = this.sourceBuffer; + for (let streamType in sbSet) { + const sb = sbSet[streamType as SourceBufferName]; + if (!sb) { + throw Error(`handling source buffer update end error: source buffer for ${streamType} uninitilized and unable to update buffered TimeRanges.`); + } + timeRanges[streamType as SourceBufferName] = sb.buffered; } - this.hls.trigger(Event.BUFFER_APPENDED, { parent, pending, timeRanges }); + this.hls.trigger(Events.BUFFER_APPENDED, { parent, pending, timeRanges }); // don't append in flushing mode if (!this._needsFlush) { this.doAppending(); @@ -238,23 +292,27 @@ class BufferController extends EventHandler { } } - onSBUpdateError (event) { + private _onSBUpdateError = (event: Event) => { logger.error('sourceBuffer error:', event); // according to http://www.w3.org/TR/media-source/#sourcebuffer-append-error // this error might not always be fatal (it is fatal if decode error is set, in that case // it will be followed by a mediaElement error ...) - this.hls.trigger(Event.ERROR, { type: ErrorTypes.MEDIA_ERROR, details: ErrorDetails.BUFFER_APPENDING_ERROR, fatal: false }); + this.hls.trigger(Events.ERROR, { type: ErrorTypes.MEDIA_ERROR, details: ErrorDetails.BUFFER_APPENDING_ERROR, fatal: false }); // we don't need to do more than that, as accordin to the spec, updateend will be fired just after } onBufferReset () { - let sourceBuffer = this.sourceBuffer; + const sourceBuffer = this.sourceBuffer; for (let type in sourceBuffer) { - let sb = sourceBuffer[type]; + const sb = sourceBuffer[type]; try { - this.mediaSource.removeSourceBuffer(sb); - sb.removeEventListener('updateend', this.onsbue); - sb.removeEventListener('error', this.onsbe); + if (sb) { + if (this.mediaSource) { + this.mediaSource.removeSourceBuffer(sb); + } + sb.removeEventListener('updateend', this._onSBUpdateEnd); + sb.removeEventListener('error', this._onSBUpdateError); + } } catch (err) { } } @@ -264,7 +322,7 @@ class BufferController extends EventHandler { this.appended = 0; } - onBufferCodecs (tracks) { + onBufferCodecs (tracks: TrackSet) { // if source buffer(s) not created yet, appended buffer tracks in this.pendingTracks // if sourcebuffers already created, do nothing ... if (Object.keys(this.sourceBuffer).length) { @@ -275,39 +333,48 @@ class BufferController extends EventHandler { this.pendingTracks[trackName] = tracks[trackName]; }); - const { mediaSource } = this; this.bufferCodecEventsExpected = Math.max(this.bufferCodecEventsExpected - 1, 0); - if (mediaSource && mediaSource.readyState === 'open') { + if (this.mediaSource && this.mediaSource.readyState === 'open') { this.checkPendingTracks(); } } - createSourceBuffers (tracks) { - let sourceBuffer = this.sourceBuffer, mediaSource = this.mediaSource; + createSourceBuffers (tracks: TrackSet) { + const { sourceBuffer, mediaSource } = this; + if (!mediaSource) { + throw Error('createSourceBuffers called when mediaSource was null'); + } for (let trackName in tracks) { if (!sourceBuffer[trackName]) { - let track = tracks[trackName]; + let track = tracks[trackName as keyof TrackSet]; + if (!track) { + throw Error(`source buffer exists for track ${trackName}, however track does not`); + } // use levelCodec as first priority let codec = track.levelCodec || track.codec; let mimeType = `${track.container};codecs=${codec}`; logger.log(`creating sourceBuffer(${mimeType})`); try { let sb = sourceBuffer[trackName] = mediaSource.addSourceBuffer(mimeType); - sb.addEventListener('updateend', this.onsbue); - sb.addEventListener('error', this.onsbe); - this.tracks[trackName] = { codec: codec, container: track.container }; - track.buffer = sb; + sb.addEventListener('updateend', this._onSBUpdateEnd); + sb.addEventListener('error', this._onSBUpdateError); + this.tracks[trackName] = { + buffer: sb, + codec: codec, + container: track.container, + levelCodec: track.levelCodec + }; } catch (err) { logger.error(`error while trying to add sourceBuffer:${err.message}`); - this.hls.trigger(Event.ERROR, { type: ErrorTypes.MEDIA_ERROR, details: ErrorDetails.BUFFER_ADD_CODEC_ERROR, fatal: false, err: err, mimeType: mimeType }); + this.hls.trigger(Events.ERROR, { type: ErrorTypes.MEDIA_ERROR, details: ErrorDetails.BUFFER_ADD_CODEC_ERROR, fatal: false, err: err, mimeType: mimeType }); } } } - this.hls.trigger(Event.BUFFER_CREATED, { tracks: tracks }); + this.hls.trigger(Events.BUFFER_CREATED, { tracks: this.tracks }); } - onBufferAppending (data) { + onBufferAppending (data: Segment) { if (!this._needsFlush) { if (!this.segments) { this.segments = [ data ]; @@ -319,47 +386,44 @@ class BufferController extends EventHandler { } } - onBufferAppendFail (data) { - logger.error('sourceBuffer error:', data.event); - // according to http://www.w3.org/TR/media-source/#sourcebuffer-append-error - // this error might not always be fatal (it is fatal if decode error is set, in that case - // it will be followed by a mediaElement error ...) - this.hls.trigger(Event.ERROR, { type: ErrorTypes.MEDIA_ERROR, details: ErrorDetails.BUFFER_APPENDING_ERROR, fatal: false }); - } - // on BUFFER_EOS mark matching sourcebuffer(s) as ended and trigger checkEos() - onBufferEos (data) { - let sb = this.sourceBuffer; - let dataType = data.type; - for (let type in sb) { - if (!dataType || type === dataType) { - if (!sb[type].ended) { - sb[type].ended = true; + // an undefined data.type will mark all buffers as EOS. + onBufferEos (data: { type?: SourceBufferName }) { + for (const type in this.sourceBuffer) { + if (!data.type || data.type === type) { + const sb = this.sourceBuffer[type as SourceBufferName]; + if (sb && !sb.ended) { + sb.ended = true; logger.log(`${type} sourceBuffer now EOS`); } } } + this.checkEos(); } // if all source buffers are marked as ended, signal endOfStream() to MediaSource. checkEos () { - let sb = this.sourceBuffer, mediaSource = this.mediaSource; + const { sourceBuffer, mediaSource } = this; if (!mediaSource || mediaSource.readyState !== 'open') { this._needsEos = false; return; } - for (let type in sb) { - let sbobj = sb[type]; - if (!sbobj.ended) { + + for (let type in sourceBuffer) { + const sb = sourceBuffer[type as SourceBufferName]; + if (!sb) continue; + + if (!sb.ended) { return; } - if (sbobj.updating) { + if (sb.updating) { this._needsEos = true; return; } } + logger.log('all media data are available, signal endOfStream() to MediaSource and stop loading fragment'); // Notify the media element that it now has all of the media data try { @@ -370,7 +434,7 @@ class BufferController extends EventHandler { this._needsEos = false; } - onBufferFlushing (data) { + onBufferFlushing (data: { startOffset: number, endOffset: number, type: SourceBufferName }) { this.flushRange.push({ start: data.startOffset, end: data.endOffset, type: data.type }); // attempt flush immediately this.flushBufferCounter = 0; @@ -378,6 +442,10 @@ class BufferController extends EventHandler { } flushLiveBackBuffer () { + if (!this.media) { + throw Error('flushLiveBackBuffer called without attaching media'); + } + // clear back buffer for live only if (!this._live) { return; @@ -394,19 +462,22 @@ class BufferController extends EventHandler { const targetBackBufferPosition = currentTime - Math.max(liveBackBufferLength, this._levelTargetDuration); for (let index = bufferTypes.length - 1; index >= 0; index--) { - const bufferType = bufferTypes[index], buffered = sourceBuffer[bufferType].buffered; - - // when target buffer start exceeds actual buffer start - if (buffered.length > 0 && targetBackBufferPosition > buffered.start(0)) { - // remove buffer up until current time minus minimum back buffer length (removing buffer too close to current - // time will lead to playback freezing) - // credits for level target duration - https://github.com/videojs/http-streaming/blob/3132933b6aa99ddefab29c10447624efd6fd6e52/src/segment-loader.js#L91 - this.removeBufferRange(bufferType, sourceBuffer[bufferType], 0, targetBackBufferPosition); + const bufferType = bufferTypes[index]; + const sb = sourceBuffer[bufferType as SourceBufferName]; + if (sb) { + const buffered = sb.buffered; + // when target buffer start exceeds actual buffer start + if (buffered.length > 0 && targetBackBufferPosition > buffered.start(0)) { + // remove buffer up until current time minus minimum back buffer length (removing buffer too close to current + // time will lead to playback freezing) + // credits for level target duration - https://github.com/videojs/http-streaming/blob/3132933b6aa99ddefab29c10447624efd6fd6e52/src/segment-loader.js#L91 + this.removeBufferRange(bufferType, sb, 0, targetBackBufferPosition); + } } } } - onLevelUpdated ({ details }) { + onLevelUpdated ({ details }: { details: { totalduration: number, targetduration?: number, averagetargetduration?: number, live: boolean, fragments: any[] } }) { if (details.fragments.length > 0) { this._levelDuration = details.totalduration + details.fragments[0].start; this._levelTargetDuration = details.averagetargetduration || details.targetduration || 10; @@ -422,7 +493,7 @@ class BufferController extends EventHandler { */ updateMediaElementDuration () { let { config } = this.hls; - let duration; + let duration: number; if (this._levelDuration === null || !this.media || @@ -434,7 +505,8 @@ class BufferController extends EventHandler { } for (let type in this.sourceBuffer) { - if (this.sourceBuffer[type].updating === true) { + const sb = this.sourceBuffer[type]; + if (sb && sb.updating === true) { // can't set duration whilst a buffer is updating return; } @@ -484,7 +556,10 @@ class BufferController extends EventHandler { let sourceBuffer = this.sourceBuffer; try { for (let type in sourceBuffer) { - appended += sourceBuffer[type].buffered.length; + const sb = sourceBuffer[type]; + if (sb) { + appended += sb.buffered.length; + } } } catch (error) { // error could be thrown while accessing buffered, in case sourcebuffer has already been removed from MediaSource @@ -492,80 +567,80 @@ class BufferController extends EventHandler { logger.error('error while accessing sourceBuffer.buffered'); } this.appended = appended; - this.hls.trigger(Event.BUFFER_FLUSHED); + this.hls.trigger(Events.BUFFER_FLUSHED); } } doAppending () { - let { hls, segments, sourceBuffer } = this; - if (Object.keys(sourceBuffer).length) { - if (this.media.error) { - this.segments = []; - logger.error('trying to append although a media error occured, flush segment and abort'); + let { hls, segments, sourceBuffer, media } = this; + if (!Object.keys(sourceBuffer).length) { + // early exit if no source buffers have been initialized yet + return; + } + + if (!this.media || this.media.error) { + this.segments = []; + logger.error('trying to append although a media error occured, flush segment and abort'); + return; + } + + if (this.appending) { + // logger.log(`sb appending in progress`); + return; + } + + const segment = segments.shift(); + if (!segment) { // handle undefined shift + return; + } + + try { + const sb = sourceBuffer[segment.type]; + if (!sb) { + // in case we don't have any source buffer matching with this segment type, + // it means that Mediasource fails to create sourcebuffer + // discard this segment, and trigger update end + this._onSBUpdateEnd(); return; } - if (this.appending) { - // logger.log(`sb appending in progress`); + + if (sb.updating) { + // if we are still updating the source buffer from the last segment, place this back at the front of the queue + segments.unshift(segment); return; } - if (segments && segments.length) { - let segment = segments.shift(); - try { - let type = segment.type, sb = sourceBuffer[type]; - if (sb) { - if (!sb.updating) { - // reset sourceBuffer ended flag before appending segment - sb.ended = false; - // logger.log(`appending ${segment.content} ${type} SB, size:${segment.data.length}, ${segment.parent}`); - this.parent = segment.parent; - sb.appendBuffer(segment.data); - this.appendError = 0; - this.appended++; - this.appending = true; - } else { - segments.unshift(segment); - } - } else { - // in case we don't have any source buffer matching with this segment type, - // it means that Mediasource fails to create sourcebuffer - // discard this segment, and trigger update end - this.onSBUpdateEnd(); - } - } catch (err) { - // in case any error occured while appending, put back segment in segments table - logger.error(`error while trying to append buffer:${err.message}`); - segments.unshift(segment); - let event = { type: ErrorTypes.MEDIA_ERROR, parent: segment.parent }; - if (err.code !== 22) { - if (this.appendError) { - this.appendError++; - } else { - this.appendError = 1; - } - - event.details = ErrorDetails.BUFFER_APPEND_ERROR; - /* with UHD content, we could get loop of quota exceeded error until - browser is able to evict some data from sourcebuffer. retrying help recovering this - */ - if (this.appendError > hls.config.appendErrorMaxRetry) { - logger.log(`fail ${hls.config.appendErrorMaxRetry} times to append segment in sourceBuffer`); - this.segments = []; - event.fatal = true; - hls.trigger(Event.ERROR, event); - } else { - event.fatal = false; - hls.trigger(Event.ERROR, event); - } - } else { - // QuotaExceededError: http://www.w3.org/TR/html5/infrastructure.html#quotaexceedederror - // let's stop appending any segments, and report BUFFER_FULL_ERROR error - this.segments = []; - event.details = ErrorDetails.BUFFER_FULL_ERROR; - event.fatal = false; - hls.trigger(Event.ERROR, event); - } + + // reset sourceBuffer ended flag before appending segment + sb.ended = false; + // logger.log(`appending ${segment.content} ${type} SB, size:${segment.data.length}, ${segment.parent}`); + this.parent = segment.parent; + sb.appendBuffer(segment.data); + this.appendError = 0; + this.appended++; + this.appending = true; + } catch (err) { + // in case any error occured while appending, put back segment in segments table + logger.error(`error while trying to append buffer:${err.message}`); + segments.unshift(segment); + let event = { type: ErrorTypes.MEDIA_ERROR, parent: segment.parent, details: '', fatal: false }; + if (err.code === 22) { + // QuotaExceededError: http://www.w3.org/TR/html5/infrastructure.html#quotaexceedederror + // let's stop appending any segments, and report BUFFER_FULL_ERROR error + this.segments = []; + event.details = ErrorDetails.BUFFER_FULL_ERROR; + } else { + this.appendError++; + event.details = ErrorDetails.BUFFER_APPEND_ERROR; + /* with UHD content, we could get loop of quota exceeded error until + browser is able to evict some data from sourcebuffer. retrying help recovering this + */ + if (this.appendError > hls.config.appendErrorMaxRetry) { + logger.log(`fail ${hls.config.appendErrorMaxRetry} times to append segment in sourceBuffer`); + this.segments = []; + event.fatal = true; } } + hls.trigger(Events.ERROR, event); } } @@ -574,38 +649,41 @@ class BufferController extends EventHandler { return true once range has been flushed. as sourceBuffer.remove() is asynchronous, flushBuffer will be retriggered on sourceBuffer update end */ - flushBuffer (startOffset, endOffset, typeIn) { - let sb; + flushBuffer (startOffset: number, endOffset: number, sbType: SourceBufferName): boolean { const sourceBuffer = this.sourceBuffer; - if (Object.keys(sourceBuffer).length) { - logger.log(`flushBuffer,pos/start/end: ${this.media.currentTime.toFixed(3)}/${startOffset}/${endOffset}`); - // safeguard to avoid infinite looping : don't try to flush more than the nb of appended segments - if (this.flushBufferCounter < this.appended) { - for (let type in sourceBuffer) { - // check if sourcebuffer type is defined (typeIn): if yes, let's only flush this one - // if no, let's flush all sourcebuffers - if (typeIn && type !== typeIn) { - continue; - } + // exit if no sourceBuffers are initialized + if (!Object.keys(sourceBuffer).length) { + return true; + } - sb = sourceBuffer[type]; - // we are going to flush buffer, mark source buffer as 'not ended' - sb.ended = false; - if (!sb.updating) { - if (this.removeBufferRange(type, sb, startOffset, endOffset)) { - this.flushBufferCounter++; - return false; - } - } else { - logger.warn('cannot flush, sb updating in progress'); - return false; - } + let currentTime: string = 'null'; + if (this.media) { + currentTime = this.media.currentTime.toFixed(3); + } + logger.log(`flushBuffer,pos/start/end: ${currentTime}/${startOffset}/${endOffset}`); + + // safeguard to avoid infinite looping : don't try to flush more than the nb of appended segments + if (this.flushBufferCounter >= this.appended) { + logger.warn('abort flushing too many retries'); + return true; + } + + const sb = sourceBuffer[sbType]; + // we are going to flush buffer, mark source buffer as 'not ended' + if (sb) { + sb.ended = false; + if (!sb.updating) { + if (this.removeBufferRange(sbType, sb, startOffset, endOffset)) { + this.flushBufferCounter++; + return false; } } else { - logger.warn('abort flushing too many retries'); + logger.warn('cannot flush, sb updating in progress'); + return false; } - logger.log('buffer flushed'); } + + logger.log('buffer flushed'); // everything flushed ! return true; } @@ -613,14 +691,14 @@ class BufferController extends EventHandler { /** * Removes first buffered range from provided source buffer that lies within given start and end offsets. * - * @param type Type of the source buffer, logging purposes only. - * @param sb Target SourceBuffer instance. - * @param startOffset - * @param endOffset + * @param {string} type Type of the source buffer, logging purposes only. + * @param {SourceBuffer} sb Target SourceBuffer instance. + * @param {number} startOffset + * @param {number} endOffset * * @returns {boolean} True when source buffer remove requested. */ - removeBufferRange (type, sb, startOffset, endOffset) { + removeBufferRange (type: string, sb: ExtendedSourceBuffer, startOffset: number, endOffset: number): boolean { try { for (let i = 0; i < sb.buffered.length; i++) { let bufStart = sb.buffered.start(i); @@ -634,7 +712,12 @@ class BufferController extends EventHandler { only flush buffer range of length greater than 500ms. */ if (Math.min(removeEnd, bufEnd) - removeStart > 0.5) { - logger.log(`sb remove ${type} [${removeStart},${removeEnd}], of [${bufStart},${bufEnd}], pos:${this.media.currentTime}`); + let currentTime: string = 'null'; + if (this.media) { + currentTime = this.media.currentTime.toString(); + } + + logger.log(`sb remove ${type} [${removeStart},${removeEnd}], of [${bufStart},${bufEnd}], pos:${currentTime}`); sb.remove(removeStart, removeEnd); return true; } diff --git a/src/controller/eme-controller.js b/src/controller/eme-controller.ts similarity index 56% rename from src/controller/eme-controller.js rename to src/controller/eme-controller.ts index d387ff9c487..df27575d5bc 100644 --- a/src/controller/eme-controller.js +++ b/src/controller/eme-controller.ts @@ -10,17 +10,15 @@ import { ErrorTypes, ErrorDetails } from '../errors'; import { logger } from '../utils/logger'; -const { XMLHttpRequest } = window; - const MAX_LICENSE_REQUEST_FAILURES = 3; /** * @see https://developer.mozilla.org/en-US/docs/Web/API/Navigator/requestMediaKeySystemAccess */ -const KeySystems = { - WIDEVINE: 'com.widevine.alpha', - PLAYREADY: 'com.microsoft.playready' -}; +enum KeySystems { + WIDEVINE = 'com.widevine.alpha', + PLAYREADY = 'com.microsoft.playready', +} /** * @see https://developer.mozilla.org/en-US/docs/Web/API/MediaKeySystemConfiguration @@ -30,20 +28,18 @@ const KeySystems = { * @returns {Array} An array of supported configurations */ -const createWidevineMediaKeySystemConfigurations = function (audioCodecs, videoCodecs, drmSystemOptions) { /* jshint ignore:line */ - const baseConfig = { +const createWidevineMediaKeySystemConfigurations = function (audioCodecs: string[], videoCodecs: string[]): MediaKeySystemConfiguration[] { /* jshint ignore:line */ + const baseConfig: MediaKeySystemConfiguration = { // initDataTypes: ['keyids', 'mp4'], // label: "", // persistentState: "not-allowed", // or "required" ? // distinctiveIdentifier: "not-allowed", // or "required" ? // sessionTypes: ['temporary'], - videoCapabilities: [ - // { contentType: 'video/mp4; codecs="avc1.42E01E"' } - ] + videoCapabilities: [] // { contentType: 'video/mp4; codecs="avc1.42E01E"' } }; videoCodecs.forEach((codec) => { - baseConfig.videoCapabilities.push({ + baseConfig.videoCapabilities!.push({ contentType: `video/mp4; codecs="${codec}"` }); }); @@ -57,22 +53,31 @@ const createWidevineMediaKeySystemConfigurations = function (audioCodecs, videoC * The idea here is to handle key-system (and their respective platforms) specific configuration differences * in order to work with the local requestMediaKeySystemAccess method. * - * We can also rule-out platform-related key-system support at this point by throwing an error or returning null. + * We can also rule-out platform-related key-system support at this point by throwing an error. * * @param {string} keySystem Identifier for the key-system, see `KeySystems` enum * @param {Array} audioCodecs List of required audio codecs to support * @param {Array} videoCodecs List of required video codecs to support - * @returns {Array | null} A non-empty Array of MediaKeySystemConfiguration objects or `null` + * @throws will throw an error if a unknown key system is passed + * @returns {Array} A non-empty Array of MediaKeySystemConfiguration objects */ -const getSupportedMediaKeySystemConfigurations = function (keySystem, audioCodecs, videoCodecs) { +const getSupportedMediaKeySystemConfigurations = function (keySystem: KeySystems, audioCodecs: string[], videoCodecs: string[]): MediaKeySystemConfiguration[] { switch (keySystem) { case KeySystems.WIDEVINE: return createWidevineMediaKeySystemConfigurations(audioCodecs, videoCodecs); default: - throw Error('Unknown key-system: ' + keySystem); + throw new Error(`Unknown key-system: ${keySystem}`); } }; +interface MediaKeysListItem { + mediaKeys?: MediaKeys, + mediaKeysSession?: MediaKeySession, + mediaKeysSessionInitialized: boolean; + mediaKeySystemAccess: MediaKeySystemAccess; + mediaKeySystemDomain: KeySystems; +} + /** * Controller to deal with encrypted media extensions (EME) * @see https://developer.mozilla.org/en-US/docs/Web/API/Encrypted_Media_Extensions_API @@ -81,6 +86,16 @@ const getSupportedMediaKeySystemConfigurations = function (keySystem, audioCodec * @constructor */ class EMEController extends EventHandler { + private _widevineLicenseUrl: string; + private _licenseXhrSetup: (xhr: XMLHttpRequest, url: string) => void; + private _emeEnabled: boolean; + private _requestMediaKeySystemAccess: (keySystem: KeySystems, supportedConfigurations: MediaKeySystemConfiguration[]) => Promise + + private _mediaKeysList: MediaKeysListItem[] = [] + private _media: HTMLMediaElement | null = null; + private _hasSetMediaKeys: boolean = false; + private _requestLicenseFailureCount: number = 0; + /** * @constructs * @param {Hls} hls Our Hls.js instance @@ -88,50 +103,28 @@ class EMEController extends EventHandler { constructor (hls) { super(hls, Event.MEDIA_ATTACHED, + Event.MEDIA_DETACHED, Event.MANIFEST_PARSED ); this._widevineLicenseUrl = hls.config.widevineLicenseUrl; this._licenseXhrSetup = hls.config.licenseXhrSetup; this._emeEnabled = hls.config.emeEnabled; - this._requestMediaKeySystemAccess = hls.config.requestMediaKeySystemAccessFunc; - - this._mediaKeysList = []; - this._media = null; - - this._hasSetMediaKeys = false; - this._isMediaEncrypted = false; - - this._requestLicenseFailureCount = 0; } /** - * - * @param {string} keySystem Identifier for the key-system, see `KeySystems` enum - * @returns {string} License server URL for key-system (if any configured, otherwise causes error) - */ - getLicenseServerUrl (keySystem) { - let url; + * @param {string} keySystem Identifier for the key-system, see `KeySystems` enum + * @returns {string} License server URL for key-system (if any configured, otherwise causes error) + * @throws if a unsupported keysystem is passed + */ + getLicenseServerUrl (keySystem: KeySystems): string { switch (keySystem) { case KeySystems.WIDEVINE: - url = this._widevineLicenseUrl; - break; - default: - url = null; - break; - } - - if (!url) { - logger.error(`No license server URL configured for key-system "${keySystem}"`); - this.hls.trigger(Event.ERROR, { - type: ErrorTypes.KEY_SYSTEM_ERROR, - details: ErrorDetails.KEY_SYSTEM_LICENSE_REQUEST_FAILED, - fatal: true - }); + return this._widevineLicenseUrl; } - return url; + throw new Error(`no license server URL configured for key-system "${keySystem}"`); } /** @@ -140,17 +133,14 @@ class EMEController extends EventHandler { * @param {string} keySystem System ID (see `KeySystems`) * @param {Array} audioCodecs List of required audio codecs to support * @param {Array} videoCodecs List of required video codecs to support + * @throws When a unsupported KeySystem is passed */ - _attemptKeySystemAccess (keySystem, audioCodecs, videoCodecs) { + private _attemptKeySystemAccess (keySystem: KeySystems, audioCodecs: string[], videoCodecs: string[]) { // TODO: add other DRM "options" + // This can throw, but is caught in event handler callpath const mediaKeySystemConfigs = getSupportedMediaKeySystemConfigurations(keySystem, audioCodecs, videoCodecs); - if (!mediaKeySystemConfigs) { - logger.warn('Can not create config for key-system (maybe because platform is not supported):', keySystem); - return; - } - logger.log('Requesting encrypted media key-system access'); // expecting interface like window.navigator.requestMediaKeySystemAccess @@ -173,16 +163,14 @@ class EMEController extends EventHandler { /** * Handles obtaining access to a key-system - * + * @private * @param {string} keySystem * @param {MediaKeySystemAccess} mediaKeySystemAccess https://developer.mozilla.org/en-US/docs/Web/API/MediaKeySystemAccess */ - _onMediaKeySystemAccessObtained (keySystem, mediaKeySystemAccess) { + private _onMediaKeySystemAccessObtained (keySystem: KeySystems, mediaKeySystemAccess: MediaKeySystemAccess) { logger.log(`Access for key-system "${keySystem}" obtained`); - const mediaKeysListItem = { - mediaKeys: null, - mediaKeysSession: null, + const mediaKeysListItem: MediaKeysListItem = { mediaKeysSessionInitialized: false, mediaKeySystemAccess: mediaKeySystemAccess, mediaKeySystemDomain: keySystem @@ -204,52 +192,68 @@ class EMEController extends EventHandler { } /** - * Handles key-creation (represents access to CDM). We are going to create key-sessions upon this - * for all existing keys where no session exists yet. - */ - _onMediaKeysCreated () { + * Handles key-creation (represents access to CDM). We are going to create key-sessions upon this + * for all existing keys where no session exists yet. + * + * @private + */ + private _onMediaKeysCreated () { // check for all key-list items if a session exists, otherwise, create one this._mediaKeysList.forEach((mediaKeysListItem) => { if (!mediaKeysListItem.mediaKeysSession) { - mediaKeysListItem.mediaKeysSession = mediaKeysListItem.mediaKeys.createSession(); + // mediaKeys is definitely initialized here + mediaKeysListItem.mediaKeysSession = mediaKeysListItem.mediaKeys!.createSession(); this._onNewMediaKeySession(mediaKeysListItem.mediaKeysSession); } }); } /** - * + * @private * @param {*} keySession */ - _onNewMediaKeySession (keySession) { + private _onNewMediaKeySession (keySession: MediaKeySession) { logger.log(`New key-system session ${keySession.sessionId}`); - keySession.addEventListener('message', (event) => { + keySession.addEventListener('message', (event: MediaKeyMessageEvent) => { this._onKeySessionMessage(keySession, event.message); }, false); } - _onKeySessionMessage (keySession, message) { + /** + * @private + * @param {MediaKeySession} keySession + * @param {ArrayBuffer} message + */ + private _onKeySessionMessage (keySession: MediaKeySession, message: ArrayBuffer) { logger.log('Got EME message event, creating license request'); - this._requestLicense(message, (data) => { + this._requestLicense(message, (data: ArrayBuffer) => { logger.log('Received license data, updating key-session'); keySession.update(data); }); } - _onMediaEncrypted (initDataType, initData) { - logger.log(`Media is encrypted using "${initDataType}" init data type`); - - this._isMediaEncrypted = true; - this._mediaEncryptionInitDataType = initDataType; - this._mediaEncryptionInitData = initData; + /** + * @private + * @param {string} initDataType + * @param {ArrayBuffer|null} initData + */ + private _onMediaEncrypted = (e: MediaEncryptedEvent) => { + logger.log(`Media is encrypted using "${e.initDataType}" init data type`); this._attemptSetMediaKeys(); - this._generateRequestWithPreferredKeySession(); + this._generateRequestWithPreferredKeySession(e.initDataType, e.initData); } - _attemptSetMediaKeys () { + /** + * @private + */ + private _attemptSetMediaKeys () { + if (!this._media) { + throw new Error('Attempted to set mediaKeys without first attaching a media element'); + } + if (!this._hasSetMediaKeys) { // FIXME: see if we can/want/need-to really to deal with several potential key-sessions? const keysListItem = this._mediaKeysList[0]; @@ -270,7 +274,10 @@ class EMEController extends EventHandler { } } - _generateRequestWithPreferredKeySession () { + /** + * @private + */ + private _generateRequestWithPreferredKeySession (initDataType: string, initData: ArrayBuffer | null) { // FIXME: see if we can/want/need-to really to deal with several potential key-sessions? const keysListItem = this._mediaKeysList[0]; if (!keysListItem) { @@ -296,13 +303,10 @@ class EMEController extends EventHandler { details: ErrorDetails.KEY_SYSTEM_NO_SESSION, fatal: true }); + return; } - const initDataType = this._mediaEncryptionInitDataType; - const initData = this._mediaEncryptionInitData; - logger.log(`Generating key-session request for "${initDataType}" init data type`); - keysListItem.mediaKeysSessionInitialized = true; keySession.generateRequest(initDataType, initData) @@ -320,12 +324,14 @@ class EMEController extends EventHandler { } /** - * @param {string} url License server URL - * @param {ArrayBuffer} keyMessage Message data issued by key-system - * @param {function} callback Called when XHR has succeeded - * @returns {XMLHttpRequest} Unsent (but opened state) XHR object - */ - _createLicenseXhr (url, keyMessage, callback) { + * @private + * @param {string} url License server URL + * @param {ArrayBuffer} keyMessage Message data issued by key-system + * @param {function} callback Called when XHR has succeeded + * @returns {XMLHttpRequest} Unsent (but opened state) XHR object + * @throws if XMLHttpRequest construction failed + */ + private _createLicenseXhr (url: string, keyMessage: ArrayBuffer, callback: (data: ArrayBuffer) => void): XMLHttpRequest { const xhr = new XMLHttpRequest(); const licenseXhrSetup = this._licenseXhrSetup; @@ -345,15 +351,10 @@ class EMEController extends EventHandler { } } catch (e) { // IE11 throws an exception on xhr.open if attempting to access an HTTP resource over HTTPS - logger.error('Error setting up key-system license XHR', e); - this.hls.trigger(Event.ERROR, { - type: ErrorTypes.KEY_SYSTEM_ERROR, - details: ErrorDetails.KEY_SYSTEM_LICENSE_REQUEST_FAILED, - fatal: true - }); - return; + throw new Error(`issue setting up KeySystem license XHR ${e}`); } + // Because we set responseType to ArrayBuffer here, callback is typed as handling only array buffers xhr.responseType = 'arraybuffer'; xhr.onreadystatechange = this._onLicenseRequestReadyStageChange.bind(this, xhr, url, keyMessage, callback); @@ -361,82 +362,88 @@ class EMEController extends EventHandler { } /** - * @param {XMLHttpRequest} xhr - * @param {string} url License server URL - * @param {ArrayBuffer} keyMessage Message data issued by key-system - * @param {function} callback Called when XHR has succeeded - * - */ - _onLicenseRequestReadyStageChange (xhr, url, keyMessage, callback) { + * @private + * @param {XMLHttpRequest} xhr + * @param {string} url License server URL + * @param {ArrayBuffer} keyMessage Message data issued by key-system + * @param {function} callback Called when XHR has succeeded + */ + private _onLicenseRequestReadyStageChange (xhr: XMLHttpRequest, url: string, keyMessage: ArrayBuffer, callback: (data: ArrayBuffer) => void) { switch (xhr.readyState) { case 4: if (xhr.status === 200) { this._requestLicenseFailureCount = 0; logger.log('License request succeeded'); + + if (xhr.responseType !== 'arraybuffer') { + logger.warn('xhr response type was not set to the expected arraybuffer for license request'); + } callback(xhr.response); } else { logger.error(`License Request XHR failed (${url}). Status: ${xhr.status} (${xhr.statusText})`); - this._requestLicenseFailureCount++; - if (this._requestLicenseFailureCount <= MAX_LICENSE_REQUEST_FAILURES) { - const attemptsLeft = MAX_LICENSE_REQUEST_FAILURES - this._requestLicenseFailureCount + 1; - logger.warn(`Retrying license request, ${attemptsLeft} attempts left`); - this._requestLicense(keyMessage, callback); + if (this._requestLicenseFailureCount > MAX_LICENSE_REQUEST_FAILURES) { + this.hls.trigger(Event.ERROR, { + type: ErrorTypes.KEY_SYSTEM_ERROR, + details: ErrorDetails.KEY_SYSTEM_LICENSE_REQUEST_FAILED, + fatal: true + }); return; } - this.hls.trigger(Event.ERROR, { - type: ErrorTypes.KEY_SYSTEM_ERROR, - details: ErrorDetails.KEY_SYSTEM_LICENSE_REQUEST_FAILED, - fatal: true - }); + const attemptsLeft = MAX_LICENSE_REQUEST_FAILURES - this._requestLicenseFailureCount + 1; + logger.warn(`Retrying license request, ${attemptsLeft} attempts left`); + this._requestLicense(keyMessage, callback); } break; } } /** - * @param {object} keysListItem - * @param {ArrayBuffer} keyMessage - * @returns {ArrayBuffer} Challenge data posted to license server - */ - _generateLicenseRequestChallenge (keysListItem, keyMessage) { - let challenge; - - if (keysListItem.mediaKeySystemDomain === KeySystems.PLAYREADY) { - logger.error('PlayReady is not supported (yet)'); - - // from https://github.com/MicrosoftEdge/Demos/blob/master/eme/scripts/demo.js - /* - if (this.licenseType !== this.LICENSE_TYPE_WIDEVINE) { - // For PlayReady CDMs, we need to dig the Challenge out of the XML. - var keyMessageXml = new DOMParser().parseFromString(String.fromCharCode.apply(null, new Uint16Array(keyMessage)), 'application/xml'); - if (keyMessageXml.getElementsByTagName('Challenge')[0]) { - challenge = atob(keyMessageXml.getElementsByTagName('Challenge')[0].childNodes[0].nodeValue); - } else { - throw 'Cannot find in key message'; - } - var headerNames = keyMessageXml.getElementsByTagName('name'); - var headerValues = keyMessageXml.getElementsByTagName('value'); - if (headerNames.length !== headerValues.length) { - throw 'Mismatched header / pair in key message'; - } - for (var i = 0; i < headerNames.length; i++) { - xhr.setRequestHeader(headerNames[i].childNodes[0].nodeValue, headerValues[i].childNodes[0].nodeValue); - } + * @private + * @param {MediaKeysListItem} keysListItem + * @param {ArrayBuffer} keyMessage + * @returns {ArrayBuffer} Challenge data posted to license server + * @throws if KeySystem is unsupported + */ + private _generateLicenseRequestChallenge (keysListItem: MediaKeysListItem, keyMessage: ArrayBuffer): ArrayBuffer { + switch (keysListItem.mediaKeySystemDomain) { + // case KeySystems.PLAYREADY: + // from https://github.com/MicrosoftEdge/Demos/blob/master/eme/scripts/demo.js + /* + if (this.licenseType !== this.LICENSE_TYPE_WIDEVINE) { + // For PlayReady CDMs, we need to dig the Challenge out of the XML. + var keyMessageXml = new DOMParser().parseFromString(String.fromCharCode.apply(null, new Uint16Array(keyMessage)), 'application/xml'); + if (keyMessageXml.getElementsByTagName('Challenge')[0]) { + challenge = atob(keyMessageXml.getElementsByTagName('Challenge')[0].childNodes[0].nodeValue); + } else { + throw 'Cannot find in key message'; + } + var headerNames = keyMessageXml.getElementsByTagName('name'); + var headerValues = keyMessageXml.getElementsByTagName('value'); + if (headerNames.length !== headerValues.length) { + throw 'Mismatched header / pair in key message'; } - */ - } else if (keysListItem.mediaKeySystemDomain === KeySystems.WIDEVINE) { + for (var i = 0; i < headerNames.length; i++) { + xhr.setRequestHeader(headerNames[i].childNodes[0].nodeValue, headerValues[i].childNodes[0].nodeValue); + } + } + break; + */ + case KeySystems.WIDEVINE: // For Widevine CDMs, the challenge is the keyMessage. - challenge = keyMessage; - } else { - logger.error('Unsupported key-system:', keysListItem.mediaKeySystemDomain); + return keyMessage; } - return challenge; + throw new Error(`unsupported key-system: ${keysListItem.mediaKeySystemDomain}`); } - _requestLicense (keyMessage, callback) { + /** + * @private + * @param keyMessage + * @param callback + */ + private _requestLicense (keyMessage: ArrayBuffer, callback: (data: ArrayBuffer) => void) { logger.log('Requesting content license for key-system'); const keysListItem = this._mediaKeysList[0]; @@ -450,15 +457,23 @@ class EMEController extends EventHandler { return; } - const url = this.getLicenseServerUrl(keysListItem.mediaKeySystemDomain); - const xhr = this._createLicenseXhr(url, keyMessage, callback); - - logger.log(`Sending license request to URL: ${url}`); - - xhr.send(this._generateLicenseRequestChallenge(keysListItem, keyMessage)); + try { + const url = this.getLicenseServerUrl(keysListItem.mediaKeySystemDomain); + const xhr = this._createLicenseXhr(url, keyMessage, callback); + logger.log(`Sending license request to URL: ${url}`); + const challenge = this._generateLicenseRequestChallenge(keysListItem, keyMessage); + xhr.send(challenge); + } catch (e) { + logger.error(`Failure requesting DRM license: ${e}`); + this.hls.trigger(Event.ERROR, { + type: ErrorTypes.KEY_SYSTEM_ERROR, + details: ErrorDetails.KEY_SYSTEM_LICENSE_REQUEST_FAILED, + fatal: true + }); + } } - onMediaAttached (data) { + onMediaAttached (data: { media: HTMLMediaElement; }) { if (!this._emeEnabled) { return; } @@ -468,14 +483,18 @@ class EMEController extends EventHandler { // keep reference of media this._media = media; - // FIXME: also handle detaching media ! + media.addEventListener('encrypted', this._onMediaEncrypted); + } - media.addEventListener('encrypted', (e) => { - this._onMediaEncrypted(e.initDataType, e.initData); - }); + onMediaDetached () { + if (this._media) { + this._media.removeEventListener('encrypted', this._onMediaEncrypted); + this._media = null; // release reference + } } - onManifestParsed (data) { + // TODO: Use manifest types here when they are defined + onManifestParsed (data: any) { if (!this._emeEnabled) { return; } diff --git a/src/controller/level-controller.js b/src/controller/level-controller.js index 6f661cf9143..5f79f615507 100644 --- a/src/controller/level-controller.js +++ b/src/controller/level-controller.js @@ -120,7 +120,7 @@ export default class LevelController extends EventHandler { // only keep levels with supported audio/video codecs levels = levels.filter(({ audioCodec, videoCodec }) => { - return (!audioCodec || isCodecSupportedInMp4(audioCodec)) && (!videoCodec || isCodecSupportedInMp4(videoCodec)); + return (!audioCodec || isCodecSupportedInMp4(audioCodec, 'audio')) && (!videoCodec || isCodecSupportedInMp4(videoCodec, 'video')); }); if (data.audioTracks) { diff --git a/src/controller/stream-controller.js b/src/controller/stream-controller.js index 8cb25f85bbe..8aaa52e9cd8 100644 --- a/src/controller/stream-controller.js +++ b/src/controller/stream-controller.js @@ -7,7 +7,7 @@ import { BufferHelper } from '../utils/buffer-helper'; import Demuxer from '../demux/demuxer'; import Event from '../events'; import { FragmentState } from './fragment-tracker'; -import Fragment from '../loader/fragment'; +import { ElementaryStreamTypes } from '../loader/fragment'; import PlaylistLoader from '../loader/playlist-loader'; import * as LevelHelper from './level-helper'; import TimeRanges from '../utils/time-ranges'; @@ -982,11 +982,11 @@ class StreamController extends BaseStreamController { } if (data.hasAudio === true) { - frag.addElementaryStream(Fragment.ElementaryStreamTypes.AUDIO); + frag.addElementaryStream(ElementaryStreamTypes.AUDIO); } if (data.hasVideo === true) { - frag.addElementaryStream(Fragment.ElementaryStreamTypes.VIDEO); + frag.addElementaryStream(ElementaryStreamTypes.VIDEO); } logger.log(`Parsed ${data.type},PTS:[${data.startPTS.toFixed(3)},${data.endPTS.toFixed(3)}],DTS:[${data.startDTS.toFixed(3)}/${data.endDTS.toFixed(3)}],nb:${data.nb},dropped:${data.dropped || 0}`); @@ -1287,7 +1287,7 @@ class StreamController extends BaseStreamController { const media = this.mediaBuffer ? this.mediaBuffer : this.media; if (media) { // filter fragments potentially evicted from buffer. this is to avoid memleak on live streams - this.fragmentTracker.detectEvictedFragments(Fragment.ElementaryStreamTypes.VIDEO, media.buffered); + this.fragmentTracker.detectEvictedFragments(ElementaryStreamTypes.VIDEO, media.buffered); } // move to IDLE once flush complete. this should trigger new fragment loading this.state = State.IDLE; diff --git a/src/demux/adts.js b/src/demux/adts.js index c4d7db5dd61..ccbac365fe5 100644 --- a/src/demux/adts.js +++ b/src/demux/adts.js @@ -1,5 +1,6 @@ /** - * ADTS parser helper + * ADTS parser helper + * @link https://wiki.multimedia.cx/index.php?title=ADTS */ import { logger } from '../utils/logger'; import { ErrorTypes, ErrorDetails } from '../errors'; @@ -160,7 +161,7 @@ export function isHeader (data, offset) { export function probe (data, offset) { // same as isHeader but we also check that ADTS frame follows last ADTS frame // or end of data is reached - if (offset + 1 < data.length && isHeaderPattern(data, offset)) { + if (isHeader(data, offset)) { // ADTS header Length let headerLength = getHeaderLength(data, offset); // ADTS frame Length diff --git a/src/demux/demuxer-inline.js b/src/demux/demuxer-inline.js index 6f5c6b50d4f..d7e214a2614 100644 --- a/src/demux/demuxer-inline.js +++ b/src/demux/demuxer-inline.js @@ -73,7 +73,7 @@ class DemuxerInline { const observer = this.observer; const typeSupported = this.typeSupported; const config = this.config; - // probing order is TS/AAC/MP3/MP4 + // probing order is TS/MP4/AAC/MP3 const muxConfig = [ { demux: TSDemuxer, remux: MP4Remuxer }, { demux: MP4Demuxer, remux: PassThroughRemuxer }, diff --git a/src/hls.js b/src/hls.js index 18b5567b688..8751ec5043d 100644 --- a/src/hls.js +++ b/src/hls.js @@ -408,13 +408,6 @@ export default class Hls extends Observer { return Math.max(this.levelController.firstLevel, this.minAutoLevel); } - /** Return Estimated Bandwidth - **/ - get bandwidthEstimate () { - const bwEstimator = this.abrController._bwEstimator; - return bwEstimator ? bwEstimator.getEstimate() : NaN; - } - /** * Sets "first-level", see getter. * @type {number} @@ -461,6 +454,15 @@ export default class Hls extends Observer { return this._autoLevelCapping; } + /** + * get bandwidth estimate + * @type {number} + */ + get bandwidthEstimate () { + const bwEstimator = this.abrController._bwEstimator; + return bwEstimator ? bwEstimator.getEstimate() : NaN; + } + /** * Capping/max level value that should be used by automatic level selection algorithm (`ABRController`) * @type {number} diff --git a/src/loader/fragment.js b/src/loader/fragment.js deleted file mode 100644 index ef898c50236..00000000000 --- a/src/loader/fragment.js +++ /dev/null @@ -1,150 +0,0 @@ - -import * as URLToolkit from 'url-toolkit'; - -import LevelKey from './level-key'; - -export default class Fragment { - constructor () { - this._url = null; - this._byteRange = null; - this._decryptdata = null; - this.tagList = []; - this.programDateTime = null; - this.rawProgramDateTime = null; - - // Holds the types of data this fragment supports - this._elementaryStreams = { - [Fragment.ElementaryStreamTypes.AUDIO]: false, - [Fragment.ElementaryStreamTypes.VIDEO]: false - }; - } - - /** - * `type` property for this._elementaryStreams - * - * @enum - */ - static get ElementaryStreamTypes () { - return { - AUDIO: 'audio', - VIDEO: 'video' - }; - } - - get url () { - if (!this._url && this.relurl) { - this._url = URLToolkit.buildAbsoluteURL(this.baseurl, this.relurl, { alwaysNormalize: true }); - } - - return this._url; - } - - set url (value) { - this._url = value; - } - - get byteRange () { - if (!this._byteRange && !this.rawByteRange) { - return []; - } - - if (this._byteRange) { - return this._byteRange; - } - - let byteRange = []; - if (this.rawByteRange) { - const params = this.rawByteRange.split('@', 2); - if (params.length === 1) { - const lastByteRangeEndOffset = this.lastByteRangeEndOffset; - byteRange[0] = lastByteRangeEndOffset || 0; - } else { - byteRange[0] = parseInt(params[1]); - } - byteRange[1] = parseInt(params[0]) + byteRange[0]; - this._byteRange = byteRange; - } - return byteRange; - } - - /** - * @type {number} - */ - get byteRangeStartOffset () { - return this.byteRange[0]; - } - - get byteRangeEndOffset () { - return this.byteRange[1]; - } - - get decryptdata () { - if (!this._decryptdata) { - this._decryptdata = this.fragmentDecryptdataFromLevelkey(this.levelkey, this.sn); - } - - return this._decryptdata; - } - - get endProgramDateTime () { - if (!Number.isFinite(this.programDateTime)) { - return null; - } - - let duration = !Number.isFinite(this.duration) ? 0 : this.duration; - - return this.programDateTime + (duration * 1000); - } - - get encrypted () { - return !!((this.decryptdata && this.decryptdata.uri !== null) && (this.decryptdata.key === null)); - } - - /** - * @param {ElementaryStreamType} type - */ - addElementaryStream (type) { - this._elementaryStreams[type] = true; - } - - /** - * @param {ElementaryStreamType} type - */ - hasElementaryStream (type) { - return this._elementaryStreams[type] === true; - } - - /** - * Utility method for parseLevelPlaylist to create an initialization vector for a given segment - * @returns {Uint8Array} - */ - createInitializationVector (segmentNumber) { - let uint8View = new Uint8Array(16); - - for (let i = 12; i < 16; i++) { - uint8View[i] = (segmentNumber >> 8 * (15 - i)) & 0xff; - } - - return uint8View; - } - - /** - * Utility method for parseLevelPlaylist to get a fragment's decryption data from the currently parsed encryption key data - * @param levelkey - a playlist's encryption info - * @param segmentNumber - the fragment's segment number - * @returns {*} - an object to be applied as a fragment's decryptdata - */ - fragmentDecryptdataFromLevelkey (levelkey, segmentNumber) { - let decryptdata = levelkey; - - if (levelkey && levelkey.method && levelkey.uri && !levelkey.iv) { - decryptdata = new LevelKey(); - decryptdata.method = levelkey.method; - decryptdata.baseuri = levelkey.baseuri; - decryptdata.reluri = levelkey.reluri; - decryptdata.iv = this.createInitializationVector(segmentNumber); - } - - return decryptdata; - } -} diff --git a/src/loader/fragment.ts b/src/loader/fragment.ts new file mode 100644 index 00000000000..f32dc2b09b5 --- /dev/null +++ b/src/loader/fragment.ts @@ -0,0 +1,183 @@ + +import { buildAbsoluteURL } from 'url-toolkit'; +import { logger } from '../utils/logger'; +import LevelKey from './level-key'; + +export enum ElementaryStreamTypes { + AUDIO = 'audio', + VIDEO = 'video', +} + +export default class Fragment { + private _url: string | null = null; + private _byteRange: number[] | null = null; + private _decryptdata: LevelKey | null = null; + + // Holds the types of data this fragment supports + private _elementaryStreams: Record = { + [ElementaryStreamTypes.AUDIO]: false, + [ElementaryStreamTypes.VIDEO]: false + }; + + public rawProgramDateTime: string | null = null; + public programDateTime: number | null = null; + public tagList: Array = []; + + // TODO: Move at least baseurl to constructor. + // Currently we do a two-pass construction as use the Fragment class almost like a object for holding parsing state. + // It may make more sense to just use a POJO to keep state during the parsing phase. + // Have Fragment be the representation once we have a known state? + // Something to think on. + + // relurl is the portion of the URL that comes from inside the playlist. + public relurl!: string; + // baseurl is the URL to the playlist + public baseurl!: string; + // EXTINF has to be present for a m3u8 to be considered valid + public duration!: number; + // sn notates the sequence number for a segment, and if set to a string can be 'initSegment' + public sn: number | 'initSegment' = 0; + // levelkey is the EXT-X-KEY that applies to this segment for decryption + // core difference from the private field _decryptdata is the lack of the initialized IV + // _decryptdata will set the IV for this segment based on the segment number in the fragment + public levelkey?: LevelKey; + + // setByteRange converts a EXT-X-BYTERANGE attribute into a two element array + setByteRange (value: string, previousFrag?: Fragment) { + const params = value.split('@', 2); + const byteRange: number[] = []; + if (params.length === 1) { + byteRange[0] = previousFrag ? previousFrag.byteRangeEndOffset : 0; + } else { + byteRange[0] = parseInt(params[1]); + } + byteRange[1] = parseInt(params[0]) + byteRange[0]; + this._byteRange = byteRange; + } + + get url () { + if (!this._url && this.relurl) { + this._url = buildAbsoluteURL(this.baseurl, this.relurl, { alwaysNormalize: true }); + } + + return this._url; + } + + set url (value) { + this._url = value; + } + + get byteRange (): number[] { + if (!this._byteRange) { + return []; + } + + return this._byteRange; + } + + /** + * @type {number} + */ + get byteRangeStartOffset () { + return this.byteRange[0]; + } + + get byteRangeEndOffset () { + return this.byteRange[1]; + } + + get decryptdata (): LevelKey | null { + if (!this.levelkey && !this._decryptdata) { + return null; + } + + if (!this._decryptdata && this.levelkey) { + let sn = this.sn; + if (typeof sn !== 'number') { + // We are fetching decryption data for a initialization segment + // If the segment was encrypted with AES-128 + // It must have an IV defined. We cannot substitute the Segment Number in. + if (this.levelkey && this.levelkey.method === 'AES-128' && !this.levelkey.iv) { + logger.warn(`missing IV for initialization segment with method="${this.levelkey.method}" - compliance issue`); + } + + /* + Be converted to a Number. + 'initSegment' will become NaN. + NaN, which when converted through ToInt32() -> +0. + --- + Explicitly set sn to resulting value from implicit conversions 'initSegment' values for IV generation. + */ + sn = 0; + } + this._decryptdata = this.setDecryptDataFromLevelKey(this.levelkey, sn); + } + + return this._decryptdata; + } + + get endProgramDateTime () { + if (this.programDateTime === null) { + return null; + } + + if (!Number.isFinite(this.programDateTime)) { + return null; + } + + let duration = !Number.isFinite(this.duration) ? 0 : this.duration; + + return this.programDateTime + (duration * 1000); + } + + get encrypted () { + return !!((this.decryptdata && this.decryptdata.uri !== null) && (this.decryptdata.key === null)); + } + + /** + * @param {ElementaryStreamTypes} type + */ + addElementaryStream (type: ElementaryStreamTypes) { + this._elementaryStreams[type] = true; + } + + /** + * @param {ElementaryStreamTypes} type + */ + hasElementaryStream (type: ElementaryStreamTypes) { + return this._elementaryStreams[type] === true; + } + + /** + * Utility method for parseLevelPlaylist to create an initialization vector for a given segment + * @param {number} segmentNumber - segment number to generate IV with + * @returns {Uint8Array} + */ + createInitializationVector (segmentNumber: number): Uint8Array { + let uint8View = new Uint8Array(16); + + for (let i = 12; i < 16; i++) { + uint8View[i] = (segmentNumber >> 8 * (15 - i)) & 0xff; + } + + return uint8View; + } + + /** + * Utility method for parseLevelPlaylist to get a fragment's decryption data from the currently parsed encryption key data + * @param levelkey - a playlist's encryption info + * @param segmentNumber - the fragment's segment number + * @returns {LevelKey} - an object to be applied as a fragment's decryptdata + */ + setDecryptDataFromLevelKey (levelkey: LevelKey, segmentNumber: number): LevelKey { + let decryptdata = levelkey; + + if (levelkey && levelkey.method && levelkey.uri && !levelkey.iv) { + decryptdata = new LevelKey(levelkey.baseuri, levelkey.reluri); + decryptdata.method = levelkey.method; + decryptdata.iv = this.createInitializationVector(segmentNumber); + } + + return decryptdata; + } +} diff --git a/src/loader/level-key.js b/src/loader/level-key.js deleted file mode 100644 index 94238f627f1..00000000000 --- a/src/loader/level-key.js +++ /dev/null @@ -1,18 +0,0 @@ -import * as URLToolkit from 'url-toolkit'; - -export default class LevelKey { - constructor () { - this.method = null; - this.key = null; - this.iv = null; - this._uri = null; - } - - get uri () { - if (!this._uri && this.reluri) { - this._uri = URLToolkit.buildAbsoluteURL(this.baseuri, this.reluri, { alwaysNormalize: true }); - } - - return this._uri; - } -} diff --git a/src/loader/level-key.ts b/src/loader/level-key.ts new file mode 100644 index 00000000000..f5abc95e79e --- /dev/null +++ b/src/loader/level-key.ts @@ -0,0 +1,24 @@ +import { buildAbsoluteURL } from 'url-toolkit'; + +export default class LevelKey { + private _uri: string | null = null; + + public baseuri: string; + public reluri: string; + public method: string | null = null; + public key: Uint8Array | null = null; + public iv: Uint8Array | null = null; + + constructor (baseURI: string, relativeURI: string) { + this.baseuri = baseURI; + this.reluri = relativeURI; + } + + get uri () { + if (!this._uri && this.reluri) { + this._uri = buildAbsoluteURL(this.baseuri, this.reluri, { alwaysNormalize: true }); + } + + return this._uri; + } +} diff --git a/src/loader/m3u8-parser.js b/src/loader/m3u8-parser.js index 55849729851..5d69f35a6ac 100644 --- a/src/loader/m3u8-parser.js +++ b/src/loader/m3u8-parser.js @@ -48,7 +48,8 @@ export default class M3U8Parser { } static convertAVC1ToAVCOTI (codec) { - let result, avcdata = codec.split('.'); + let avcdata = codec.split('.'); + let result; if (avcdata.length > 2) { result = avcdata.shift() + '.'; result += parseInt(avcdata.shift()).toString(16); @@ -64,7 +65,7 @@ export default class M3U8Parser { } static parseMasterPlaylist (string, baseurl) { - let levels = [], result; + let levels = []; MASTER_PLAYLIST_REGEX.lastIndex = 0; function setCodecs (codecs, level) { @@ -84,6 +85,7 @@ export default class M3U8Parser { level.unknownCodecs = codecs; } + let result; while ((result = MASTER_PLAYLIST_REGEX.exec(string)) != null) { const level = {}; @@ -190,12 +192,11 @@ export default class M3U8Parser { frag = new Fragment(); } } else if (result[4]) { // X-BYTERANGE - frag.rawByteRange = (' ' + result[4]).slice(1); + const data = (' ' + result[4]).slice(1); if (prevFrag) { - const lastByteRangeEndOffset = prevFrag.byteRangeEndOffset; - if (lastByteRangeEndOffset) { - frag.lastByteRangeEndOffset = lastByteRangeEndOffset; - } + frag.setByteRange(data, prevFrag); + } else { + frag.setByteRange(data); } } else if (result[5]) { // PROGRAM-DATE-TIME // avoid sliced strings https://github.com/video-dev/hls.js/issues/939 @@ -207,7 +208,7 @@ export default class M3U8Parser { } else { result = result[0].match(LEVEL_PLAYLIST_REGEX_SLOW); for (i = 1; i < result.length; i++) { - if (result[i] !== undefined) { + if (typeof result[i] !== 'undefined') { break; } } @@ -244,13 +245,14 @@ export default class M3U8Parser { case 'DISCONTINUITY-SEQ': cc = parseInt(value1); break; - case 'KEY': + case 'KEY': { // https://tools.ietf.org/html/draft-pantos-http-live-streaming-08#section-3.4.4 - var decryptparams = value1; - var keyAttrs = new AttrList(decryptparams); - var decryptmethod = keyAttrs.enumeratedString('METHOD'), - decrypturi = keyAttrs.URI, - decryptiv = keyAttrs.hexadecimalInteger('IV'); + const decryptparams = value1; + const keyAttrs = new AttrList(decryptparams); + const decryptmethod = keyAttrs.enumeratedString('METHOD'); + const decrypturi = keyAttrs.URI; + const decryptiv = keyAttrs.hexadecimalInteger('IV'); + if (decryptmethod) { levelkey = new LevelKey(); if ((decrypturi) && (['AES-128', 'SAMPLE-AES', 'SAMPLE-AES-CENC'].indexOf(decryptmethod) >= 0)) { @@ -264,20 +266,22 @@ export default class M3U8Parser { } } break; - case 'START': - let startParams = value1; - let startAttrs = new AttrList(startParams); - let startTimeOffset = startAttrs.decimalFloatingPoint('TIME-OFFSET'); + } + case 'START': { + const startAttrs = new AttrList(value1); + const startTimeOffset = startAttrs.decimalFloatingPoint('TIME-OFFSET'); // TIME-OFFSET can be 0 if (Number.isFinite(startTimeOffset)) { level.startTimeOffset = startTimeOffset; } - break; - case 'MAP': - let mapAttrs = new AttrList(value1); + } + case 'MAP': { + const mapAttrs = new AttrList(value1); frag.relurl = mapAttrs.URI; - frag.rawByteRange = mapAttrs.BYTERANGE; + if (mapAttrs.BYTERANGE) { + frag.setByteRange(mapAttrs.BYTERANGE); + } frag.baseurl = baseurl; frag.level = id; frag.type = type; @@ -286,6 +290,7 @@ export default class M3U8Parser { frag = new Fragment(); frag.rawProgramDateTime = level.initSegment.rawProgramDateTime; break; + } default: logger.warn(`line parsed but not handled: ${result}`); break; diff --git a/src/loader/playlist-loader.js b/src/loader/playlist-loader.js index f237bfb5108..b41ba9881fa 100644 --- a/src/loader/playlist-loader.js +++ b/src/loader/playlist-loader.js @@ -420,10 +420,10 @@ class PlaylistLoader extends EventHandler { const frag = levelDetails.fragments[index]; if (frag.byteRange.length === 0) { - frag.rawByteRange = String(1 + segRefInfo.end - segRefInfo.start) + '@' + String(segRefInfo.start); + frag.setByteRange(String(1 + segRefInfo.end - segRefInfo.start) + '@' + String(segRefInfo.start)); } }); - levelDetails.initSegment.rawByteRange = String(sidxInfo.moovEndOffset) + '@0'; + levelDetails.initSegment.setByteRange(String(sidxInfo.moovEndOffset) + '@0'); } _handleManifestParsingError (response, context, reason, networkDetails) { diff --git a/src/types/segment.ts b/src/types/segment.ts new file mode 100644 index 00000000000..e4633220cbd --- /dev/null +++ b/src/types/segment.ts @@ -0,0 +1,6 @@ +export interface Segment { + type: string; + data: ArrayBuffer; + parent: string; + content: string; +} diff --git a/src/types/track.ts b/src/types/track.ts new file mode 100644 index 00000000000..324ccbc7229 --- /dev/null +++ b/src/types/track.ts @@ -0,0 +1,20 @@ +export interface TrackSet { + audio?: AudioTrack + video?: VideoTrack +} + +export interface AudioTrack { + buffer: SourceBuffer; + container: string; + codec: string; + initSegment?: Uint8Array; + levelCodec: string; +} + +export interface VideoTrack { + buffer: SourceBuffer; + container: string; + codec: string; + initSegment?: Uint8Array; + levelCodec: string; +} diff --git a/src/utils/ewma-bandwidth-estimator.js b/src/utils/ewma-bandwidth-estimator.js index 0f20f16e50a..0f350758a86 100644 --- a/src/utils/ewma-bandwidth-estimator.js +++ b/src/utils/ewma-bandwidth-estimator.js @@ -20,12 +20,13 @@ class EwmaBandWidthEstimator { sample (durationMs, numBytes) { durationMs = Math.max(durationMs, this.minDelayMs_); - let bandwidth = 8000 * numBytes / durationMs, - // console.log('instant bw:'+ Math.round(bandwidth)); - // we weight sample using loading duration.... - weight = durationMs / 1000; - this.fast_.sample(weight, bandwidth); - this.slow_.sample(weight, bandwidth); + let numBits = 8 * numBytes, + // weight is duration in seconds + durationS = durationMs / 1000, + // value is bandwidth in bits/s + bandwidthInBps = numBits / durationS; + this.fast_.sample(durationS, bandwidthInBps); + this.slow_.sample(durationS, bandwidthInBps); } canEstimate () { diff --git a/src/utils/logger.js b/src/utils/logger.js index a9a041d1f04..83542df366b 100644 --- a/src/utils/logger.js +++ b/src/utils/logger.js @@ -1,6 +1,6 @@ import { getSelfScope } from './get-self-scope'; -function noop () {} +function noop (...args) {} const fakeLogger = { trace: noop, @@ -50,7 +50,8 @@ function exportLoggerFunctions (debugConfig, ...functions) { } export var enableLogs = function (debugConfig) { - if (debugConfig === true || typeof debugConfig === 'object') { + // check that console is available + if ((global.console && debugConfig === true) || typeof debugConfig === 'object') { exportLoggerFunctions(debugConfig, // Remove out from list here to hard-disable a log-level // 'trace', diff --git a/tests/.eslintrc.js b/tests/.eslintrc.js index 1b5c5f9324b..22c98596268 100644 --- a/tests/.eslintrc.js +++ b/tests/.eslintrc.js @@ -5,19 +5,22 @@ module.exports = { "es6": true, "mocha": true }, - "globals": { - // Test globals - "after": false, - "afterEach": false, - "assert": false, - "before": false, - "beforeEach": false, - "describe": false, - "expect": true, - "sinon": false, - "xit": false + "plugins": [ "mocha" ], + "globals": { + // Test globals + "after": false, + "afterEach": false, + "assert": false, + "before": false, + "beforeEach": false, + "describe": false, + "expect": true, + "sinon": false, + "xit": false }, - "rules": { - "no-unused-expressions": 0 - } + "rules": { + "no-unused-expressions": 0, + "no-restricted-modules": ["error", "assert"], + "mocha/no-mocha-arrows": 2 + } }; diff --git a/tests/functional/auto/setup.js b/tests/functional/auto/setup.js index ef01d104f34..511620edbbe 100644 --- a/tests/functional/auto/setup.js +++ b/tests/functional/auto/setup.js @@ -3,12 +3,12 @@ const webdriver = require('selenium-webdriver'); const chromedriver = require('chromedriver'); const HttpServer = require('http-server'); const streams = require('../../test-streams'); - const browserConfig = { version: 'latest' }; const onTravis = !!process.env.TRAVIS; +const chai = require('chai'); +const expect = chai.expect; let browserDescription; - let stream; // Setup browser config data from env vars diff --git a/tests/test-streams.js b/tests/test-streams.js index ca345fc1ccc..81f58d8ff99 100644 --- a/tests/test-streams.js +++ b/tests/test-streams.js @@ -172,10 +172,6 @@ module.exports = { url: 'https://playertest.longtailvideo.com/adaptive/aviion/manifest.m3u8', description: 'One PDT, no discontinuities' }, - differentPTSDTSWithSmallSubsequentSegment: { - url: 'https://9secfail-tepnrytnng.now.sh/index.m3u8', - description: 'Audio/video has different PTS; the following segment is very small (0.04s) and tests buffer intersection' - }, noTrackIntersection: { url: 'https://s3.amazonaws.com/bob.jwplayer.com/%7Ealex/123633/new_master.m3u8', description: 'Audio/video track PTS values do not intersect; 10 second start gap' diff --git a/tests/unit/controller/abr-controller.js b/tests/unit/controller/abr-controller.js index 8da6c5f2247..98196099bc4 100644 --- a/tests/unit/controller/abr-controller.js +++ b/tests/unit/controller/abr-controller.js @@ -3,6 +3,11 @@ import EwmaBandWidthEstimator from '../../../src/utils/ewma-bandwidth-estimator' import Hls from '../../../src/hls'; describe('AbrController', function () { + it('should return null if _bwEstimator is not specified', function () { + let hls = new Hls(); + expect(hls.abrController._bwEstimator).to.be.null; + }); + it('should return correct next auto level', function () { let hls = new Hls({ maxStarvationDelay: 4 }); hls.levelController._levels = [ diff --git a/tests/unit/controller/audio-track-controller.js b/tests/unit/controller/audio-track-controller.js index 6ca5b5ff409..6ecae5db444 100644 --- a/tests/unit/controller/audio-track-controller.js +++ b/tests/unit/controller/audio-track-controller.js @@ -55,7 +55,7 @@ describe('AudioTrackController', function () { }); describe('onManifestParsed', function () { - it('should set the audioTracks contained in the event data and trigger AUDIO_TRACKS_UPDATED', (done) => { + it('should set the audioTracks contained in the event data and trigger AUDIO_TRACKS_UPDATED', function (done) { hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, (event, data) => { expect(data.audioTracks).to.equal(tracks); expect(audioTrackController.tracks).to.equal(tracks); @@ -67,7 +67,7 @@ describe('AudioTrackController', function () { }); }); - it('should set the audioTracks contained in the event data (nullable) to an empty array and trigger AUDIO_TRACKS_UPDATED', (done) => { + it('should set the audioTracks contained in the event data (nullable) to an empty array and trigger AUDIO_TRACKS_UPDATED', function (done) { hls.on(Hls.Events.AUDIO_TRACKS_UPDATED, (event, data) => { expect(data.audioTracks).to.be.empty; expect(audioTrackController.tracks).to.be.empty; @@ -80,13 +80,13 @@ describe('AudioTrackController', function () { }); }); - describe('_needsTrackLoading', () => { + describe('_needsTrackLoading', function () { it('should not need loading because the audioTrack is embedded in the main playlist', function () { expect(audioTrackController._needsTrackLoading({ details: { live: true } })).to.be.false; expect(audioTrackController._needsTrackLoading({ details: null })).to.be.false; }); - it('should need loading because the track has not been loaded yet', () => { + it('should need loading because the track has not been loaded yet', function () { expect(audioTrackController._needsTrackLoading({ details: { live: true }, url: 'http://example.com/manifest.m3u8' })).to.be.true; expect(audioTrackController._needsTrackLoading({ details: null, url: 'http://example.com/manifest.m3u8' })).to.be.true; }); @@ -141,7 +141,7 @@ describe('AudioTrackController', function () { }); describe('onLevelLoaded', function () { - it('should reselect the current track and trigger AUDIO_TRACK_SWITCHING eventually', (done) => { + it('should reselect the current track and trigger AUDIO_TRACK_SWITCHING eventually', function (done) { hls.on(Hls.Events.AUDIO_TRACK_SWITCHING, (event, data) => { done(); }); @@ -237,7 +237,7 @@ describe('AudioTrackController', function () { expect(audioTrackLoadingCallback).to.not.have.been.called; }); - it('should load audio tracks with a url', () => { + it('should load audio tracks with a url', function () { const needsTrackLoading = sinon.spy(audioTrackController, '_needsTrackLoading'); const audioTrackLoadingCallback = sinon.spy(); const trackWithUrl = { @@ -270,7 +270,7 @@ describe('AudioTrackController', function () { expect(audioTrackLoadingCallback).to.have.been.calledOnce; }); - it('should not attempt to load audio tracks without a url', () => { + it('should not attempt to load audio tracks without a url', function () { const needsTrackLoading = sinon.spy(audioTrackController, '_needsTrackLoading'); const audioTrackLoadingCallback = sinon.spy(); const trackWithOutUrl = tracks[0]; diff --git a/tests/unit/controller/buffer-controller.js b/tests/unit/controller/buffer-controller.js index 815d7bcdc67..f5b55e5ca23 100644 --- a/tests/unit/controller/buffer-controller.js +++ b/tests/unit/controller/buffer-controller.js @@ -88,7 +88,7 @@ describe('BufferController tests', function () { mockMedia.currentTime = 15; bufferController.flushLiveBackBuffer(); expect(removeStub).to.have.been.calledOnce; - expect(bufferController.flushBufferCounter).to.be.undefined; + expect(bufferController.flushBufferCounter).to.equal(0); expect(removeStub).to.have.been.calledWith('video', mockSourceBuffer.video, 0, 5); }); @@ -106,12 +106,12 @@ describe('BufferController tests', function () { sandbox.stub(bufferController, 'doAppending'); - bufferController.onSBUpdateEnd(); + bufferController._onSBUpdateEnd(); expect(flushSpy).to.not.have.been.called; bufferController.segments = []; - bufferController.onSBUpdateEnd(); + bufferController._onSBUpdateEnd(); expect(flushSpy).to.have.been.calledOnce; }); @@ -130,6 +130,32 @@ describe('BufferController tests', function () { expect(bufferController.bufferCodecEventsExpected).to.equal(0); }); + it('should throw if no media element has been attached', function () { + bufferController.createSourceBuffers.restore(); + bufferController.pendingTracks = { video: {} }; + + expect(bufferController.checkPendingTracks).to.throw(); + }); + + it('exposes tracks from buffer controller through BUFFER_CREATED event', function (done) { + bufferController.createSourceBuffers.restore(); + + let video = document.createElement('video'); + bufferController.onMediaAttaching({ media: video }); + + hls.on(Hls.Events.BUFFER_CREATED, (_, data) => { + const tracks = data.tracks; + expect(bufferController.pendingTracks).to.not.equal(tracks); + expect(bufferController.tracks).to.equal(tracks); + done(); + }); + + bufferController.pendingTracks = { video: { codec: 'testing' } }; + bufferController.checkPendingTracks(); + + video = null; + }); + it('expects one bufferCodec event by default', function () { bufferController.onManifestParsed({}); expect(bufferController.bufferCodecEventsExpected).to.equal(1); @@ -165,7 +191,7 @@ describe('BufferController tests', function () { }); it('checks pending tracks in onMediaSourceOpen', function () { - bufferController.onMediaSourceOpen(); + bufferController._onMediaSourceOpen(); expect(checkPendingTracksSpy).to.have.been.calledOnce; }); @@ -188,7 +214,7 @@ describe('BufferController tests', function () { bufferController.mediaSource = { readyState: 'open', removeEventListener: sandbox.stub() }; bufferController.onManifestParsed({ altAudio: true }); - bufferController.onMediaSourceOpen(); + bufferController._onMediaSourceOpen(); bufferController.onBufferCodecs({ audio: {} }); bufferController.onBufferCodecs({ video: {} }); diff --git a/tests/unit/controller/eme-controller.js b/tests/unit/controller/eme-controller.js index d5dd7482486..abbd3550b80 100644 --- a/tests/unit/controller/eme-controller.js +++ b/tests/unit/controller/eme-controller.js @@ -49,7 +49,7 @@ describe('EMEController', function () { expect(reqMediaKsAccessSpy.callCount).to.equal(0); }); - it('should request keys when `emeEnabled` is true (but not set them)', (done) => { + it('should request keys when `emeEnabled` is true (but not set them)', function (done) { let reqMediaKsAccessSpy = sinon.spy(function () { return Promise.resolve({ // Media-keys mock @@ -75,7 +75,7 @@ describe('EMEController', function () { }, 0); }); - it('should trigger key system error when bad encrypted data is received', (done) => { + it('should trigger key system error when bad encrypted data is received', function (done) { let reqMediaKsAccessSpy = sinon.spy(function () { return Promise.resolve({ // Media-keys mock diff --git a/tests/unit/controller/stream-controller.js b/tests/unit/controller/stream-controller.js index f614e67e7e7..3df11e27ca1 100644 --- a/tests/unit/controller/stream-controller.js +++ b/tests/unit/controller/stream-controller.js @@ -58,7 +58,7 @@ describe('StreamController', function () { expect(spy.called).to.be.false; }); - it('should not start when controller have not levels data', function () { + it('should not start when controller does not have level data', function () { streamController.startLoad(1); assertStreamControllerStopped(streamController); }); @@ -207,9 +207,6 @@ describe('StreamController', function () { }; streamController.media = { buffered: { - start: function () { - return 6.014; - }, length: 1 } }; @@ -275,13 +272,13 @@ describe('StreamController', function () { streamController.levels = []; streamController.media = null; }); - it('should not start when controller have not levels data', function () { + it('should not start when controller does not have level data', function () { streamController.levels = null; streamController.startLoad(); assertStreamControllerStopped(streamController); }); - it('should start when controller have levels data', function () { + it('should start when controller has level data', function () { streamController.startLoad(5); assertStreamControllerStarted(streamController); expect(streamController.nextLoadPosition).to.equal(5); @@ -306,17 +303,6 @@ describe('StreamController', function () { expect(streamController.level).to.equal(0); expect(streamController.bitrateTest).to.be.true; }); - - it('should not signal a bandwidth test if config.testBandwidth is false', function () { - streamController.startFragRequested = false; - hls.startLevel = -1; - hls.nextAutoLevel = 3; - hls.config.testBandwidth = false; - - streamController.startLoad(); - expect(streamController.level).to.equal(hls.nextAutoLevel); - expect(streamController.bitrateTest).to.be.false; - }); }); }); }); diff --git a/tests/unit/demuxer/adts.js b/tests/unit/demuxer/adts.js new file mode 100644 index 00000000000..f72ffb8f4eb --- /dev/null +++ b/tests/unit/demuxer/adts.js @@ -0,0 +1,415 @@ +import { + getAudioConfig, isHeaderPattern, getHeaderLength, getFullFrameLength, isHeader, probe, + initTrackConfig, getFrameDuration, parseFrameHeader, appendFrame +} from '../../../src/demux/adts'; +import { ErrorTypes } from '../../../src/errors'; + +const sinon = require('sinon'); + +describe('getAudioConfig', function () { + it('should trigger a MEDIA_ERROR event if sample index is invalid', function () { + const observer = { + trigger: sinon.spy() + }; + const data = new Uint8Array(new ArrayBuffer(4)); + data[0] = 0xff; + data[1] = 0xf0; // ID = 0 (MPEG-4), layer = 00, protection_absent = 0 + data[2] = 0x34; // sampling_frequency_index = 14, which is a reserved value + + expect(getAudioConfig(observer, data, 0, 'mp4a.40.29')).to.not.exist; + expect(observer.trigger).to.have.been.calledOnce; + expect(observer.trigger.args[0][1].type).to.equal(ErrorTypes.MEDIA_ERROR); + }); + + it('should return audio config for firefox if the specified sampling frequency > 24kHz', function () { + const observer = { + trigger: sinon.stub(navigator, 'userAgent').get(() => 'firefox') + }; + const data = new Uint8Array(new ArrayBuffer(4)); + data[0] = 0xff; + data[1] = 0xf0; // ID = 0 (MPEG-4), layer = 00, protection_absent = 0 + data[2] = 0x00; // sampling_frequency_index = 0 + + expect(getAudioConfig(observer, data, 0, 'mp4a.40.29')).to.deep.equal({ + config: [16, 0], + samplerate: 96000, + channelCount: 0, + codec: 'mp4a.40.2', + manifestCodec: 'mp4a.40.29' + }); + }); + + it('should return audio config with a different extension sampling index for Firefox if sampling freq is low', function () { + const observer = { + trigger: sinon.stub(navigator, 'userAgent').get(() => 'Firefox') + }; + const data = new Uint8Array(new ArrayBuffer(4)); + data[0] = 0xff; + data[1] = 0xf0; // ID = 0 (MPEG-4), layer = 00, protection_absent = 0 + data[2] = 0x28; // sampling_frequency_index = 10 + + expect(getAudioConfig(observer, data, 0, 'mp4a.40.29')).to.deep.equal({ + config: [45, 3, 136, 0], + samplerate: 11025, + channelCount: 0, + codec: 'mp4a.40.5', + manifestCodec: 'mp4a.40.29' + }); + }); + + it('should return audio config for Android', function () { + const observer = { + trigger: sinon.stub(navigator, 'userAgent').get(() => 'Android') + }; + const data = new Uint8Array(new ArrayBuffer(4)); + data[0] = 0xff; + data[1] = 0xf0; // ID = 0 (MPEG-4), layer = 00, protection_absent = 0 + data[2] = 0x28; // sampling_frequency_index = 10 + + expect(getAudioConfig(observer, data, 0, 'mp4a.40.29')).to.deep.equal({ + config: [21, 0], + samplerate: 11025, + channelCount: 0, + codec: 'mp4a.40.2', + manifestCodec: 'mp4a.40.29' + }); + }); + + it('should return audio config for Chrome', function () { + const observer = { + trigger: sinon.stub(navigator, 'userAgent').get(() => 'Chrome') + }; + const data = new Uint8Array(new ArrayBuffer(4)); + data[0] = 0xff; + data[1] = 0xf0; // ID = 0 (MPEG-4), layer = 00, protection_absent = 0 + data[2] = 0x28; // sampling_frequency_index = 10 + + expect(getAudioConfig(observer, data, 0, 'mp4a.40.29')).to.deep.equal({ + config: [45, 3, 136, 0], + samplerate: 11025, + channelCount: 0, + codec: 'mp4a.40.5', + manifestCodec: 'mp4a.40.29' + }); + }); + + it('should return audio config for Chrome if there is no audio codec', function () { + const observer = { + trigger: sinon.stub(navigator, 'userAgent').get(() => 'Chrome') + }; + const data = new Uint8Array(new ArrayBuffer(4)); + data[0] = 0xff; + data[1] = 0xf0; // ID = 0 (MPEG-4), layer = 00, protection_absent = 0 + data[2] = 0x28; // sampling_frequency_index = 10 + + expect(getAudioConfig(observer, data, 0)).to.deep.equal({ + config: [45, 3, 136, 0], + samplerate: 11025, + channelCount: 0, + codec: 'mp4a.40.5', + manifestCodec: undefined + }); + }); + + it('should return audio config for Chrome if there is no audio codec and freq is high enough', function () { + const observer = { + trigger: sinon.stub(navigator, 'userAgent').get(() => 'Chrome') + }; + const data = new Uint8Array(new ArrayBuffer(4)); + data[0] = 0xff; + data[1] = 0xf0; // ID = 0 (MPEG-4), layer = 00, protection_absent = 0 + data[2] = 0x08; // sampling_frequency_index = 2 + + expect(getAudioConfig(observer, data, 0)).to.deep.equal({ + config: [41, 1, 8, 0], + samplerate: 64000, + channelCount: 0, + codec: 'mp4a.40.5', + manifestCodec: undefined + }); + }); + + it('should return audio config for Chrome if audio codec is "mp4a.40.5"', function () { + const observer = { + trigger: sinon.stub(navigator, 'userAgent').get(() => 'Chrome') + }; + const data = new Uint8Array(new ArrayBuffer(4)); + data[0] = 0xff; + data[1] = 0xf0; // ID = 0 (MPEG-4), layer = 00, protection_absent = 0 + data[2] = 0x28; // sampling_frequency_index = 10 + + expect(getAudioConfig(observer, data, 0, 'mp4a.40.5')).to.deep.equal({ + config: [45, 3, 136, 0], + samplerate: 11025, + channelCount: 0, + codec: 'mp4a.40.5', + manifestCodec: 'mp4a.40.5' + }); + }); + + it('should return audio config for Chrome if audio codec is "mp4a.40.2"', function () { + const observer = { + trigger: sinon.stub(navigator, 'userAgent').get(() => 'Chrome') + }; + const data = new Uint8Array(new ArrayBuffer(4)); + data[0] = 0xff; + data[1] = 0xf0; // ID = 0 (MPEG-4), layer = 00, protection_absent = 0 + data[2] = 0x28; // sampling_frequency_index = 10 + data[3] = 0x40; // channel = 1 + + expect(getAudioConfig(observer, data, 0, 'mp4a.40.2')).to.deep.equal({ + config: [21, 8], + samplerate: 11025, + channelCount: 1, + codec: 'mp4a.40.2', + manifestCodec: 'mp4a.40.2' + }); + }); + + it('should return audio config for Vivaldi', function () { + const observer = { + trigger: sinon.stub(navigator, 'userAgent').get(() => 'Vivaldi') + }; + const data = new Uint8Array(new ArrayBuffer(4)); + data[0] = 0xff; + data[1] = 0xf0; // ID = 0 (MPEG-4), layer = 00, protection_absent = 0 + data[2] = 0x08; // sampling_frequency_index = 2 + + expect(getAudioConfig(observer, data, 0, 'mp4a.40.2')).to.deep.equal({ + config: [17, 0], + samplerate: 64000, + channelCount: 0, + codec: 'mp4a.40.2', + manifestCodec: 'mp4a.40.2' + }); + }); +}); + +describe('isHeaderPattern', function () { + it('should return true if the specified data slot is of header pattern', function () { + const data = new Uint8Array(new ArrayBuffer(16)); + data[0] = 0xff; + data[1] = 0xf0; // ID = 0 (MPEG-4), layer = 00, protection_absent = 0 + data[14] = 0xff; + data[15] = 0xf9; // ID = 1 (MPEG-2), layer = 00, protection_absent = 1 + expect(isHeaderPattern(data, 0)).to.be.true; + expect(isHeaderPattern(data, 14)).to.be.true; + }); + + it('should return false if the specific data is not of header pattern', function () { + const data = new Uint8Array(new ArrayBuffer(4)); + data[1] = 0xff; + data[2] = 0xff; + expect(isHeaderPattern(data, 0)).to.be.false; + expect(isHeaderPattern(data, 2)).to.be.false; + }); +}); + +describe('getHeaderLength', function () { + it('should return 7 if there is no CRC', function () { + const data = new Uint8Array(new ArrayBuffer(2)); + data[0] = 0xff; + data[1] = 0xf9; // ID = 1 (MPEG-2), layer = 00, protection_absent = 1 + expect(getHeaderLength(data, 0)).to.equal(7); + }); + + it('should return 9 if there is CRC', function () { + const data = new Uint8Array(new ArrayBuffer(2)); + data[0] = 0xff; + data[1] = 0xf0; // ID = 0 (MPEG-4), layer = 00, protection_absent = 0 + expect(getHeaderLength(data, 0)).to.equal(9); + }); +}); + +describe('getFullFrameLength', function () { + it('should extract frame_length field and return its value', function () { + const data = new Uint8Array(new ArrayBuffer(8)); + data[0] = 0xff; + data[1] = 0xf9; + data[2] = 0x00; + data[3] = 0x02; // the last 2 bits belong to frame_length + data[4] = 0x00; // all 8 bits belong to frame_length + data[5] = 0xE0; // the first 3 bits belong to frame_length + expect(getFullFrameLength(data, 0)).to.equal(4103); + }); +}); + +describe('isHeader', function () { + it('should return true if there are enough data and it is of header pattern', function () { + const data = new Uint8Array(new ArrayBuffer(8)); + data[0] = 0xff; + data[1] = 0xf9; + expect(isHeader(data, 0)).to.be.true; + }); + + it('should return false if there are not enough data', function () { + const data = new Uint8Array(new ArrayBuffer(1)); + expect(isHeader(data, 0)).to.be.false; + }); + + it('should return false if it is not of header pattern', function () { + const data = new Uint8Array(new ArrayBuffer(8)); + expect(isHeader(data, 0)).to.be.false; + }); +}); + +describe('probe', function () { + it('should return false if `isHeader` fails', function () { + const data = new Uint8Array(new ArrayBuffer(8)); + expect(probe(data, 0)).to.be.false; + }); + + it('should return true if it contains the entire ADTS frame', function () { + const data = new Uint8Array(new ArrayBuffer(16)); + data[0] = 0xff; + data[1] = 0xf0; // protection_absent = 0 + data[4] = 0x02; // frame_length is 16 + expect(probe(data, 0)).to.be.true; + }); + + it('should return true if it contains an valid following frame header', function () { + const data = new Uint8Array(new ArrayBuffer(18)); + data[0] = 0xff; + data[1] = 0xf0; // protection_absent = 0 + data[4] = 0x02; // frame_length is 16 + data[16] = 0xff; + data[17] = 0xf0; + console.log('hahah'); + expect(probe(data, 0)).to.be.true; + }); + + it('should return false if it contains the entire ADTS frame with an incomplete following header', function () { + const data = new Uint8Array(new ArrayBuffer(17)); + data[0] = 0xff; + data[1] = 0xf0; // protection_absent = 0 + data[4] = 0x02; // frame_length is 16 + expect(probe(data, 0)).to.be.false; + }); + + it('should return false if it contains the entire ADTS frame with an invalid following frame header', function () { + const data = new Uint8Array(new ArrayBuffer(18)); + data[0] = 0xff; + data[1] = 0xf0; // protection_absent = 0 + data[4] = 0x02; // frame_length is 16 + expect(probe(data, 0)).to.be.false; + }); + + it('should return false if it does not contain the entire header', function () { + const data = new Uint8Array(new ArrayBuffer(2)); + data[0] = 0xff; + data[1] = 0xf0; // protection_absent = 0 + expect(probe(data, 0)).to.be.false; + }); +}); + +describe('initTrackConfig', function () { + it('should do nothing with track if track.samplerate is defined', function () { + const track = { + samplerate: 64000 + }; + initTrackConfig(track); + + expect(track).to.deep.equal({ + samplerate: 64000 + }); + }); + + it('should call `getAudioConfig` and change track if track.samplerate is undefined', function () { + const track = {}; + const observer = { + trigger: sinon.spy() + }; + const data = new Uint8Array(new ArrayBuffer(4)); + data[0] = 0xff; + data[1] = 0xf0; // ID = 0 (MPEG-4), layer = 00, protection_absent = 0 + data[2] = 0x28; // sampling_frequency_index = 10 + + initTrackConfig(track, observer, data, 0, 'mp4a.40.29'); + + expect(track).to.deep.equal({ + config: [45, 3, 136, 0], + samplerate: 11025, + channelCount: 0, + codec: 'mp4a.40.5', + manifestCodec: 'mp4a.40.29' + }); + }); +}); + +describe('getFrameDuration', function () { + it('should compute frame duration from sample rate', function () { + expect(getFrameDuration(64000)).to.equal(1440); + }); +}); + +describe('parseFrameHeader', function () { + it('should return parsed result if data contains the entire frame', function () { + const data = new Uint8Array(new ArrayBuffer(16)); + data[0] = 0xff; + data[1] = 0xf0; // protection_absent = 0 + data[4] = 0x02; // frame_length is 16 + expect(parseFrameHeader(data, 0, 0, 0, 0)).to.deep.equal({ + headerLength: 9, + frameLength: 7, + stamp: 0 + }); + }); + + it('should return undefined if there is only the header part', function () { + const data = new Uint8Array(new ArrayBuffer(9)); + data[0] = 0xff; + data[1] = 0xf0; // protection_absent = 0 + data[4] = 0x01; + data[5] = 0x40; // frame_length is 9 + expect(parseFrameHeader(data, 0, 0, 0, 0)).to.be.undefined; + }); + + it('should return undefined if data does not contain the entire frame', function () { + const data = new Uint8Array(new ArrayBuffer(12)); + data[0] = 0xff; + data[1] = 0xf0; // protection_absent = 0 + data[4] = 0x02; // frame_length is 16 + expect(parseFrameHeader(data, 0, 0, 0, 0)).to.be.undefined; + }); +}); + +describe('appendFrame', function () { + it('should append the found sample to track and return some useful information', function () { + const track = { + samplerate: 64000, + samples: [], + len: 0 + }; + const data = new Uint8Array(new ArrayBuffer(16)); + data[0] = 0xff; + data[1] = 0xf0; // protection_absent = 0 + data[4] = 0x02; // frame_length is 16 + + expect(appendFrame(track, data, 0, 0, 0)).to.deep.equal({ + sample: { + unit: data.subarray(9, 16), + pts: 0, + dts: 0 + }, + length: 16 + }); + expect(track.samples.length).to.equal(1); + expect(track.len).to.equal(7); + }); + + it('should not append sample if `parseFrameHeader` fails', function () { + const track = { + samplerate: 64000, + samples: [], + len: 0 + }; + const data = new Uint8Array(new ArrayBuffer(12)); + data[0] = 0xff; + data[1] = 0xf0; // protection_absent = 0 + data[4] = 0x02; // frame_length is 16 + + expect(appendFrame(track, data, 0, 0, 0)).to.be.undefined; + expect(track.samples.length).to.equal(0); + expect(track.len).to.equal(0); + }); +}); diff --git a/tests/unit/demuxer/demuxer.js b/tests/unit/demuxer/demuxer.js index c9a02ed3113..0a5a348cb3c 100644 --- a/tests/unit/demuxer/demuxer.js +++ b/tests/unit/demuxer/demuxer.js @@ -88,9 +88,7 @@ describe('Demuxer tests', function () { cc: 100, sn: 6, level: 1, - startDTS: 1000, - startPTS: 1000, - start: undefined + startPTS: 1000 }; let data = new ArrayBuffer(8), initSegment = {}, @@ -107,7 +105,7 @@ describe('Demuxer tests', function () { expect(obj1.initSegment).to.equal(initSegment, 'initSegment'); expect(obj1.audioCodec).to.equal(audioCodec, 'audioCodec'); expect(obj1.videoCodec).to.equal(videoCodec, 'videoCodec'); - expect(obj1.timeOffset).to.equal(newFrag.startDTS, 'timeOffset'); + expect(obj1.timeOffset).to.equal(newFrag.startPTS, 'timeOffset'); expect(obj1.discontinuity).to.be.false; expect(obj1.trackSwitch).to.be.false; expect(obj1.contiguous).to.be.true; @@ -142,7 +140,6 @@ describe('Demuxer tests', function () { cc: 200, sn: 5, level: 2, - startDTS: undefined, start: 1000 }; let data = {}, diff --git a/tests/unit/hls.js b/tests/unit/hls.js new file mode 100644 index 00000000000..4d3756d31ef --- /dev/null +++ b/tests/unit/hls.js @@ -0,0 +1,19 @@ +import Hls from '../../src/hls'; + +describe('Hls', function () { + it('should return a bandwidth estimate if the estimator exists', function () { + const MOCKED_ESTIMATE = 2000; + const hls = new Hls(); + hls.abrController = { + _bwEstimator: { + getEstimate: () => MOCKED_ESTIMATE + } + }; + expect(hls.bandwidthEstimate).to.equal(MOCKED_ESTIMATE); + }); + + it('should return NaN if the estimator does not exist', function () { + const hls = new Hls(); + expect(hls.bandwidthEstimate).to.be.NaN; + }); +}); diff --git a/tests/unit/loader/fragment.js b/tests/unit/loader/fragment.js index c172c264f76..41c359aa9c6 100644 --- a/tests/unit/loader/fragment.js +++ b/tests/unit/loader/fragment.js @@ -1,12 +1,37 @@ import Fragment from '../../../src/loader/fragment'; describe('Fragment class tests', function () { + /** + * @type {Fragment} + */ let frag; - describe('endProgramDateTime getter', function () { - beforeEach(function () { - frag = new Fragment(); + beforeEach(function () { + frag = new Fragment(); + }); + + describe('setByteRange', function () { + it('set byte range with length@offset', function () { + frag.setByteRange('1000@10000'); + expect(frag.byteRangeStartOffset).to.equal(10000); + expect(frag.byteRangeEndOffset).to.equal(11000); + }); + + it('set byte range with no offset and uses 0 as offset', function () { + frag.setByteRange('5000'); + expect(frag.byteRangeStartOffset).to.equal(0); + expect(frag.byteRangeEndOffset).to.equal(5000); }); + it('set byte range with no offset and uses 0 as offset', function () { + const prevFrag = new Fragment(); + prevFrag.setByteRange('1000@10000'); + frag.setByteRange('5000', prevFrag); + expect(frag.byteRangeStartOffset).to.equal(11000); + expect(frag.byteRangeEndOffset).to.equal(16000); + }); + }); + + describe('endProgramDateTime getter', function () { it('computes endPdt when pdt and duration are valid', function () { frag.programDateTime = 1000; frag.duration = 1; diff --git a/tests/unit/loader/playlist-loader.js b/tests/unit/loader/playlist-loader.js index f8230b711c3..e1e1df98daf 100644 --- a/tests/unit/loader/playlist-loader.js +++ b/tests/unit/loader/playlist-loader.js @@ -807,7 +807,7 @@ http://dummy.url.com/hls/live/segment/segment_022916_164500865_719928.ts expect(result.fragments[2].tagList[2][1]).to.equal('http://dummy.url.com/hls/moreinfo.json'); }); - it('allows spaces in the fragment files', () => { + it('allows spaces in the fragment files', function () { const level = `#EXTM3U #EXT-X-VERSION:4 #EXT-X-TARGETDURATION:7 @@ -827,7 +827,7 @@ http://dummy.url.com/hls/live/segment/segment_022916_164500865_719928.ts expect(result.fragments[1].url).to.equal('http://dummy.url.com/180724_Allison VLOG-v3_00002.ts'); }); - it('deals with spaces after fragment files', () => { + it('deals with spaces after fragment files', function () { // You can't see them, but there should be spaces directly after the .ts const level = `#EXTM3U #EXT-X-VERSION:4 diff --git a/tests/unit/utils/attr-list.js b/tests/unit/utils/attr-list.js index 604b04dd38b..4986972104d 100644 --- a/tests/unit/utils/attr-list.js +++ b/tests/unit/utils/attr-list.js @@ -2,9 +2,9 @@ import AttrList from '../../../src/utils/attr-list'; describe('AttrList', function () { it('constructor() supports empty arguments', function () { - expect(new AttrList()).to.deep.equal({}); - expect(new AttrList({})).to.deep.equal({}); - expect(new AttrList(undefined)).to.deep.equal({}); + expect(Object.keys(new AttrList())).to.deep.equal([]); + expect(Object.keys(new AttrList({}))).to.deep.equal([]); + expect(Object.keys(new AttrList(undefined))).to.deep.equal([]); }); it('constructor() supports object argument', function () { const obj = { VALUE: '42' }; diff --git a/tests/unit/utils/buffer-helper.js b/tests/unit/utils/buffer-helper.js index dfd4123383a..7d51399e8a6 100644 --- a/tests/unit/utils/buffer-helper.js +++ b/tests/unit/utils/buffer-helper.js @@ -10,8 +10,8 @@ function createMockBuffer (buffered) { describe('BufferHelper', function () { describe('isBuffered', function () { - // |////////|__________|////////////////| - // 0 0.5 1 2.0 + // |////////|________|////////////////| + // 0 0.5 1 2 const media = { get buffered () { return createMockBuffer([ @@ -21,20 +21,12 @@ describe('BufferHelper', function () { }, { startPTS: 1, - endPTS: 2.0 + endPTS: 2 } ]); } }; - it('should return true if media.buffered throw error', function () { - const invalidMedia = { - get buffered () { - throw new Error('InvalidStateError'); - } - }; - expect(BufferHelper.isBuffered(invalidMedia, 0)).to.be.false; - }); it('should return true if some media.buffered includes the position', function () { expect(BufferHelper.isBuffered(media, 0)).to.be.true; expect(BufferHelper.isBuffered(media, 0.1)).to.be.true; @@ -42,17 +34,31 @@ describe('BufferHelper', function () { expect(BufferHelper.isBuffered(media, 1)).to.be.true; expect(BufferHelper.isBuffered(media, 2)).to.be.true; }); + it('should return false if any media.buffered does not includes the position', function () { expect(BufferHelper.isBuffered(media, -0.1)).to.be.false; expect(BufferHelper.isBuffered(media, 0.51)).to.be.false; expect(BufferHelper.isBuffered(media, 0.9)).to.be.false; expect(BufferHelper.isBuffered(media, 2.1)).to.be.false; }); + + it('should return false if media.buffered throws error', function () { + const invalidMedia = { + get buffered () { + throw new Error('InvalidStateError'); + } + }; + expect(BufferHelper.isBuffered(invalidMedia, 0)).to.be.false; + }); + it('should return false if media does not exist', function () { + expect(BufferHelper.isBuffered(null, 0)).to.be.false; + }); }); + describe('bufferInfo', function () { - it('should return found buffer info when maxHoleDuration is 0', function () { - // |////////|__________|////////////////| - // 0 0.5 1 2.0 + it('should return found buffer info if some media.buffered includes pos with allowed error', function () { + // |////////|________|////////////////| + // 0 0.5 1 2 const media = { get buffered () { return createMockBuffer([ @@ -62,7 +68,7 @@ describe('BufferHelper', function () { }, { startPTS: 1, - endPTS: 2.0 + endPTS: 2 } ]); } @@ -74,70 +80,206 @@ describe('BufferHelper', function () { end: 0.5, nextStart: 1 }); - expect(BufferHelper.bufferInfo(media, 0.5, maxHoleDuration)).to.deep.equal({ + }); + it('should return empty buffer info if media does not exist', function () { + const invalidMedia = { + get buffered () { + throw new Error('InvalidStateError'); + } + }; + const maxHoleDuration = 0; + expect(BufferHelper.bufferInfo(invalidMedia, 0, maxHoleDuration)).to.deep.equal({ + len: 0, + start: 0, + end: 0, + nextStart: undefined + }); + }); + it('should return empty buffer info if media does not exist', function () { + const maxHoleDuration = 0; + expect(BufferHelper.bufferInfo(null, 0, maxHoleDuration)).to.deep.equal({ + len: 0, + start: 0, + end: 0, + nextStart: undefined + }); + }); + }); + + describe('bufferedInfo', function () { + it('should return found buffer info when maxHoleDuration is 0', function () { + // |////////|________|////////////////| + // 0 0.5 1 2 + const buffered = [ + { + start: 0, + end: 0.5 + }, + { + start: 1, + end: 2 + } + ]; + const maxHoleDuration = 0; + expect(BufferHelper.bufferedInfo(buffered, 0, maxHoleDuration)).to.deep.equal({ + len: 0.5, + start: 0, + end: 0.5, + nextStart: 1 + }); + expect(BufferHelper.bufferedInfo(buffered, 0.5, maxHoleDuration)).to.deep.equal({ len: 0, start: 0.5, end: 0.5, nextStart: 1 }); - expect(BufferHelper.bufferInfo(media, 1, maxHoleDuration)).to.deep.equal({ + expect(BufferHelper.bufferedInfo(buffered, 1, maxHoleDuration)).to.deep.equal({ len: 1, start: 1, end: 2, nextStart: undefined }); - expect(BufferHelper.bufferInfo(media, 2, maxHoleDuration)).to.deep.equal({ - len: 0, - start: 2, + expect(BufferHelper.bufferedInfo(buffered, 1.5, maxHoleDuration)).to.deep.equal({ + len: 0.5, + start: 1, end: 2, nextStart: undefined }); }); it('should return found buffer info when maxHoleDuration is 0.5', function () { - // |////////|__________|////////////////| - // 0 0.5 1 2.0 - const media = { - get buffered () { - return createMockBuffer([ - { - startPTS: 0, - endPTS: 0.5 - }, - { - startPTS: 1, - endPTS: 2.0 - } - ]); + // |////////|________|////////////////| + // 0 0.5 1 2 + const buffered = [ + { + start: 0, + end: 0.5 + }, + { + start: 1, + end: 2 } - }; + ]; const maxHoleDuration = 0.5; - expect(BufferHelper.bufferInfo(media, 0, maxHoleDuration)).to.deep.equal({ + expect(BufferHelper.bufferedInfo(buffered, 0, maxHoleDuration)).to.deep.equal({ len: 0.5, start: 0, end: 0.5, nextStart: 1 }); // M: maxHoleDuration: 0.5 - // |////////|__________|////////////////| - // 0 0.5 --- M --- 1 2.0 - expect(BufferHelper.bufferInfo(media, 0.5, maxHoleDuration)).to.deep.equal({ + // |////////|________|////////////////| + // 0 0.5 - M - 1 2 + expect(BufferHelper.bufferedInfo(buffered, 0.5, maxHoleDuration)).to.deep.equal({ len: 1.5, start: 1, end: 2, nextStart: undefined }); - expect(BufferHelper.bufferInfo(media, 1, maxHoleDuration)).to.deep.equal({ + expect(BufferHelper.bufferedInfo(buffered, 1, maxHoleDuration)).to.deep.equal({ len: 1, start: 1, end: 2, nextStart: undefined }); - expect(BufferHelper.bufferInfo(media, 2, maxHoleDuration)).to.deep.equal({ + expect(BufferHelper.bufferedInfo(buffered, 2, maxHoleDuration)).to.deep.equal({ len: 0, start: 2, end: 2, nextStart: undefined }); }); + it('should be able to handle unordered buffered', function () { + // |////////|________|////////////////| + // 0 0.5 1.0 2.0 + const buffered = [ + { + start: 1, + end: 2 + }, + { + start: 0, + end: 0.5 + } + ]; + const maxHoleDuration = 0.5; + expect(BufferHelper.bufferedInfo(buffered, 0, maxHoleDuration)).to.deep.equal({ + len: 0.5, + start: 0, + end: 0.5, + nextStart: 1 + }); + }); + it('should be able to merge adjacent time ranges with a small hole', function () { + // |////////|________|////////////////| + // 0 0.5 1 2 + const buffered = [ + { + start: 0, + end: 0.5 + }, + { + start: 1, + end: 2 + } + ]; + const maxHoleDuration = 1; + expect(BufferHelper.bufferedInfo(buffered, 0.8, maxHoleDuration)).to.deep.equal({ + len: 1.2, + start: 0, + end: 2, + nextStart: undefined + }); + }); + it('should be able to merge overlapping time ranges', function () { + // |////////|________| + // |////////|////////| + // 0 0.5 1 + const buffered = [ + { + start: 0, + end: 0.5 + }, + { + start: 0, + end: 1 + } + ]; + const maxHoleDuration = 0.5; + expect(BufferHelper.bufferedInfo(buffered, 0.5, maxHoleDuration)).to.deep.equal({ + len: 0.5, + start: 0, + end: 1, + nextStart: undefined + }); + }); + it('should return empty buffered if pos is out of range', function () { + const buffered = [ + { + start: 0, + end: 0.5 + }, + { + start: 0, + end: 1 + } + ]; + const maxHoleDuration = 0; + expect(BufferHelper.bufferedInfo(buffered, 5, maxHoleDuration)).to.deep.equal({ + len: 0, + start: 5, + end: 5, + nextStart: undefined + }); + }); + it('should return empty buffered if buffered is empty', function () { + const buffered = []; + const maxHoleDuration = 0; + expect(BufferHelper.bufferedInfo(buffered, 5, maxHoleDuration)).to.deep.equal({ + len: 0, + start: 5, + end: 5, + nextStart: undefined + }); + }); }); }); diff --git a/tsconfig.json b/tsconfig.json index 8ba77248e1d..a38a008c034 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,18 +1,24 @@ { "compilerOptions": { - "sourceMap": true, - "allowJs": true, + "target": "esnext", "module": "commonjs", - "target": "ES5", - "strict": false + "declaration": true, + "sourceMap": true, + "strict": false, + "strictNullChecks": true, + "strictPropertyInitialization": true, + "lib": [ + "dom", + "es2015", + ], + "outDir": "./dist/", }, "include": [ - "demo/**/*", - "src/**/*", - "tests/**/*" + "src/**/*" ], "exclude": [ "node_modules", + "dist/**/*", "**/*.spec.*" ] } diff --git a/webpack.config.js b/webpack.config.js index d23526537bc..0f1e4892385 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,77 +1,92 @@ const pkgJson = require('./package.json'); const path = require('path'); const webpack = require('webpack'); - -const clone = (...args) => Object.assign({}, ...args); +const merge = require('webpack-merge'); +const importHelper = require('@babel/helper-module-imports'); /* Allow to customise builds through env-vars */ const env = process.env; const addSubtitleSupport = !!env.SUBTITLE || !!env.USE_SUBTITLES; const addAltAudioSupport = !!env.ALT_AUDIO || !!env.USE_ALT_AUDIO; -const addEMESupport = false; +const addEMESupport = !!env.EME_DRM || !!env.USE_EME_DRM; const createDefinePlugin = (type) => { - const buildConstants = { - __VERSION__: JSON.stringify(pkgJson.version), - __USE_SUBTITLES__: JSON.stringify(type === 'main' || addSubtitleSupport), - __USE_ALT_AUDIO__: JSON.stringify(type === 'main' || addAltAudioSupport), - __USE_EME_DRM__: JSON.stringify(type === 'main' || addEMESupport) - }; - return new webpack.DefinePlugin(buildConstants); + const buildConstants = { + __VERSION__: JSON.stringify(pkgJson.version), + __USE_SUBTITLES__: JSON.stringify(type === 'main' || addSubtitleSupport), + __USE_ALT_AUDIO__: JSON.stringify(type === 'main' || addAltAudioSupport), + __USE_EME_DRM__: JSON.stringify(type === 'main' || addEMESupport) + }; + return new webpack.DefinePlugin(buildConstants); }; -const basePlugins = [new webpack.optimize.ModuleConcatenationPlugin()]; +const basePlugins = [ + new webpack.optimize.ModuleConcatenationPlugin(), + new webpack.optimize.OccurrenceOrderPlugin(), + new webpack.BannerPlugin({ entryOnly: true, raw: true, banner: 'typeof window !== "undefined" &&' }) // SSR/Node.js guard +]; const mainPlugins = [...basePlugins, createDefinePlugin('main')]; const lightPlugins = [...basePlugins, createDefinePlugin('light')]; const baseConfig = { - entry: './src/hls.js', - node: false, - optimization: { - splitChunks: false - }, - module: { - strictExportPresence: true, - rules: [ + mode: 'development', + entry: './src/hls', + node: false, + optimization: { + splitChunks: false + }, + resolve: { + // Add `.ts` as a resolvable extension. + extensions: ['.ts', '.js'] + }, + module: { + strictExportPresence: true, + rules: [ + { + test: /\.(ts|js)$/, + exclude: [ + path.resolve(__dirname, 'node_modules') + ], + loader: 'babel-loader', + options: { + babelrc: false, + presets: [ + '@babel/preset-typescript', + ['@babel/preset-env', { + loose: true, + modules: false, + targets: { + browsers: [ + 'chrome >= 47', + 'firefox >= 51', + 'ie >= 11', + 'safari >= 8', + 'ios >= 8', + 'android >= 4' + ] + } + }] + ], + plugins: [ + ['@babel/plugin-proposal-class-properties', { + loose: true + }], + '@babel/plugin-proposal-object-rest-spread', { - test: /\.js$/, - exclude: [ - path.resolve(__dirname, 'node_modules') - ], - loader: 'babel-loader', - options: { - babelrc: false, - presets: [ - ['env', { - loose: true, - modules: false, - targets: { - browsers: [ - 'chrome >= 55', - 'firefox >= 51', - 'ie >= 11', - 'safari >= 8', - 'ios >= 8', - 'android >= 4' - ] - } - }] - ], - plugins: [ - { - visitor: { - CallExpression: function (espath, file) { - if (espath.get('callee').matchesPattern('Number.isFinite')) - espath.node.callee = file.addImport(path.resolve('src/polyfills/number-isFinite'), 'isFiniteNumber'); - } - } - } - ] + visitor: { + CallExpression: function (espath) { + if (espath.get('callee').matchesPattern('Number.isFinite')) { + espath.node.callee = importHelper.addNamed(espath, 'isFiniteNumber', path.resolve('src/polyfills/number-isFinite')); + } } + } } - ] - } + ] + } + } + ] + } }; function getAliasesForLightDist () { @@ -84,7 +99,7 @@ function getAliasesForLightDist () { } if (!addSubtitleSupport) { - aliases = clone(aliases, { + aliases = Object.assign(aliases, { './utils/cues': './empty.js', './controller/timeline-controller': './empty.js', './controller/subtitle-track-controller': './empty.js', @@ -93,7 +108,7 @@ function getAliasesForLightDist () { } if (!addAltAudioSupport) { - aliases = clone(aliases, { + aliases = Object.assign(aliases, { './controller/audio-track-controller': './empty.js', './controller/audio-stream-controller': './empty.js' }); @@ -103,108 +118,116 @@ function getAliasesForLightDist () { } const multiConfig = [ - { - name: 'debug', - mode: 'development', - output: { - filename: 'hls.js', - chunkFilename: '[name].js', - sourceMapFilename: 'hls.js.map', - path: path.resolve(__dirname, 'dist'), - publicPath: '/dist/', - library: 'Hls', - libraryTarget: 'umd', - libraryExport: 'default' - }, - plugins: mainPlugins, - devtool: 'source-map' + { + name: 'debug', + mode: 'development', + output: { + filename: 'hls.js', + chunkFilename: '[name].js', + sourceMapFilename: 'hls.js.map', + path: path.resolve(__dirname, 'dist'), + publicPath: '/dist/', + library: 'Hls', + libraryTarget: 'umd', + libraryExport: 'default', + globalObject: 'this' // https://github.com/webpack/webpack/issues/6642#issuecomment-370222543 }, - { - name: 'dist', - mode: 'production', - output: { - filename: 'hls.min.js', - chunkFilename: '[name].js', - path: path.resolve(__dirname, 'dist'), - publicPath: '/dist/', - library: 'Hls', - libraryTarget: 'umd', - libraryExport: 'default' - }, - plugins: mainPlugins, - devtool: 'source-map' + plugins: mainPlugins, + devtool: 'source-map' + }, + { + name: 'dist', + mode: 'production', + output: { + filename: 'hls.min.js', + chunkFilename: '[name].js', + path: path.resolve(__dirname, 'dist'), + publicPath: '/dist/', + library: 'Hls', + libraryTarget: 'umd', + libraryExport: 'default', + globalObject: 'this' }, - { - name: 'light', - mode: 'development', - output: { - filename: 'hls.light.js', - chunkFilename: '[name].js', - sourceMapFilename: 'hls.light.js.map', - path: path.resolve(__dirname, 'dist'), - publicPath: '/dist/', - library: 'Hls', - libraryTarget: 'umd', - libraryExport: 'default' - }, - resolve: { - alias: getAliasesForLightDist() - }, - plugins: lightPlugins, - devtool: 'source-map' + plugins: mainPlugins, + devtool: 'source-map' + }, + { + name: 'light', + mode: 'development', + output: { + filename: 'hls.light.js', + chunkFilename: '[name].js', + sourceMapFilename: 'hls.light.js.map', + path: path.resolve(__dirname, 'dist'), + publicPath: '/dist/', + library: 'Hls', + libraryTarget: 'umd', + libraryExport: 'default', + globalObject: 'this' }, - { - name: 'light-dist', - mode: 'production', - output: { - filename: 'hls.light.min.js', - chunkFilename: '[name].js', - path: path.resolve(__dirname, 'dist'), - publicPath: '/dist/', - library: 'Hls', - libraryTarget: 'umd', - libraryExport: 'default' - }, - resolve: { - alias: getAliasesForLightDist() - }, - plugins: lightPlugins, - devtool: 'source-map' + resolve: { + alias: getAliasesForLightDist() }, - { - name: 'demo', - entry: './demo/main', - mode: 'development', - output: { - filename: 'hls-demo.js', - chunkFilename: '[name].js', - sourceMapFilename: 'hls-demo.js.map', - path: path.resolve(__dirname, 'dist'), - publicPath: '/dist/', - library: 'HlsDemo', - libraryTarget: 'umd', - libraryExport: 'default' - }, - plugins: mainPlugins, - devtool: 'source-map' - } -].map(config => Object.assign({}, baseConfig, config)); + plugins: lightPlugins, + devtool: 'source-map' + }, + { + name: 'light-dist', + mode: 'production', + output: { + filename: 'hls.light.min.js', + chunkFilename: '[name].js', + path: path.resolve(__dirname, 'dist'), + publicPath: '/dist/', + library: 'Hls', + libraryTarget: 'umd', + libraryExport: 'default', + globalObject: 'this' + }, + resolve: { + alias: getAliasesForLightDist() + }, + plugins: lightPlugins, + devtool: 'source-map' + }, + { + name: 'demo', + entry: './demo/main', + mode: 'development', + output: { + filename: 'hls-demo.js', + chunkFilename: '[name].js', + sourceMapFilename: 'hls-demo.js.map', + path: path.resolve(__dirname, 'dist'), + publicPath: '/dist/', + library: 'HlsDemo', + libraryTarget: 'umd', + libraryExport: 'default', + globalObject: 'this' // https://github.com/webpack/webpack/issues/6642#issuecomment-370222543 + }, + plugins: mainPlugins, + devtool: 'source-map' + } +].map(config => merge(baseConfig, config)); // webpack matches the --env arguments to a string; for example, --env.debug.min translates to { debug: true, min: true } module.exports = (envArgs) => { + let configs; if (!envArgs) { // If no arguments are specified, return every configuration - return multiConfig; - } + configs = multiConfig; + } else { + // Find the first enabled config within the arguments array + const enabledConfigName = Object.keys(envArgs).find(envName => envArgs[envName]); + // Filter out config with name + const enabledConfig = multiConfig.find(config => config.name === enabledConfigName); + if (!enabledConfig) { + throw new Error(`Couldn't find a valid config with the name "${enabledConfigName}". Known configs are: ${multiConfig.map(config => config.name).join(', ')}`); + } - // Find the first enabled config within the arguments array - const enabledConfigName = Object.keys(envArgs).find(envName => envArgs[envName]); - // Filter out config with name - const enabledConfig = multiConfig.find(config => config.name === enabledConfigName); - if (!enabledConfig) { - console.error(`Couldn't find a valid config with the name "${enabledConfigName}". Known configs are: ${multiConfig.map(config => config.name).join(', ')}`); - return; + configs = [enabledConfig]; } - return enabledConfig; + console.log(`Building configs: ${configs.map(config => config.name).join(', ')}.\n`); + return configs; }; diff --git a/yarn.lock b/yarn.lock index 9d711c20f98..c2fd1ba9c95 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,6 +9,26 @@ dependencies: "@babel/highlight" "^7.0.0" +"@babel/core@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.2.0.tgz#a4dd3814901998e93340f0086e9867fefa163ada" + integrity sha512-7pvAdC4B+iKjFFp9Ztj0QgBndJ++qaMeonT185wAqUnhipw8idm9Rv1UMyBuKtYjfl6ORNkgEgcsYLfHX/GpLw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.2.0" + "@babel/helpers" "^7.2.0" + "@babel/parser" "^7.2.0" + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.6" + "@babel/types" "^7.2.0" + convert-source-map "^1.1.0" + debug "^4.1.0" + json5 "^2.1.0" + lodash "^4.17.10" + resolve "^1.3.2" + semver "^5.4.1" + source-map "^0.5.0" + "@babel/generator@^7.0.0", "@babel/generator@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.3.tgz#2103ec9c42d9bdad9190a6ad5ff2d456fd7b8673" @@ -20,6 +40,69 @@ source-map "^0.5.0" trim-right "^1.0.1" +"@babel/generator@^7.2.0", "@babel/generator@^7.2.2": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.3.2.tgz#fff31a7b2f2f3dad23ef8e01be45b0d5c2fc0132" + integrity sha512-f3QCuPppXxtZOEm5GWPra/uYUjmNQlu9pbAD8D/9jze4pTY83rTtB1igTBSwvkeNlC5gR24zFFkz+2WHLFQhqQ== + dependencies: + "@babel/types" "^7.3.2" + jsesc "^2.5.1" + lodash "^4.17.10" + source-map "^0.5.0" + trim-right "^1.0.1" + +"@babel/helper-annotate-as-pure@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" + integrity sha512-3UYcJUj9kvSLbLbUIfQTqzcy5VX7GRZ/CCDrnOaZorFFM01aXp1+GJwuFGV4NDDoAS+mOUyHcO6UD/RfqOks3Q== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" + integrity sha512-qNSR4jrmJ8M1VMM9tibvyRAHXQs2PmaksQF7c1CGJNipfe3D8p+wgNwgso/P2A2r2mdgBWAXljNWR0QRZAMW8w== + dependencies: + "@babel/helper-explode-assignable-expression" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-call-delegate@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz#6a957f105f37755e8645343d3038a22e1449cc4a" + integrity sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-create-class-features-plugin@^7.3.0": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.3.2.tgz#ba1685603eb1c9f2f51c9106d5180135c163fe73" + integrity sha512-tdW8+V8ceh2US4GsYdNVNoohq5uVwOf9k6krjwW4E1lINcHgttnWcNqgdoessn12dAy8QkbezlbQh2nXISNY+A== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.2.3" + +"@babel/helper-define-map@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz#3b74caec329b3c80c116290887c0dd9ae468c20c" + integrity sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/types" "^7.0.0" + lodash "^4.17.10" + +"@babel/helper-explode-assignable-expression@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.1.0.tgz#537fa13f6f1674df745b0c00ec8fe4e99681c8f6" + integrity sha512-NRQpfHrJ1msCHtKjbzs9YcMmJZOg6mQMmGRB+hbamEdG5PNpaSm95275VD92DvJKuyl0s2sFiDmMZ+EnnvufqA== + dependencies: + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + "@babel/helper-function-name@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz#a0ceb01685f73355d4360c1247f582bfafc8ff53" @@ -36,6 +119,87 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-hoist-variables@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz#46adc4c5e758645ae7a45deb92bab0918c23bb88" + integrity sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-member-expression-to-functions@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.0.0.tgz#8cd14b0a0df7ff00f009e7d7a436945f47c7a16f" + integrity sha512-avo+lm/QmZlv27Zsi0xEor2fKcqWG56D5ae9dzklpIaY7cQMK5N8VSpaNVPPagiqmy7LrEjK1IWdGMOqPu5csg== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-imports@7.0.0", "@babel/helper-module-imports@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" + integrity sha512-aP/hlLq01DWNEiDg4Jn23i+CXxW/owM4WpDLFUbpjxe4NS3BhLVZQ5i7E0ZrxuQ/vwekIeciyamgB1UIYxxM6A== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-module-transforms@^7.1.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.2.2.tgz#ab2f8e8d231409f8370c883d20c335190284b963" + integrity sha512-YRD7I6Wsv+IHuTPkAmAS4HhY0dkPobgLftHp0cRGZSdrRvmZY8rFvae/GVu3bD00qscuvK3WPHB3YdNpBXUqrA== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/template" "^7.2.2" + "@babel/types" "^7.2.2" + lodash "^4.17.10" + +"@babel/helper-optimise-call-expression@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" + integrity sha512-u8nd9NQePYNQV8iPWu/pLLYBqZBa4ZaY1YWRFMuxrid94wKI1QNt67NEZ7GAe5Kc/0LLScbim05xZFWkAdrj9g== + dependencies: + "@babel/types" "^7.0.0" + +"@babel/helper-plugin-utils@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" + integrity sha512-CYAOUCARwExnEixLdB6sDm2dIJ/YgEAKDM1MOeMeZu9Ld/bDgVo8aiWrXwcY7OBh+1Ea2uUcVRcxKk0GJvW7QA== + +"@babel/helper-regex@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.0.0.tgz#2c1718923b57f9bbe64705ffe5640ac64d9bdb27" + integrity sha512-TR0/N0NDCcUIUEbqV6dCO+LptmmSQFQ7q70lfcEB4URsjD0E1HzicrwUH+ap6BAQ2jhCX9Q4UqZy4wilujWlkg== + dependencies: + lodash "^4.17.10" + +"@babel/helper-remap-async-to-generator@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.1.0.tgz#361d80821b6f38da75bd3f0785ece20a88c5fe7f" + integrity sha512-3fOK0L+Fdlg8S5al8u/hWE6vhufGSn0bN09xm2LXMy//REAF8kDCrYoOBKYmA8m5Nom+sV9LyLCwrFynA8/slg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-wrap-function" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.0.0" + +"@babel/helper-replace-supers@^7.1.0", "@babel/helper-replace-supers@^7.2.3": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.2.3.tgz#19970020cf22677d62b3a689561dbd9644d8c5e5" + integrity sha512-GyieIznGUfPXPWu0yLS6U55Mz67AZD9cUk0BfirOWlPrXlBcan9Gz+vHGz+cPfuoweZSnPzPIm67VtQM0OWZbA== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.0.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/traverse" "^7.2.3" + "@babel/types" "^7.0.0" + +"@babel/helper-simple-access@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" + integrity sha512-Vk+78hNjRbsiu49zAPALxTb+JUQCz1aolpd8osOF16BGnLtseD21nbHgLPGUwrXEurZgiCOUmvs3ExTu4F5x6w== + dependencies: + "@babel/template" "^7.1.0" + "@babel/types" "^7.0.0" + "@babel/helper-split-export-declaration@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz#3aae285c0311c2ab095d997b8c9a94cad547d813" @@ -43,6 +207,25 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-wrap-function@^7.1.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" + integrity sha512-o9fP1BZLLSrYlxYEYyl2aS+Flun5gtjTIG8iln+XuEzQTs0PLagAGSXUcqruJwD5fM48jzIEggCKpIfWTcR7pQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/template" "^7.1.0" + "@babel/traverse" "^7.1.0" + "@babel/types" "^7.2.0" + +"@babel/helpers@^7.2.0": + version "7.3.1" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.3.1.tgz#949eec9ea4b45d3210feb7dc1c22db664c9e44b9" + integrity sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA== + dependencies: + "@babel/template" "^7.1.2" + "@babel/traverse" "^7.1.5" + "@babel/types" "^7.3.0" + "@babel/highlight@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" @@ -57,6 +240,387 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.3.tgz#2c92469bac2b7fbff810b67fca07bd138b48af77" integrity sha512-gqmspPZOMW3MIRb9HlrnbZHXI1/KHTOroBwN1NcLL6pWxzqzEKGvRTq0W/PxS45OtQGbaFikSQpkS5zbnsQm2w== +"@babel/parser@^7.2.0", "@babel/parser@^7.2.2", "@babel/parser@^7.2.3": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.3.2.tgz#95cdeddfc3992a6ca2a1315191c1679ca32c55cd" + integrity sha512-QzNUC2RO1gadg+fs21fi0Uu0OuGNzRKEmgCxoLNzbCdoprLwjfmZwzUrpUNfJPaVRwBpDY47A17yYEGWyRelnQ== + +"@babel/plugin-proposal-async-generator-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" + integrity sha512-+Dfo/SCQqrwx48ptLVGLdE39YtWRuKc/Y9I5Fy0P1DDBB9lsAHpjcEJQt+4IifuSOSTLBKJObJqMvaO1pIE8LQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + +"@babel/plugin-proposal-class-properties@^7.3.0": + version "7.3.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.3.0.tgz#272636bc0fa19a0bc46e601ec78136a173ea36cd" + integrity sha512-wNHxLkEKTQ2ay0tnsam2z7fGZUi+05ziDJflEt3AZTP3oXLKHJp9HqhfroB/vdMvt3sda9fAbq7FsG8QPDrZBg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.3.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-proposal-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" + integrity sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-json-strings" "^7.2.0" + +"@babel/plugin-proposal-object-rest-spread@^7.2.0", "@babel/plugin-proposal-object-rest-spread@^7.3.2": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.2.tgz#6d1859882d4d778578e41f82cc5d7bf3d5daf6c1" + integrity sha512-DjeMS+J2+lpANkYLLO+m6GjoTMygYglKmRe6cDTbFv3L9i6mmiE8fe6B8MtCSLZpVXscD5kn7s6SgtHrDoBWoA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + +"@babel/plugin-proposal-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.2.0.tgz#135d81edb68a081e55e56ec48541ece8065c38f5" + integrity sha512-mgYj3jCcxug6KUcX4OBoOJz3CMrwRfQELPQ5560F70YQUBZB7uac9fqaWamKR1iWUzGiK2t0ygzjTScZnVz75g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + +"@babel/plugin-proposal-unicode-property-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz#abe7281fe46c95ddc143a65e5358647792039520" + integrity sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.2.0" + +"@babel/plugin-syntax-async-generators@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.2.0.tgz#69e1f0db34c6f5a0cf7e2b3323bf159a76c8cb7f" + integrity sha512-1ZrIRBv2t0GSlcwVoQ6VgSLpLgiN/FVQUzt9znxo7v2Ov4jJrs8RY8tv0wvDmFN3qIdMKWrmMMW6yZ0G19MfGg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-json-strings@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.2.0.tgz#72bd13f6ffe1d25938129d2a186b11fd62951470" + integrity sha512-5UGYnMSLRE1dqqZwug+1LISpA403HzlSfsg6P9VXU6TBjcSHeNlw4DxDx7LgpF+iKZoOG/+uzqoRHTdcUpiZNg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-object-rest-spread@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.2.0.tgz#3b7a3e733510c57e820b9142a6579ac8b0dfad2e" + integrity sha512-t0JKGgqk2We+9may3t0xDdmneaXmyxq0xieYcKHxIsrJO64n1OiMWNUtc5gQK1PA0NpdCRrtZp4z+IUaKugrSA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.2.0.tgz#a94013d6eda8908dfe6a477e7f9eda85656ecf5c" + integrity sha512-bDe4xKNhb0LI7IvZHiA13kff0KEfaGX/Hv4lMA9+7TEc63hMNvfKo6ZFpXhKuEp+II/q35Gc4NoMeDZyaUbj9w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-syntax-typescript@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.2.0.tgz#55d240536bd314dcbbec70fd949c5cabaed1de29" + integrity sha512-WhKr6yu6yGpGcNMVgIBuI9MkredpVc7Y3YR4UzEZmDztHoL6wV56YBHLhWnjO1EvId1B32HrD3DRFc+zSoKI1g== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-arrow-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.2.0.tgz#9aeafbe4d6ffc6563bf8f8372091628f00779550" + integrity sha512-ER77Cax1+8/8jCB9fo4Ud161OZzWN5qawi4GusDuRLcDbDG+bIGYY20zb2dfAFdTRGzrfq2xZPvF0R64EHnimg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-async-to-generator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.2.0.tgz#68b8a438663e88519e65b776f8938f3445b1a2ff" + integrity sha512-CEHzg4g5UraReozI9D4fblBYABs7IM6UerAVG7EJVrTLC5keh00aEuLUT+O40+mJCEzaXkYfTCUKIyeDfMOFFQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-remap-async-to-generator" "^7.1.0" + +"@babel/plugin-transform-block-scoped-functions@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.2.0.tgz#5d3cc11e8d5ddd752aa64c9148d0db6cb79fd190" + integrity sha512-ntQPR6q1/NKuphly49+QiQiTN0O63uOwjdD6dhIjSWBI5xlrbUFh720TIpzBhpnrLfv2tNH/BXvLIab1+BAI0w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-block-scoping@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.2.0.tgz#f17c49d91eedbcdf5dd50597d16f5f2f770132d4" + integrity sha512-vDTgf19ZEV6mx35yiPJe4fS02mPQUUcBNwWQSZFXSzTSbsJFQvHt7DqyS3LK8oOWALFOsJ+8bbqBgkirZteD5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + lodash "^4.17.10" + +"@babel/plugin-transform-classes@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.2.2.tgz#6c90542f210ee975aa2aa8c8b5af7fa73a126953" + integrity sha512-gEZvgTy1VtcDOaQty1l10T3jQmJKlNVxLDCs+3rCVPr6nMkODLELxViq5X9l+rfxbie3XrfrMCYYY6eX3aOcOQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-define-map" "^7.1.0" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.2.0.tgz#83a7df6a658865b1c8f641d510c6f3af220216da" + integrity sha512-kP/drqTxY6Xt3NNpKiMomfgkNn4o7+vKxK2DDKcBG9sHj51vHqMBGy8wbDS/J4lMxnqs153/T3+DmCEAkC5cpA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-destructuring@^7.2.0": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.3.2.tgz#f2f5520be055ba1c38c41c0e094d8a461dd78f2d" + integrity sha512-Lrj/u53Ufqxl/sGxyjsJ2XNtNuEjDyjpqdhMNh5aZ+XFOdThL46KBj27Uem4ggoezSYBxKWAil6Hu8HtwqesYw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-dotall-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.2.0.tgz#f0aabb93d120a8ac61e925ea0ba440812dbe0e49" + integrity sha512-sKxnyHfizweTgKZf7XsXu/CNupKhzijptfTM+bozonIuyVrLWVUvYjE2bhuSBML8VQeMxq4Mm63Q9qvcvUcciQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/plugin-transform-duplicate-keys@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.2.0.tgz#d952c4930f312a4dbfff18f0b2914e60c35530b3" + integrity sha512-q+yuxW4DsTjNceUiTzK0L+AfQ0zD9rWaTLiUqHA8p0gxx7lu1EylenfzjeIWNkPy6e/0VG/Wjw9uf9LueQwLOw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-exponentiation-operator@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.2.0.tgz#a63868289e5b4007f7054d46491af51435766008" + integrity sha512-umh4hR6N7mu4Elq9GG8TOu9M0bakvlsREEC+ialrQN6ABS4oDQ69qJv1VtR3uxlKMCQMCvzk7vr17RHKcjx68A== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-for-of@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz#ab7468befa80f764bb03d3cb5eef8cc998e1cad9" + integrity sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-function-name@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.2.0.tgz#f7930362829ff99a3174c39f0afcc024ef59731a" + integrity sha512-kWgksow9lHdvBC2Z4mxTsvc7YdY7w/V6B2vy9cTIPtLEE9NhwoWivaxdNM/S37elu5bqlLP/qOY906LukO9lkQ== + dependencies: + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.2.0.tgz#690353e81f9267dad4fd8cfd77eafa86aba53ea1" + integrity sha512-2ThDhm4lI4oV7fVQ6pNNK+sx+c/GM5/SaML0w/r4ZB7sAneD/piDJtwdKlNckXeyGK7wlwg2E2w33C/Hh+VFCg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-amd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.2.0.tgz#82a9bce45b95441f617a24011dc89d12da7f4ee6" + integrity sha512-mK2A8ucqz1qhrdqjS9VMIDfIvvT2thrEsIQzbaTdc5QFzhDjQv2CkJJ5f6BXIkgbmaoax3zBr2RyvV/8zeoUZw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-commonjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz#c4f1933f5991d5145e9cfad1dfd848ea1727f404" + integrity sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.1.0" + +"@babel/plugin-transform-modules-systemjs@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.2.0.tgz#912bfe9e5ff982924c81d0937c92d24994bb9068" + integrity sha512-aYJwpAhoK9a+1+O625WIjvMY11wkB/ok0WClVwmeo3mCjcNRjt+/8gHWrB5i+00mUju0gWsBkQnPpdvQ7PImmQ== + dependencies: + "@babel/helper-hoist-variables" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-modules-umd@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.2.0.tgz#7678ce75169f0877b8eb2235538c074268dd01ae" + integrity sha512-BV3bw6MyUH1iIsGhXlOK6sXhmSarZjtJ/vMiD9dNmpY8QXFFQTj+6v92pcfy1iqa8DeAfJFwoxcrS/TUZda6sw== + dependencies: + "@babel/helper-module-transforms" "^7.1.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-new-target@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz#ae8fbd89517fa7892d20e6564e641e8770c3aa4a" + integrity sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-object-super@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.2.0.tgz#b35d4c10f56bab5d650047dad0f1d8e8814b6598" + integrity sha512-VMyhPYZISFZAqAPVkiYb7dUe2AsVi2/wCT5+wZdsNO31FojQJa9ns40hzZ6U9f50Jlq4w6qwzdBB2uwqZ00ebg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-replace-supers" "^7.1.0" + +"@babel/plugin-transform-parameters@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.2.0.tgz#0d5ad15dc805e2ea866df4dd6682bfe76d1408c2" + integrity sha512-kB9+hhUidIgUoBQ0MsxMewhzr8i60nMa2KgeJKQWYrqQpqcBYtnpR+JgkadZVZoaEZ/eKu9mclFaVwhRpLNSzA== + dependencies: + "@babel/helper-call-delegate" "^7.1.0" + "@babel/helper-get-function-arity" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-regenerator@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.0.0.tgz#5b41686b4ed40bef874d7ed6a84bdd849c13e0c1" + integrity sha512-sj2qzsEx8KDVv1QuJc/dEfilkg3RRPvPYx/VnKLtItVQRWt1Wqf5eVCOLZm29CiGFfYYsA3VPjfizTCV0S0Dlw== + dependencies: + regenerator-transform "^0.13.3" + +"@babel/plugin-transform-shorthand-properties@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.2.0.tgz#6333aee2f8d6ee7e28615457298934a3b46198f0" + integrity sha512-QP4eUM83ha9zmYtpbnyjTLAGKQritA5XW/iG9cjtuOI8s1RuL/3V6a3DeSHfKutJQ+ayUfeZJPcnCYEQzaPQqg== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-spread@^7.2.0": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.2.2.tgz#3103a9abe22f742b6d406ecd3cd49b774919b406" + integrity sha512-KWfky/58vubwtS0hLqEnrWJjsMGaOeSBn90Ezn5Jeg9Z8KKHmELbP1yGylMlm5N6TPKeY9A2+UaSYLdxahg01w== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-sticky-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.2.0.tgz#a1e454b5995560a9c1e0d537dfc15061fd2687e1" + integrity sha512-KKYCoGaRAf+ckH8gEL3JHUaFVyNHKe3ASNsZ+AlktgHevvxGigoIttrEJb8iKN03Q7Eazlv1s6cx2B2cQ3Jabw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + +"@babel/plugin-transform-template-literals@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.2.0.tgz#d87ed01b8eaac7a92473f608c97c089de2ba1e5b" + integrity sha512-FkPix00J9A/XWXv4VoKJBMeSkyY9x/TqIh76wzcdfl57RJJcf8CehQ08uwfhCDNtRQYtHQKBTwKZDEyjE13Lwg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typeof-symbol@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.2.0.tgz#117d2bcec2fbf64b4b59d1f9819894682d29f2b2" + integrity sha512-2LNhETWYxiYysBtrBTqL8+La0jIoQQnIScUJc74OYvUGRmkskNY4EzLCnjHBzdmb38wqtTaixpo1NctEcvMDZw== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + +"@babel/plugin-transform-typescript@^7.1.0": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.3.2.tgz#59a7227163e55738842f043d9e5bd7c040447d96" + integrity sha512-Pvco0x0ZSCnexJnshMfaibQ5hnK8aUHSvjCQhC1JR8eeg+iBwt0AtCO7gWxJ358zZevuf9wPSO5rv+WJcbHPXQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-typescript" "^7.2.0" + +"@babel/plugin-transform-unicode-regex@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.2.0.tgz#4eb8db16f972f8abb5062c161b8b115546ade08b" + integrity sha512-m48Y0lMhrbXEJnVUaYly29jRXbQ3ksxPrS1Tg8t+MHqzXhtBYAvI51euOBaoAlZLPHsieY9XPVMf80a5x0cPcA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-regex" "^7.0.0" + regexpu-core "^4.1.3" + +"@babel/preset-env@7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.2.0.tgz#a5030e7e4306af5a295dd5d7c78dc5464af3fee2" + integrity sha512-haGR38j5vOGVeBatrQPr3l0xHbs14505DcM57cbJy48kgMFvvHHoYEhHuRV+7vi559yyAUAVbTWzbK/B/pzJng== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-json-strings" "^7.2.0" + "@babel/plugin-proposal-object-rest-spread" "^7.2.0" + "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.2.0" + "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-object-rest-spread" "^7.2.0" + "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" + "@babel/plugin-transform-arrow-functions" "^7.2.0" + "@babel/plugin-transform-async-to-generator" "^7.2.0" + "@babel/plugin-transform-block-scoped-functions" "^7.2.0" + "@babel/plugin-transform-block-scoping" "^7.2.0" + "@babel/plugin-transform-classes" "^7.2.0" + "@babel/plugin-transform-computed-properties" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.2.0" + "@babel/plugin-transform-dotall-regex" "^7.2.0" + "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-exponentiation-operator" "^7.2.0" + "@babel/plugin-transform-for-of" "^7.2.0" + "@babel/plugin-transform-function-name" "^7.2.0" + "@babel/plugin-transform-literals" "^7.2.0" + "@babel/plugin-transform-modules-amd" "^7.2.0" + "@babel/plugin-transform-modules-commonjs" "^7.2.0" + "@babel/plugin-transform-modules-systemjs" "^7.2.0" + "@babel/plugin-transform-modules-umd" "^7.2.0" + "@babel/plugin-transform-new-target" "^7.0.0" + "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-parameters" "^7.2.0" + "@babel/plugin-transform-regenerator" "^7.0.0" + "@babel/plugin-transform-shorthand-properties" "^7.2.0" + "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-sticky-regex" "^7.2.0" + "@babel/plugin-transform-template-literals" "^7.2.0" + "@babel/plugin-transform-typeof-symbol" "^7.2.0" + "@babel/plugin-transform-unicode-regex" "^7.2.0" + browserslist "^4.3.4" + invariant "^2.2.2" + js-levenshtein "^1.1.3" + semver "^5.3.0" + +"@babel/preset-typescript@^7.1.0": + version "7.1.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.1.0.tgz#49ad6e2084ff0bfb5f1f7fb3b5e76c434d442c7f" + integrity sha512-LYveByuF9AOM8WrsNne5+N79k1YxjNB6gmpCQsnuSBAcV8QUeB+ZUxQzL7Rz7HksPbahymKkq2qBR+o36ggFZA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-transform-typescript" "^7.1.0" + +"@babel/register@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.0.0.tgz#fa634bae1bfa429f60615b754fc1f1d745edd827" + integrity sha512-f/+CRmaCe7rVEvcvPvxeA8j5aJhHC3aJie7YuqcMDhUOuyWLA7J/aNrTaHIzoWPEhpHA54mec4Mm8fv8KBlv3g== + dependencies: + core-js "^2.5.7" + find-cache-dir "^1.0.0" + home-or-tmp "^3.0.0" + lodash "^4.17.10" + mkdirp "^0.5.1" + pirates "^4.0.0" + source-map-support "^0.5.9" + "@babel/template@^7.0.0", "@babel/template@^7.1.0": version "7.1.2" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.1.2.tgz#090484a574fef5a2d2d7726a674eceda5c5b5644" @@ -66,6 +630,15 @@ "@babel/parser" "^7.1.2" "@babel/types" "^7.1.2" +"@babel/template@^7.1.2", "@babel/template@^7.2.2": + version "7.2.2" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.2.2.tgz#005b3fdf0ed96e88041330379e0da9a708eb2907" + integrity sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.2.2" + "@babel/types" "^7.2.2" + "@babel/traverse@^7.0.0": version "7.1.4" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.1.4.tgz#f4f83b93d649b4b2c91121a9087fa2fa949ec2b4" @@ -81,6 +654,21 @@ globals "^11.1.0" lodash "^4.17.10" +"@babel/traverse@^7.1.0", "@babel/traverse@^7.1.5", "@babel/traverse@^7.1.6", "@babel/traverse@^7.2.3": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.2.3.tgz#7ff50cefa9c7c0bd2d81231fdac122f3957748d8" + integrity sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/generator" "^7.2.2" + "@babel/helper-function-name" "^7.1.0" + "@babel/helper-split-export-declaration" "^7.0.0" + "@babel/parser" "^7.2.3" + "@babel/types" "^7.2.2" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.10" + "@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.3.tgz#3a767004567060c2f40fca49a304712c525ee37d" @@ -90,6 +678,180 @@ lodash "^4.17.10" to-fast-properties "^2.0.0" +"@babel/types@^7.2.0", "@babel/types@^7.2.2", "@babel/types@^7.3.0", "@babel/types@^7.3.2": + version "7.3.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.3.2.tgz#424f5be4be633fff33fb83ab8d67e4a8290f5a2f" + integrity sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ== + dependencies: + esutils "^2.0.2" + lodash "^4.17.10" + to-fast-properties "^2.0.0" + +"@iarna/toml@^2.0.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@iarna/toml/-/toml-2.2.1.tgz#82d0993d8882bb05e0645fbb4731d9e939e895b3" + integrity sha512-I2EjI9TbEFJNLziNPFfpo64PNanOaK17iL2kTW/jGlGOa4bvHw4VEied83kOEB7NJjXf1KfvmsQ2aEjy3xjiGg== + +"@netlify/open-api@^0.5.0": + version "0.5.0" + resolved "https://registry.yarnpkg.com/@netlify/open-api/-/open-api-0.5.0.tgz#9b4e4930c66326c73e09d0ec854a98eee75e660d" + integrity sha512-9Lm4kM6uU7EN2IeV2LDt9oKReGLfU+Qxk9qbH4oReU21/vZIuEc41B8jWLN0/M8AuKRJtCERaMDboNvAE0kpsg== + +"@netlify/zip-it-and-ship-it@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@netlify/zip-it-and-ship-it/-/zip-it-and-ship-it-0.2.0.tgz#3e714980b7fc1d3d0c9db459c40b6f32ac9abc62" + integrity sha512-69/djm/Cmou19gZsV3GvQlBvCsCUa3XCfR96UcerVFxGVhVWbyU3KdALB5LrfGCMcrDBW9BHcJbxH5Aw/tJcPg== + dependencies: + archiver "^3.0.0" + body-parser "^1.18.3" + chokidar "^2.0.4" + debug "^4.1.1" + elf-tools "^1.1.1" + express "^4.16.4" + express-logging "^1.1.1" + get-port "^4.1.0" + glob "^7.1.3" + npm-packlist "^1.1.12" + p-all "^1.0.0" + precinct "^5.2.1" + read-pkg-up "^4.0.0" + require-package-name "^2.0.1" + +"@oclif/color@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@oclif/color/-/color-0.0.0.tgz#54939bbd16d1387511bf1a48ccda1a417248e6a9" + integrity sha512-KKd3W7eNwfNF061tr663oUNdt8EMnfuyf5Xv55SGWA1a0rjhWqS/32P7OeB7CbXcJUBdfVrPyR//1afaW12AWw== + dependencies: + ansi-styles "^3.2.1" + supports-color "^5.4.0" + tslib "^1" + +"@oclif/command@^1.5.1", "@oclif/command@^1.5.3", "@oclif/command@^1.5.4", "@oclif/command@^1.5.8": + version "1.5.8" + resolved "https://registry.yarnpkg.com/@oclif/command/-/command-1.5.8.tgz#cd09d4f3183123548cb25d1b12b92e41277ac3e9" + integrity sha512-+Xuqp7by9jmB+GvR2r450wUXkCpZVdeOXQD0mLSEm3h+Mxhp0NPHuhzXZQvLI0/2fXR+cmJLv1CfpaCYaflL/g== + dependencies: + "@oclif/errors" "^1.2.2" + "@oclif/parser" "^3.7.2" + debug "^4.1.0" + semver "^5.6.0" + +"@oclif/config@^1.12.4": + version "1.12.4" + resolved "https://registry.yarnpkg.com/@oclif/config/-/config-1.12.4.tgz#664f7f43c79a5b6674c35d1fd4a98c596c8a8630" + integrity sha512-lZR5Qs9NEbQ9PsOZN0nALMBisTTa53ajRsyuhMwSQtDP8B7jISqWS9czYRfn9eYA+/xWgcjwRILCHuJFtdEuTA== + dependencies: + debug "^4.1.1" + tslib "^1.9.3" + +"@oclif/errors@^1.1.2", "@oclif/errors@^1.2.1", "@oclif/errors@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@oclif/errors/-/errors-1.2.2.tgz#9d8f269b15f13d70aa93316fed7bebc24688edc2" + integrity sha512-Eq8BFuJUQcbAPVofDxwdE0bL14inIiwt5EaKRVY9ZDIG11jwdXZqiQEECJx0VfnLyUZdYfRd/znDI/MytdJoKg== + dependencies: + clean-stack "^1.3.0" + fs-extra "^7.0.0" + indent-string "^3.2.0" + strip-ansi "^5.0.0" + wrap-ansi "^4.0.0" + +"@oclif/linewrap@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@oclif/linewrap/-/linewrap-1.0.0.tgz#aedcb64b479d4db7be24196384897b5000901d91" + integrity sha512-Ups2dShK52xXa8w6iBWLgcjPJWjais6KPJQq3gQ/88AY6BXoTX+MIGFPrWQO1KLMiQfoTpcLnUwloN4brrVUHw== + +"@oclif/parser@^3.7.2": + version "3.7.2" + resolved "https://registry.yarnpkg.com/@oclif/parser/-/parser-3.7.2.tgz#b06c73377a1f027f10444109a8a4a6cc31ffd8ba" + integrity sha512-ssYXztaf9TuOGCJQOYMg62L1Q4y2lB4wZORWng+Iy0ckP2A6IUnQy97V8YjAJkkohYZOu3Mga8LGfQcf+xdIIw== + dependencies: + "@oclif/linewrap" "^1.0.0" + chalk "^2.4.1" + tslib "^1.9.3" + +"@oclif/plugin-help@^2.1.6": + version "2.1.6" + resolved "https://registry.yarnpkg.com/@oclif/plugin-help/-/plugin-help-2.1.6.tgz#ae14cbe2c5cd3eaf5f796d205ffbe66d3e369173" + integrity sha512-M4kTERpPWNSM1Mga7K/zo9DWHLCVf2FRaIeXPoytmTPd+0kSvG3TR0Vc1bwx9/cxXoYyYGgEejwNlrfayr8FZw== + dependencies: + "@oclif/command" "^1.5.8" + chalk "^2.4.1" + indent-string "^3.2.0" + lodash.template "^4.4.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + widest-line "^2.0.1" + wrap-ansi "^4.0.0" + +"@oclif/plugin-not-found@^1.1.4": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@oclif/plugin-not-found/-/plugin-not-found-1.2.2.tgz#3e601f6e4264d7a0268cd03c152d90aa9c0cec6d" + integrity sha512-SPlmiJFmTFltQT/owdzQwKgq6eq5AEKVwVK31JqbzK48bRWvEL1Ye60cgztXyZ4bpPn2Fl+KeL3FWFQX41qJuA== + dependencies: + "@oclif/color" "^0.0.0" + "@oclif/command" "^1.5.3" + cli-ux "^4.9.0" + fast-levenshtein "^2.0.6" + lodash "^4.17.11" + +"@oclif/plugin-plugins@^1.7.7": + version "1.7.7" + resolved "https://registry.yarnpkg.com/@oclif/plugin-plugins/-/plugin-plugins-1.7.7.tgz#950c91dd04480c9b57510415fc54bf7a42bb59b8" + integrity sha512-bKHruaqt3MbQefRJUgsaA1B78J69+26kUA28IhB4GlWO7RpNWEBPIAMeBk/fRB4Tfw2ZuLC7T/zwOFzvY5V1Tw== + dependencies: + "@oclif/color" "^0.0.0" + "@oclif/command" "^1.5.4" + chalk "^2.4.2" + cli-ux "^5.0.0" + debug "^4.1.0" + fs-extra "^7.0.1" + http-call "^5.2.2" + load-json-file "^5.1.0" + npm-run-path "^2.0.2" + semver "^5.6.0" + tslib "^1.9.3" + yarn "^1.13.0" + +"@oclif/screen@^1.0.3": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@oclif/screen/-/screen-1.0.4.tgz#b740f68609dfae8aa71c3a6cab15d816407ba493" + integrity sha512-60CHpq+eqnTxLZQ4PGHYNwUX572hgpMHGPtTWMjdTMsAvlm69lZV/4ly6O3sAYkomo4NggGcomrDpBe34rxUqw== + +"@octokit/endpoint@^3.1.1": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-3.1.2.tgz#22b5aa8596482fbefc3f1ce22c24ad217aed60fa" + integrity sha512-iRx4kDYybAv9tOrHDBE6HwlgiFi8qmbZl8SHliZWtxbUFuXLZXh2yv8DxGIK9wzD9J0wLDMZneO8vNYJNUSJ9Q== + dependencies: + deepmerge "3.1.0" + is-plain-object "^2.0.4" + universal-user-agent "^2.0.1" + url-template "^2.0.8" + +"@octokit/request@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-2.3.0.tgz#da2672308bcf0b9376ef66f51bddbe5eb87cc00a" + integrity sha512-5YRqYNZOAaL7+nt7w3Scp6Sz4P2g7wKFP9npx1xdExMomk8/M/ICXVLYVam2wzxeY0cIc6wcKpjC5KI4jiNbGw== + dependencies: + "@octokit/endpoint" "^3.1.1" + is-plain-object "^2.0.4" + node-fetch "^2.3.0" + universal-user-agent "^2.0.1" + +"@octokit/rest@^16.15.0": + version "16.15.0" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.15.0.tgz#648a88d5de055bcf38976709c5b2bdf1227b926f" + integrity sha512-Un+e7rgh38RtPOTe453pT/KPM/p2KZICimBmuZCd2wEo8PacDa4h6RqTPZs+f2DPazTTqdM7QU4LKlUjgiBwWw== + dependencies: + "@octokit/request" "2.3.0" + before-after-hook "^1.2.0" + btoa-lite "^1.0.0" + lodash.get "^4.4.2" + lodash.set "^4.3.2" + lodash.uniq "^4.5.0" + octokit-pagination-methods "^1.1.0" + universal-user-agent "^2.0.0" + url-template "^2.0.8" + "@sinonjs/commons@^1.2.0": version "1.3.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.3.0.tgz#50a2754016b6f30a994ceda6d9a0a8c36adda849" @@ -121,147 +883,147 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.1.tgz#da61b64a2930a80fa708e57c45cd5441eb379d5b" integrity sha512-i1sl+WCX2OCHeUi9oi7PiCNUtYFrpWhpcx878vpeq/tlZTKzcFdHePlyFHVbWqeuKN0SRPl/9ZFDSTsfv9h7VQ== -"@webassemblyjs/ast@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.10.tgz#0cfc61d61286240b72fc522cb755613699eea40a" - integrity sha512-wTUeaByYN2EA6qVqhbgavtGc7fLTOx0glG2IBsFlrFG51uXIGlYBTyIZMf4SPLo3v1bgV/7lBN3l7Z0R6Hswew== - dependencies: - "@webassemblyjs/helper-module-context" "1.7.10" - "@webassemblyjs/helper-wasm-bytecode" "1.7.10" - "@webassemblyjs/wast-parser" "1.7.10" - -"@webassemblyjs/floating-point-hex-parser@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.10.tgz#ee63d729c6311a85863e369a473f9983f984e4d9" - integrity sha512-gMsGbI6I3p/P1xL2UxqhNh1ga2HCsx5VBB2i5VvJFAaqAjd2PBTRULc3BpTydabUQEGlaZCzEUQhLoLG7TvEYQ== - -"@webassemblyjs/helper-api-error@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.10.tgz#bfcb3bbe59775357475790a2ad7b289f09b2f198" - integrity sha512-DoYRlPWtuw3yd5BOr9XhtrmB6X1enYF0/54yNvQWGXZEPDF5PJVNI7zQ7gkcKfTESzp8bIBWailaFXEK/jjCsw== - -"@webassemblyjs/helper-buffer@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.10.tgz#0a8c624c67ad0b214d2e003859921a1988cb151b" - integrity sha512-+RMU3dt/dPh4EpVX4u5jxsOlw22tp3zjqE0m3ftU2tsYxnPULb4cyHlgaNd2KoWuwasCQqn8Mhr+TTdbtj3LlA== - -"@webassemblyjs/helper-code-frame@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.10.tgz#0ab7e22fad0241a173178c73976fc0edf50832ce" - integrity sha512-UiytbpKAULOEab2hUZK2ywXen4gWJVrgxtwY3Kn+eZaaSWaRM8z/7dAXRSoamhKFiBh1uaqxzE/XD9BLlug3gw== - dependencies: - "@webassemblyjs/wast-printer" "1.7.10" - -"@webassemblyjs/helper-fsm@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.10.tgz#0915e7713fbbb735620a9d3e4fa3d7951f97ac64" - integrity sha512-w2vDtUK9xeSRtt5+RnnlRCI7wHEvLjF0XdnxJpgx+LJOvklTZPqWkuy/NhwHSLP19sm9H8dWxKeReMR7sCkGZA== - -"@webassemblyjs/helper-module-context@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.10.tgz#9beb83f72740f5ac8075313b5cac5e796510f755" - integrity sha512-yE5x/LzZ3XdPdREmJijxzfrf+BDRewvO0zl8kvORgSWmxpRrkqY39KZSq6TSgIWBxkK4SrzlS3BsMCv2s1FpsQ== - -"@webassemblyjs/helper-wasm-bytecode@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.10.tgz#797b1e734bbcfdea8399669cdc58308ef1c7ffc0" - integrity sha512-u5qy4SJ/OrxKxZqJ9N3qH4ZQgHaAzsopsYwLvoWJY6Q33r8PhT3VPyNMaJ7ZFoqzBnZlCcS/0f4Sp8WBxylXfg== - -"@webassemblyjs/helper-wasm-section@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.10.tgz#c0ea3703c615d7bc3e3507c3b7991c8767b2f20e" - integrity sha512-Ecvww6sCkcjatcyctUrn22neSJHLN/TTzolMGG/N7S9rpbsTZ8c6Bl98GpSpV77EvzNijiNRHBG0+JO99qKz6g== - dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/helper-buffer" "1.7.10" - "@webassemblyjs/helper-wasm-bytecode" "1.7.10" - "@webassemblyjs/wasm-gen" "1.7.10" - -"@webassemblyjs/ieee754@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.10.tgz#62c1728b7ef0f66ef8221e2966a0afd75db430df" - integrity sha512-HRcWcY+YWt4+s/CvQn+vnSPfRaD4KkuzQFt5MNaELXXHSjelHlSEA8ZcqT69q0GTIuLWZ6JaoKar4yWHVpZHsQ== +"@webassemblyjs/ast@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" + integrity sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA== + dependencies: + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" + +"@webassemblyjs/floating-point-hex-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" + integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg== + +"@webassemblyjs/helper-api-error@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" + integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg== + +"@webassemblyjs/helper-buffer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" + integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w== + +"@webassemblyjs/helper-code-frame@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" + integrity sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw== + dependencies: + "@webassemblyjs/wast-printer" "1.7.11" + +"@webassemblyjs/helper-fsm@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" + integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A== + +"@webassemblyjs/helper-module-context@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" + integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg== + +"@webassemblyjs/helper-wasm-bytecode@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" + integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ== + +"@webassemblyjs/helper-wasm-section@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" + integrity sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + +"@webassemblyjs/ieee754@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" + integrity sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ== dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/leb128@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.10.tgz#167e0bb4b06d7701585772a73fba9f4df85439f6" - integrity sha512-og8MciYlA8hvzCLR71hCuZKPbVBfLQeHv7ImKZ4nlyxrYbG7uJHYtHiHu6OV9SqrGuD03H/HtXC4Bgdjfm9FHw== +"@webassemblyjs/leb128@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" + integrity sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw== dependencies: "@xtuc/long" "4.2.1" -"@webassemblyjs/utf8@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.10.tgz#b6728f5b6f50364abc155be029f9670e6685605a" - integrity sha512-Ng6Pxv6siyZp635xCSnH3mKmIFgqWPCcGdoo0GBYgyGdxu7cUj4agV7Uu1a8REP66UYUFXJLudeGgd4RvuJAnQ== - -"@webassemblyjs/wasm-edit@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.10.tgz#83fe3140f5a58f5a30b914702be9f0e59a399092" - integrity sha512-e9RZFQlb+ZuYcKRcW9yl+mqX/Ycj9+3/+ppDI8nEE/NCY6FoK8f3dKBcfubYV/HZn44b+ND4hjh+4BYBt+sDnA== - dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/helper-buffer" "1.7.10" - "@webassemblyjs/helper-wasm-bytecode" "1.7.10" - "@webassemblyjs/helper-wasm-section" "1.7.10" - "@webassemblyjs/wasm-gen" "1.7.10" - "@webassemblyjs/wasm-opt" "1.7.10" - "@webassemblyjs/wasm-parser" "1.7.10" - "@webassemblyjs/wast-printer" "1.7.10" - -"@webassemblyjs/wasm-gen@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.10.tgz#4de003806ae29c97ab3707782469b53299570174" - integrity sha512-M0lb6cO2Y0PzDye/L39PqwV+jvO+2YxEG5ax+7dgq7EwXdAlpOMx1jxyXJTScQoeTpzOPIb+fLgX/IkLF8h2yw== - dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/helper-wasm-bytecode" "1.7.10" - "@webassemblyjs/ieee754" "1.7.10" - "@webassemblyjs/leb128" "1.7.10" - "@webassemblyjs/utf8" "1.7.10" - -"@webassemblyjs/wasm-opt@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.10.tgz#d151e31611934a556c82789fdeec41a814993c2a" - integrity sha512-R66IHGCdicgF5ZliN10yn5HaC7vwYAqrSVJGjtJJQp5+QNPBye6heWdVH/at40uh0uoaDN/UVUfXK0gvuUqtVg== - dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/helper-buffer" "1.7.10" - "@webassemblyjs/wasm-gen" "1.7.10" - "@webassemblyjs/wasm-parser" "1.7.10" - -"@webassemblyjs/wasm-parser@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.10.tgz#0367be7bf8f09e3e6abc95f8e483b9206487ec65" - integrity sha512-AEv8mkXVK63n/iDR3T693EzoGPnNAwKwT3iHmKJNBrrALAhhEjuPzo/lTE4U7LquEwyvg5nneSNdTdgrBaGJcA== - dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/helper-api-error" "1.7.10" - "@webassemblyjs/helper-wasm-bytecode" "1.7.10" - "@webassemblyjs/ieee754" "1.7.10" - "@webassemblyjs/leb128" "1.7.10" - "@webassemblyjs/utf8" "1.7.10" - -"@webassemblyjs/wast-parser@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.10.tgz#058f598b52f730b23fc874d4775b6286b6247264" - integrity sha512-YTPEtOBljkCL0VjDp4sHe22dAYSm3ZwdJ9+2NTGdtC7ayNvuip1wAhaAS8Zt9Q6SW9E5Jf5PX7YE3XWlrzR9cw== - dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/floating-point-hex-parser" "1.7.10" - "@webassemblyjs/helper-api-error" "1.7.10" - "@webassemblyjs/helper-code-frame" "1.7.10" - "@webassemblyjs/helper-fsm" "1.7.10" +"@webassemblyjs/utf8@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" + integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA== + +"@webassemblyjs/wasm-edit@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" + integrity sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/helper-wasm-section" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-opt" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + "@webassemblyjs/wast-printer" "1.7.11" + +"@webassemblyjs/wasm-gen@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" + integrity sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + +"@webassemblyjs/wasm-opt@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" + integrity sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-buffer" "1.7.11" + "@webassemblyjs/wasm-gen" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + +"@webassemblyjs/wasm-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" + integrity sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-wasm-bytecode" "1.7.11" + "@webassemblyjs/ieee754" "1.7.11" + "@webassemblyjs/leb128" "1.7.11" + "@webassemblyjs/utf8" "1.7.11" + +"@webassemblyjs/wast-parser@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" + integrity sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/floating-point-hex-parser" "1.7.11" + "@webassemblyjs/helper-api-error" "1.7.11" + "@webassemblyjs/helper-code-frame" "1.7.11" + "@webassemblyjs/helper-fsm" "1.7.11" "@xtuc/long" "4.2.1" -"@webassemblyjs/wast-printer@1.7.10": - version "1.7.10" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.10.tgz#d817909d2450ae96c66b7607624d98a33b84223b" - integrity sha512-mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA== +"@webassemblyjs/wast-printer@1.7.11": + version "1.7.11" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" + integrity sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg== dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/wast-parser" "1.7.10" + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/wast-parser" "1.7.11" "@xtuc/long" "4.2.1" "@xtuc/ieee754@^1.2.0": @@ -292,12 +1054,10 @@ accepts@~1.3.4, accepts@~1.3.5: mime-types "~2.1.18" negotiator "0.6.1" -acorn-dynamic-import@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" - integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg== - dependencies: - acorn "^5.0.0" +acorn-dynamic-import@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948" + integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw== acorn-globals@^1.0.4: version "1.0.9" @@ -323,16 +1083,26 @@ acorn@^3.0.4: resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= -acorn@^5.0.0, acorn@^5.5.0, acorn@^5.6.2: +acorn@^5.5.0: version "5.7.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== +acorn@^6.0.5: + version "6.1.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.0.tgz#b0a3be31752c97a0f7013c5f4903b71a05db6818" + integrity sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw== + after@0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= +ajv-errors@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d" + integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== + ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" @@ -370,11 +1140,21 @@ ansi-align@^2.0.0: dependencies: string-width "^2.0.0" +ansi-colors@^3.0.0: + version "3.2.3" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.3.tgz#57d35b8686e851e2cc04c403f1c00203976a1813" + integrity sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw== + ansi-escapes@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" integrity sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw== +ansi-escapes@^3.1.0, ansi-escapes@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" + integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== + ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" @@ -390,12 +1170,17 @@ ansi-regex@^3.0.0: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= +ansi-regex@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" + integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== + ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -415,13 +1200,6 @@ anymatch@^2.0.0: micromatch "^3.1.4" normalize-path "^2.1.1" -append-buffer@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/append-buffer/-/append-buffer-1.0.2.tgz#d8220cf466081525efea50614f3de6514dfa58f1" - integrity sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE= - dependencies: - buffer-equal "^1.0.0" - append-transform@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-1.0.0.tgz#046a52ae582a228bd72f58acfbe2967c678759ab" @@ -434,6 +1212,37 @@ aproba@^1.0.3, aproba@^1.1.1: resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw== +archiver-utils@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-2.0.0.tgz#5639818a8b5d89d0ffc51b72c39283cf4fea14a1" + integrity sha512-JRBgcVvDX4Mwu2RBF8bBaHcQCSxab7afsxAPYDQ5W+19quIPP5CfKE7Ql+UHs9wYvwsaNR8oDuhtf5iqrKmzww== + dependencies: + glob "^7.0.0" + graceful-fs "^4.1.0" + lazystream "^1.0.0" + lodash.assign "^4.2.0" + lodash.defaults "^4.2.0" + lodash.difference "^4.5.0" + lodash.flatten "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.toarray "^4.4.0" + lodash.union "^4.6.0" + normalize-path "^3.0.0" + readable-stream "^2.0.0" + +archiver@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/archiver/-/archiver-3.0.0.tgz#50b2628cf032adcbf35d35d111b5324db95bfb69" + integrity sha512-5QeR6Xc5hSA9X1rbQfcuQ6VZuUXOaEdB65Dhmk9duuRJHYif/ZyJfuyJqsQrj34PFjU5emv5/MmfgA8un06onw== + dependencies: + archiver-utils "^2.0.0" + async "^2.0.0" + buffer-crc32 "^0.2.1" + glob "^7.0.0" + readable-stream "^2.0.0" + tar-stream "^1.5.0" + zip-stream "^2.0.1" + are-we-there-yet@~1.1.2: version "1.1.5" resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz#4b35c2944f062a8bfcda66410760350fe9ddfc21" @@ -449,19 +1258,12 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - 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" integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= -arr-flatten@^1.0.1, arr-flatten@^1.1.0: +arr-flatten@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== @@ -491,14 +1293,6 @@ array-from@^2.1.1: resolved "https://registry.yarnpkg.com/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= -array-includes@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" - integrity sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0= - 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" @@ -526,6 +1320,11 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= +arraybuffer-equal@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/arraybuffer-equal/-/arraybuffer-equal-1.0.4.tgz#398daeffe5ae3bdb15146196d741dd73b674a578" + integrity sha1-OY2u/+WuO9sVFGGW10Hdc7Z0pXg= + arraybuffer.slice@~0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" @@ -536,6 +1335,11 @@ arrify@^1.0.0: resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= +ascii-table@0.0.9: + version "0.0.9" + resolved "https://registry.yarnpkg.com/ascii-table/-/ascii-table-0.0.9.tgz#06a6604d6a55d4bf41a9a47d9872d7a78da31e73" + integrity sha1-BqZgTWpV1L9BqaR9mHLXp42jHnM= + asn1.js@^4.0.0: version "4.10.1" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz#b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0" @@ -574,7 +1378,12 @@ assign-symbols@^1.0.0: resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= -async-each@^1.0.0: +ast-module-types@^2.3.1, ast-module-types@^2.3.2, ast-module-types@^2.4.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/ast-module-types/-/ast-module-types-2.5.0.tgz#44b8bcd51684329a77f2af6b2587df9ea6b4d5ff" + integrity sha512-dP6vhvatex3Q+OThhvcyGRvHn4noQBg1b8lCNKUAFL05up80hr2pAExveU3YQNDGMhfNPhQit/vzIkkvBPbSXw== + +async-each@^1.0.0, async-each@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" integrity sha1-GdOGodntxufByF04iu28xW0zYC0= @@ -601,11 +1410,6 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atoa@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/atoa/-/atoa-1.0.0.tgz#0cc0e91a480e738f923ebc103676471779b34a49" - integrity sha1-DMDpGkgOc4+SPrwQNnZHF3mzSkk= - atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -630,31 +1434,6 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.25.0, babel-core@^6.26.0: - version "6.26.3" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" - integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA== - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.1" - debug "^2.6.9" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.8" - slash "^1.0.0" - source-map "^0.5.7" - babel-generator@6.11.4: version "6.11.4" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.11.4.tgz#14f6933abb20c62666d27e3b7b9f5b9dc0712a9a" @@ -667,7 +1446,7 @@ babel-generator@6.11.4: lodash "^4.2.0" source-map "^0.5.0" -babel-generator@6.26.1, babel-generator@^6.18.0, babel-generator@^6.26.0: +babel-generator@6.26.1, babel-generator@^6.18.0: version "6.26.1" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA== @@ -681,127 +1460,15 @@ babel-generator@6.26.1, babel-generator@^6.18.0, babel-generator@^6.26.0: source-map "^0.5.7" 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" - integrity sha1-zORReto1b0IgvK6KAsKzRvmlZmQ= - 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" - integrity sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helper-define-map@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz#a5f56dab41a25f97ecb498c7ebaca9819f95be5f" - integrity sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.26.0" - 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" - integrity sha1-8luCz33BBDPFX3BZLVdGQArCLKo= - 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" - integrity sha1-00dbjAPtmCQqJbSDUasYOZ01gKk= - dependencies: - babel-helper-get-function-arity "^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-get-function-arity@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz#8f7782aa93407c41d3aa50908f89b031b1b6853d" - integrity sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-hoist-variables@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz#1ecb27689c9d25513eadbc9914a73f5408be7a76" - integrity sha1-HssnaJydJVE+rbyZFKc/VAi+enY= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-optimise-call-expression@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz#f7a13427ba9f73f8f4fa993c54a97882d1244257" - integrity sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-helper-regex@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" - integrity sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI= - dependencies: - babel-runtime "^6.26.0" - 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" - integrity sha1-XsWBgnrXI/7N04HxySg5BnbkVRs= - 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" - integrity sha1-v22/5Dk40XNpohPKiov3S2qQqxo= - dependencies: - babel-helper-optimise-call-expression "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - integrity sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-loader@^7.1.1: - version "7.1.5" - resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-7.1.5.tgz#e3ee0cd7394aa557e013b02d3e492bfd07aa6d68" - integrity sha512-iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw== +babel-loader@8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.4.tgz#7bbf20cbe4560629e2e41534147692d3fecbdce6" + integrity sha512-fhBhNkUToJcW9nV46v8w87AJOwAJDz84c1CL57n3Stj73FANM/b9TbCUK4YhdOwEyZ+OxhYpdeZDNzSI29Firw== dependencies: find-cache-dir "^1.0.0" loader-utils "^1.0.2" mkdirp "^0.5.1" + util.promisify "^1.0.0" babel-messages@^6.23.0, babel-messages@^6.8.0: version "6.23.0" @@ -810,301 +1477,7 @@ babel-messages@^6.23.0, babel-messages@^6.8.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-check-es2015-constants@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz#35157b101426fd2ffd3da3f75c7d1e91835bbf8a" - integrity sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o= - 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" - integrity sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU= - -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" - integrity sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4= - -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" - integrity sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM= - -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" - integrity sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E= - 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" - integrity sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" - integrity sha1-u8UbSflk1wy42OC5ToICRs46YUE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-block-scoping@^6.23.0: - 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" - integrity sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8= - dependencies: - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - lodash "^4.17.4" - -babel-plugin-transform-es2015-classes@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" - integrity sha1-WkxYpQyclGHlZLSyo7+ryXolhNs= - dependencies: - babel-helper-define-map "^6.24.1" - babel-helper-function-name "^6.24.1" - babel-helper-optimise-call-expression "^6.24.1" - babel-helper-replace-supers "^6.24.1" - babel-messages "^6.23.0" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-computed-properties@^6.22.0: - 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" - integrity sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM= - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-destructuring@^6.23.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" - integrity sha1-mXux8auWf2gtKwh2/jWNYOdlxW0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-duplicate-keys@^6.22.0: - 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" - integrity sha1-c+s9MQypaePvnskcU3QabxV2Qj4= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-for-of@^6.23.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" - integrity sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-function-name@^6.22.0: - 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" - integrity sha1-g0yJhTvDaxrw86TF26qU/Y6sqos= - dependencies: - babel-helper-function-name "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" - integrity sha1-T1SgLWzWbPkVKAAZox0xklN3yi4= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-modules-amd@^6.22.0, 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" - integrity sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ= - dependencies: - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - 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: - version "6.26.2" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" - integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q== - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-es2015-modules-systemjs@^6.23.0: - 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" - integrity sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM= - dependencies: - babel-helper-hoist-variables "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-modules-umd@^6.23.0: - 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" - integrity sha1-rJl+YoXNGO1hdq22B9YCNErThGg= - dependencies: - babel-plugin-transform-es2015-modules-amd "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-plugin-transform-es2015-object-super@^6.22.0: - 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" - integrity sha1-JM72muIcuDp/hgPa0CH1cusnj40= - dependencies: - babel-helper-replace-supers "^6.24.1" - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-parameters@^6.23.0: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" - integrity sha1-V6w1GrScrxSpfNE7CfZv3wpiXys= - dependencies: - babel-helper-call-delegate "^6.24.1" - babel-helper-get-function-arity "^6.24.1" - babel-runtime "^6.22.0" - babel-template "^6.24.1" - babel-traverse "^6.24.1" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-shorthand-properties@^6.22.0: - 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" - integrity sha1-JPh11nIch2YbvZmkYi5R8U3jiqA= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-spread@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz#d6d68a99f89aedc4536c81a542e8dd9f1746f8d1" - integrity sha1-1taKmfia7cRTbIGlQujdnxdG+NE= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-sticky-regex@^6.22.0: - 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" - integrity sha1-AMHNsaynERLN8M9hJsLta0V8zbw= - dependencies: - babel-helper-regex "^6.24.1" - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-plugin-transform-es2015-template-literals@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" - integrity sha1-qEs0UPfp+PH2g51taH2oS7EjbY0= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-typeof-symbol@^6.23.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" - integrity sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I= - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-transform-es2015-unicode-regex@^6.22.0: - 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" - integrity sha1-04sS9C6nMj9yk4fxinxa4frrNek= - dependencies: - babel-helper-regex "^6.24.1" - 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" - integrity sha1-KrDJx/MJj6SJB3cruBP+QejeOg4= - 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: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" - integrity sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8= - dependencies: - regenerator-transform "^0.10.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - integrity sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g= - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-env@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" - integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg== - 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-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-spread "^6.22.0" - babel-plugin-transform-es2015-sticky-regex "^6.22.0" - 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 "^3.2.6" - invariant "^2.2.2" - semver "^5.3.0" - -babel-register@^6.24.0, babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - integrity sha1-btAhFz4vy0htestFxgCahW9kcHE= - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.0.0, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.0: +babel-runtime@^6.0.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -1112,7 +1485,7 @@ babel-runtime@^6.0.0, babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtim core-js "^2.4.0" regenerator-runtime "^0.11.0" -babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: +babel-template@^6.16.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= @@ -1123,7 +1496,7 @@ babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: babylon "^6.18.0" lodash "^4.17.4" -babel-traverse@6.26.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-traverse@^6.26.0: +babel-traverse@6.26.0, babel-traverse@^6.18.0, babel-traverse@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= @@ -1138,7 +1511,7 @@ babel-traverse@6.26.0, babel-traverse@^6.18.0, babel-traverse@^6.24.1, babel-tra invariant "^2.2.2" lodash "^4.17.4" -babel-types@^6.10.2, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: +babel-types@^6.10.2, babel-types@^6.18.0, babel-types@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= @@ -1158,6 +1531,13 @@ backo2@1.0.2: resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" integrity sha1-MasayLEpNjRj41s+u2n038+6eUc= +backoff@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/backoff/-/backoff-2.5.0.tgz#f616eda9d3e4b66b8ca7fca79f695722c5f8e26f" + integrity sha1-9hbtqdPktmuMp/ynn2lXIsX44m8= + dependencies: + precond "0.2" + balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -1203,6 +1583,11 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +before-after-hook@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-1.3.2.tgz#7bfbf844ad670aa7a96b5a4e4e15bd74b08ed66b" + integrity sha512-zyPgY5dgbf99c0uGUjhY4w+mxqEGxPKg9RQDl34VvrVh2bM31lFN+mwR1ZHepq/KA3VCPk1gwJZL6IIJqjLy2w== + better-assert@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522" @@ -1220,22 +1605,35 @@ binary-extensions@^1.0.0: resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" integrity sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg== +bl@^1.0.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.2.tgz#a160911717103c07410cef63ef51b397c025af9c" + integrity sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA== + dependencies: + readable-stream "^2.3.5" + safe-buffer "^5.1.1" + blob@0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.5.tgz#d680eeef25f8cd91ad533f5b01eed48e64caf683" integrity sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig== -bluebird@^3.3.0, bluebird@^3.5.1: +bluebird@^3.3.0: version "3.5.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.2.tgz#1be0908e054a751754549c270489c1505d4ab15a" integrity sha512-dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg== +bluebird@^3.5.3: + version "3.5.3" + resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" + integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== + 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" integrity sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA== -body-parser@1.18.3, body-parser@^1.16.1: +body-parser@1.18.3, body-parser@^1.16.1, body-parser@^1.18.3: version "1.18.3" resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= @@ -1296,16 +1694,7 @@ braces@^0.1.2: dependencies: expand-range "^0.1.0" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -braces@^2.3.0, braces@^2.3.1: +braces@^2.3.0, braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== @@ -1390,13 +1779,19 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^3.2.6: - version "3.2.8" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" - integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== +browserslist@^4.3.4: + version "4.4.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062" + integrity sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A== dependencies: - caniuse-lite "^1.0.30000844" - electron-to-chromium "^1.3.47" + caniuse-lite "^1.0.30000929" + electron-to-chromium "^1.3.103" + node-releases "^1.1.3" + +btoa-lite@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337" + integrity sha1-M3dm2hWAEhD92VbCLpxokaudAzc= buffer-alloc-unsafe@^1.1.0: version "1.1.0" @@ -1411,10 +1806,10 @@ buffer-alloc@^1.2.0: buffer-alloc-unsafe "^1.1.0" buffer-fill "^1.0.0" -buffer-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-1.0.0.tgz#59616b498304d556abd466966b22eeda3eca5fbe" - integrity sha1-WWFrSYME1Var1GaWayLu2j7KX74= +buffer-crc32@^0.2.1: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI= buffer-fill@^1.0.0: version "1.0.0" @@ -1445,6 +1840,14 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" +buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.2.1.tgz#dd57fa0f109ac59c602479044dca7b8b3d0b71d6" + integrity sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg== + dependencies: + base64-js "^1.0.2" + ieee754 "^1.1.4" + builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -1460,23 +1863,24 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -cacache@^10.0.4: - version "10.0.4" - resolved "https://registry.yarnpkg.com/cacache/-/cacache-10.0.4.tgz#6452367999eff9d4188aefd9a14e9d7c6a263460" - integrity sha512-Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA== - dependencies: - bluebird "^3.5.1" - chownr "^1.0.1" - glob "^7.1.2" - graceful-fs "^4.1.11" - lru-cache "^4.1.1" - mississippi "^2.0.0" +cacache@^11.0.2: + version "11.3.2" + resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa" + integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg== + dependencies: + bluebird "^3.5.3" + chownr "^1.1.1" + figgy-pudding "^3.5.1" + glob "^7.1.3" + graceful-fs "^4.1.15" + lru-cache "^5.1.1" + mississippi "^3.0.0" mkdirp "^0.5.1" move-concurrently "^1.0.1" promise-inflight "^1.0.1" rimraf "^2.6.2" - ssri "^5.2.4" - unique-filename "^1.1.0" + ssri "^6.0.1" + unique-filename "^1.1.1" y18n "^4.0.0" cache-base@^1.0.1: @@ -1511,33 +1915,15 @@ callsites@^0.2.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - integrity sha1-MIvur/3ygRkFHvodkyITyRuPkuc= - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - integrity sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8= - -camelcase@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a" - integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo= - camelcase@^4.0.0, camelcase@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= -caniuse-lite@^1.0.30000844: - version "1.0.30000903" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000903.tgz#86d46227759279b3db345ddbe778335dbba9e858" - integrity sha512-T1XVJEpGCoaq7MDw7/6hCdYUukmSaS+1l/OQJkLtw7Cr2+/+d67tNGKEbyiqf7Ck8x6EhNFUxjYFXXka0N/w5g== +caniuse-lite@^1.0.30000929: + version "1.0.30000936" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000936.tgz#5d33b118763988bf721b9b8ad436d0400e4a116b" + integrity sha512-orX4IdpbFhdNO7bTBhSbahp1EBpqzBc+qrvTRVUFfZgA4zta7TdM6PN5ZxkEUgDnz36m+PfWGcdX7AVfFWItJw== capture-stack-trace@^1.0.0: version "1.0.1" @@ -1557,7 +1943,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chai@^4.2.0: +chai@4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/chai/-/chai-4.2.0.tgz#760aa72cf20e3795e84b12877ce0e83737aa29e5" integrity sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw== @@ -1589,11 +1975,25 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.4.1: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^2.3.1, chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" integrity sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I= +chardet@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" + integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== + check-error@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" @@ -1666,7 +2066,26 @@ chokidar@^2.0.0, chokidar@^2.0.2, chokidar@^2.0.3: optionalDependencies: fsevents "^1.2.2" -chownr@^1.0.1: +chokidar@^2.0.4: + version "2.1.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.0.tgz#5fcb70d0b28ebe0867eb0f09d5f6a08f29a1efa0" + integrity sha512-5t6G2SH8eO6lCvYOoUpaRnF5Qfd//gd7qJAkwRUw9qlGVkiQ13uwQngqbWWaurOsaAm9+kUGbITADxt6H0XFNQ== + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.0" + optionalDependencies: + fsevents "^1.2.7" + +chownr@^1.0.1, chownr@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.1.tgz#54726b8b8fff4df053c42187e801fb4412df1494" integrity sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g== @@ -1695,6 +2114,11 @@ ci-info@^1.5.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" integrity sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A== +ci-info@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" + integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== + 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" @@ -1723,6 +2147,25 @@ class-utils@^0.3.5: isobject "^3.0.0" static-extend "^0.1.1" +clean-deep@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/clean-deep/-/clean-deep-3.0.2.tgz#1b7096822f289cc491ca6d85af5c028cbb22fc23" + integrity sha512-sLUtFxYtHc3jM9pmwyYXOLln0nnQ1OhFrefQ7nqUlva1crHDbi4gVO+nnMSm5jztFXIRDMt+kMNh0mOscbARow== + dependencies: + lodash.isempty "^4.4.0" + lodash.isplainobject "^4.0.6" + lodash.transform "^4.6.0" + +clean-stack@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-1.3.0.tgz#9e821501ae979986c46b1d66d2d432db2fd4ae31" + integrity sha1-noIVAa6XmYbEax1m0tQy2y/UrjE= + +clean-stack@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.0.0.tgz#301bfa9e8dd2d3d984c0e542f7aa67b996f63e0a" + integrity sha512-VEoL9Qh7I8s8iHnV53DaeWSt8NJ0g3khMfK6NiCPB7H657juhro+cSw2O88uo3bo0c0X5usamtXk0/Of0wXa5A== + cli-boxes@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" @@ -1735,35 +2178,73 @@ cli-cursor@^2.1.0: dependencies: restore-cursor "^2.0.0" -cli-table@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/cli-table/-/cli-table-0.3.1.tgz#f53b05266a8b1a0b934b3d0821e6e2dc5914ae23" - integrity sha1-9TsFJmqLGguTSz0IIebi3FkUriM= - dependencies: - colors "1.0.3" +cli-spinners@^1.1.0, cli-spinners@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-1.3.1.tgz#002c1990912d0d59580c93bd36c056de99e4259a" + integrity sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg== + +cli-ux@^4.9.0: + version "4.9.3" + resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-4.9.3.tgz#4c3e070c1ea23eef010bbdb041192e0661be84ce" + integrity sha512-/1owvF0SZ5Gn54cgrikJ0QskgTzeg30HGjkmjFoaHDJzAqFpuX1DBpFR8aLvsE1J5s9MgeYRENQK4BFwOag5VA== + dependencies: + "@oclif/errors" "^1.2.2" + "@oclif/linewrap" "^1.0.0" + "@oclif/screen" "^1.0.3" + ansi-escapes "^3.1.0" + ansi-styles "^3.2.1" + cardinal "^2.1.1" + chalk "^2.4.1" + clean-stack "^2.0.0" + extract-stack "^1.0.0" + fs-extra "^7.0.0" + hyperlinker "^1.0.0" + indent-string "^3.2.0" + is-wsl "^1.1.0" + lodash "^4.17.11" + password-prompt "^1.0.7" + semver "^5.6.0" + strip-ansi "^5.0.0" + supports-color "^5.5.0" + supports-hyperlinks "^1.0.1" + treeify "^1.1.0" + tslib "^1.9.3" -cli-usage@^0.1.2: - version "0.1.8" - resolved "https://registry.yarnpkg.com/cli-usage/-/cli-usage-0.1.8.tgz#16479361f3a895a81062d02d9634827c713aaaf8" - integrity sha512-EZJ+ty1TsqdnhZNt2QbI+ed3IUNHTH31blSOJLVph3oL4IExskPRyCDGJH7RuCBPy3QBmWgpbeUxXPhK0isXIw== - dependencies: - marked "^0.5.0" - marked-terminal "^3.0.0" +cli-ux@^5.0.0, cli-ux@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cli-ux/-/cli-ux-5.1.0.tgz#945c672bb835f68f590924cbf83b975743299c64" + integrity sha512-cSBrgGkS1yDC7aHVZU9+TzLdqyvHumyyKXs3Ts4q3YKzOPFy2d9EaNkBgeV5JVR4gdCwNJuQJhYTXguewE70lA== + dependencies: + "@oclif/command" "^1.5.1" + "@oclif/errors" "^1.2.1" + "@oclif/linewrap" "^1.0.0" + "@oclif/screen" "^1.0.3" + ansi-escapes "^3.1.0" + ansi-styles "^3.2.1" + cardinal "^2.1.1" + chalk "^2.4.1" + clean-stack "^2.0.0" + extract-stack "^1.0.0" + fs-extra "^7.0.0" + hyperlinker "^1.0.0" + indent-string "^3.2.0" + is-wsl "^1.1.0" + lodash "^4.17.11" + natural-orderby "^1.0.2" + password-prompt "^1.0.7" + semver "^5.6.0" + string-width "^2.1.1" + strip-ansi "^5.0.0" + supports-color "^5.5.0" + supports-hyperlinks "^1.0.1" + treeify "^1.1.0" + tslib "^1.9.3" cli-width@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= -cliui@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - cliui@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" @@ -1773,29 +2254,10 @@ cliui@^4.0.0: strip-ansi "^4.0.0" wrap-ansi "^2.0.0" -clone-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" - integrity sha1-4+JbIHrE5wGvch4staFnksrD3Fg= - -clone-stats@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" - integrity sha1-s3gt/4u1R04Yuba/D9/ngvh3doA= - -clone@^2.1.1: - version "2.1.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" - integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= - -cloneable-readable@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65" - integrity sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg== - dependencies: - inherits "^2.0.1" - process-nextick-args "^2.0.0" - readable-stream "^2.3.5" +clone@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" + integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= co@^4.6.0: version "4.6.0" @@ -1847,6 +2309,11 @@ colors@^1.1.0: resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== +colors@^1.1.2: + version "1.3.3" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.3.tgz#39e005d546afe01e01f9c4ca8fa50f686a01205d" + integrity sha512-mmGt/1pZqYRjMxB1axhTo16/snVZ5krrKkcmMeVKxzECMMXoCgnvTPp10QgHfcbQZw8Dq2jMNG6je4JlWU0gWg== + combine-lists@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/combine-lists/-/combine-lists-1.0.1.tgz#458c07e09e0d900fc28b70a3fec2dacd1d2cb7f6" @@ -1866,10 +2333,10 @@ commander@2.15.1: resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag== -commander@~2.13.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" - integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== +commander@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" + integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== commander@~2.17.1: version "2.17.1" @@ -1901,6 +2368,16 @@ component-inherit@0.0.3: resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" integrity sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM= +compress-commons@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.2.tgz#524a9f10903f3a813389b0225d27c48bb751890f" + integrity sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8= + dependencies: + buffer-crc32 "^0.2.1" + crc32-stream "^2.0.0" + normalize-path "^2.0.0" + readable-stream "^2.0.0" + compressible@~2.0.14: version "2.0.15" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.15.tgz#857a9ab0a7e5a07d8d837ed43fe2defff64fe212" @@ -1948,6 +2425,18 @@ configstore@^3.0.0: write-file-atomic "^2.0.0" xdg-basedir "^3.0.0" +configstore@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/configstore/-/configstore-4.0.0.tgz#5933311e95d3687efb592c528b922d9262d227e7" + integrity sha512-CmquAXFBocrzaSM8mtGPMM/HiWmyIpr4CcJl/rgY2uCObZ/S7cKU0silxslqJejl+t/T9HS8E0PUNQD81JGUEQ== + dependencies: + dot-prop "^4.1.0" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + 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" @@ -1990,20 +2479,12 @@ content-disposition@0.5.2: resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= -content-type@~1.0.4: +content-type@^1.0.4, content-type@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== -contra@^1.6.8: - version "1.9.4" - resolved "https://registry.yarnpkg.com/contra/-/contra-1.9.4.tgz#f53bde42d7e5b5985cae4d99a8d610526de8f28d" - integrity sha1-9TveQtfltZhcrk2ZqNYQUm3o8o0= - dependencies: - atoa "1.0.0" - ticky "1.0.1" - -convert-source-map@^1.5.0, convert-source-map@^1.5.1: +convert-source-map@^1.1.0, convert-source-map@^1.5.0: version "1.6.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.6.0.tgz#51b537a8c43e0f04dec1993bffcdd504e758ac20" integrity sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A== @@ -2037,11 +2518,16 @@ copy-descriptor@^0.1.0: resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= -core-js@^2.2.0, core-js@^2.4.0, core-js@^2.5.0: +core-js@^2.2.0, core-js@^2.4.0: version "2.5.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" integrity sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw== +core-js@^2.5.7: + version "2.6.4" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.4.tgz#b8897c062c4d769dd30a0ac5c73976c47f92ea0d" + integrity sha512-05qQ5hXShcqGkPZpXEFLIpxayZscVD2kuMBZewxiIPPEagukO4mqgPA9CWhUvFBJfy3ODdK2p9xyHh7FTU9/7A== + core-js@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.3.0.tgz#fab83fbb0b2d8dc85fa636c4b9d34c75420c6d65" @@ -2057,6 +2543,21 @@ corser@~2.0.0: resolved "https://registry.yarnpkg.com/corser/-/corser-2.0.1.tgz#8eda252ecaab5840dcd975ceb90d9370c819ff87" integrity sha1-jtolLsqrWEDc2XXOuQ2TcMgZ/4c= +crc32-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" + integrity sha1-483TtN8xaN10494/u8t7KX/pCPQ= + dependencies: + crc "^3.4.4" + readable-stream "^2.0.0" + +crc@^3.4.4: + version "3.8.0" + resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6" + integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ== + dependencies: + buffer "^5.1.0" + create-ecdh@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz#c9111b6f33045c4697f144787f9254cdc77c45ff" @@ -2095,14 +2596,6 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -cross-env@^5.0.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.2.0.tgz#6ecd4c015d5773e614039ee529076669b9d126f2" - integrity sha512-jtdNFfFW1hB7sMhr/H6rW1Z45LFqyI431m3qU6bFXcQ3Eh7LtBuG3h74o7ohHZ3crrRkkqHlo4jYHFPcjroANg== - dependencies: - cross-spawn "^6.0.5" - is-windows "^1.0.0" - cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -2213,7 +2706,7 @@ date-now@^0.1.4: resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" integrity sha1-6vQ5/U1ISK105cx9vvIAZyueNFs= -debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.6, debug@^2.6.8, debug@^2.6.9: +debug@2.6.9, debug@^2.1.2, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== @@ -2234,17 +2727,19 @@ debug@4.1.0: dependencies: ms "^2.1.1" -debug@^3.1.0: +debug@^3.1.0, debug@^3.2.5: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ== dependencies: ms "^2.1.1" -decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= +debug@^4.0.0, debug@^4.1.0, debug@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791" + integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw== + dependencies: + ms "^2.1.1" decamelize@^2.0.0: version "2.0.0" @@ -2280,6 +2775,19 @@ deep-is@^0.1.3, deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deepmerge@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-3.1.0.tgz#a612626ce4803da410d77554bfd80361599c034d" + integrity sha512-/TnecbwXEdycfbsM2++O3eGiatEFHjjNciHEwJclM+T5Kd94qD1AP+2elP/Mq0L5b9VZJao5znR01Mz6eX8Seg== + +default-gateway@^2.6.0: + version "2.7.2" + resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-2.7.2.tgz#b7ef339e5e024b045467af403d50348db4642d0f" + integrity sha512-lAc4i9QJR0YHSDFdzeBQKfZ1SRDG3hsJNEkrpcZa8QhBfidLAilT60BDEIVUUGqosFp425KOgB3uYqcnQrWafQ== + dependencies: + execa "^0.10.0" + ip-regex "^2.1.0" + default-require-extensions@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-2.0.0.tgz#f5f8fbb18a7d6d50b21f641f649ebb522cfe24f7" @@ -2287,6 +2795,13 @@ default-require-extensions@^2.0.0: dependencies: strip-bom "^3.0.0" +defaults@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" + integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= + dependencies: + clone "^1.0.2" + define-properties@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -2390,11 +2905,87 @@ detect-libc@^1.0.2: resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups= -detect-node@^2.0.3: +detect-node@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== +detective-amd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/detective-amd/-/detective-amd-3.0.0.tgz#40c8e21e229df8bca1ee2d4b952a7b67b01e2a5a" + integrity sha512-kOpKHyabdSKF9kj7PqYHLeHPw+TJT8q2u48tZYMkIcas28el1CYeLEJ42Nm+563/Fq060T5WknfwDhdX9+kkBQ== + dependencies: + ast-module-types "^2.3.1" + escodegen "^1.8.0" + get-amd-module-type "^3.0.0" + node-source-walk "^4.0.0" + +detective-cjs@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/detective-cjs/-/detective-cjs-3.1.1.tgz#18da3e39a002d2098a1123d45ce1de1b0d9045a0" + integrity sha512-JQtNTBgFY6h8uT6pgph5QpV3IyxDv+z3qPk/FZRDT9TlFfm5dnRtpH39WtQEr1khqsUxVqXzKjZHpdoQvQbllg== + dependencies: + ast-module-types "^2.4.0" + node-source-walk "^4.0.0" + +detective-es6@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/detective-es6/-/detective-es6-2.0.0.tgz#e2919c33140cca54013b934cafa83c6e01509247" + integrity sha512-lo2kHVepcq3v39Q/t5uY6sy3cK1g29Kgi4Sj4KpR/15WGwecwma1yaEzZoofyJg/QyeOz36DZhouJ3eD46efCg== + dependencies: + node-source-walk "^4.0.0" + +detective-less@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/detective-less/-/detective-less-1.0.2.tgz#a68af9ca5f69d74b7d0aa190218b211d83b4f7e3" + integrity sha512-Rps1xDkEEBSq3kLdsdnHZL1x2S4NGDcbrjmd4q+PykK5aJwDdP5MBgrJw1Xo+kyUHuv3JEzPqxr+Dj9ryeDRTA== + dependencies: + debug "^4.0.0" + gonzales-pe "^4.2.3" + node-source-walk "^4.0.0" + +detective-postcss@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/detective-postcss/-/detective-postcss-3.0.0.tgz#d7effb236fedbae823721eb9ebaefabefe13d02c" + integrity sha512-Dq4pza3UAT5gXHmNjinxhTydKGd9m3Tr6d0epP9VBipQfQl/ipe3ml7ybxpHk4TRwT2RPXKRsnCHhXfEdpksAQ== + dependencies: + debug "^3.1.0" + is-url "^1.2.4" + postcss "^7.0.2" + postcss-values-parser "^1.5.0" + +detective-sass@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/detective-sass/-/detective-sass-3.0.1.tgz#496b819efd1f5c4dd3f0e19b43a8634bdd6927c4" + integrity sha512-oSbrBozRjJ+QFF4WJFbjPQKeakoaY1GiR380NPqwdbWYd5wfl5cLWv0l6LsJVqrgWfFN1bjFqSeo32Nxza8Lbw== + dependencies: + debug "^4.1.1" + gonzales-pe "^4.2.3" + node-source-walk "^4.0.0" + +detective-scss@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/detective-scss/-/detective-scss-2.0.1.tgz#06f8c21ae6dedad1fccc26d544892d968083eaf8" + integrity sha512-VveyXW4WQE04s05KlJ8K0bG34jtHQVgTc9InspqoQxvnelj/rdgSAy7i2DXAazyQNFKlWSWbS+Ro2DWKFOKTPQ== + dependencies: + debug "^4.1.1" + gonzales-pe "^4.2.3" + node-source-walk "^4.0.0" + +detective-stylus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/detective-stylus/-/detective-stylus-1.0.0.tgz#50aee7db8babb990381f010c63fabba5b58e54cd" + integrity sha1-UK7n24uruZA4HwEMY/q7pbWOVM0= + +detective-typescript@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/detective-typescript/-/detective-typescript-4.1.2.tgz#796ef6215a948ce3a11ec7e787a6c2c03db62d35" + integrity sha512-jeQMIN/0hjMdMpFGoo9y+ibo+dTb1Vbg6z/peHoRMR69jqH691kgz1gT5XM5UfkDD/Ru0save1bSJBmUr2yjvQ== + dependencies: + node-source-walk "^4.0.0" + typescript "^3.0.3" + typescript-eslint-parser "^18.0.0" + di@^0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/di/-/di-0.0.1.tgz#806649326ceaa7caa3306d75d985ea2748ba913c" @@ -2517,7 +3108,7 @@ domutils@^1.5.1: dom-serializer "0" domelementtype "1" -dot-prop@^4.1.0: +dot-prop@^4.1.0, dot-prop@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.2.0.tgz#1f19e0c2e1aa0e32797c49799f2837ac6af69c57" integrity sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ== @@ -2562,10 +3153,15 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.47: - version "1.3.83" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.83.tgz#74584eb0972bb6777811c5d68d988c722f5e6666" - integrity sha512-DqJoDarxq50dcHsOOlMLNoy+qQitlMNbYb6wwbE0oUw2veHdRkpNrhmngiUYKMErdJ8SJ48rpJsZTQgy5SoEAA== +electron-to-chromium@^1.3.103: + version "1.3.113" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9" + integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g== + +elf-tools@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/elf-tools/-/elf-tools-1.1.1.tgz#b71bbdd37a9474bde2ad7a86057982da7b166582" + integrity sha512-SZSL+FS1mooDVRc3js6jUsEtzVrTaFxjqE8aQzyfmABGBW1UvhT6LQzY305vIGaxazY3bKIbxwsYsWynkYeggA== elliptic@^6.0.0: version "6.4.1" @@ -2580,6 +3176,11 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" @@ -2668,25 +3269,26 @@ errno@^0.1.3, errno@~0.1.7: dependencies: prr "~1.0.1" -error-ex@^1.2.0: +error-ex@^1.2.0, error-ex@^1.3.1: version "1.3.2" resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== dependencies: is-arrayish "^0.2.1" -es-abstract@^1.7.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.12.0.tgz#9dbbdd27c6856f0001421ca18782d786bf8a6165" - integrity sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA== +es-abstract@^1.5.1: + version "1.13.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.13.0.tgz#ac86145fdd5099d8dd49558ccba2eaf9b88e24e9" + integrity sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg== dependencies: - es-to-primitive "^1.1.1" + es-to-primitive "^1.2.0" function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" + has "^1.0.3" + is-callable "^1.1.4" is-regex "^1.0.4" + object-keys "^1.0.12" -es-to-primitive@^1.1.1: +es-to-primitive@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.0.tgz#edf72478033456e8dda8ef09e00ad9650707f377" integrity sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg== @@ -2736,7 +3338,7 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= -escodegen@^1.6.1: +escodegen@^1.6.1, escodegen@^1.8.0: version "1.11.0" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" integrity sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw== @@ -2886,6 +3488,13 @@ eslint-plugin-import@^2.9.0: read-pkg-up "^2.0.0" resolve "^1.6.0" +eslint-plugin-mocha@^5.2.1: + version "5.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-mocha/-/eslint-plugin-mocha-5.2.1.tgz#a6f917a939effe6bbf69ca2b046da9945545eef4" + integrity sha512-v95cxwpPiyt2Gb/Moog8KQtaT+KlGGMbqpOkcP/eIkvaovPEcTprOYywAOo1On+KDsfEbJ4mByfcfUEwrxH9Gw== + dependencies: + ramda "^0.26.1" + eslint-plugin-node@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-node/-/eslint-plugin-node-6.0.1.tgz#bf19642298064379315d7a4b2a75937376fa05e4" @@ -2906,6 +3515,13 @@ eslint-plugin-standard@^3.0.1: resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz#2a9e21259ba4c47c02d53b2d0c9135d4b1022d47" integrity sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w== +eslint-plugin-typescript@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-typescript/-/eslint-plugin-typescript-0.12.0.tgz#e23d58cb27fe28e89fc641a1f20e8d862cb99aef" + integrity sha512-2+DNE8nTvdNkhem/FBJXLPSeMDOZL68vHHNfTbM+PBc5iAuwBe8xLSQubwKxABqSZDwUHg+mwGmv5c2NlImi0Q== + dependencies: + requireindex "~1.1.0" + eslint-scope@^3.7.1: version "3.7.3" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" @@ -3028,12 +3644,12 @@ events@^1.0.0: resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= -eventsource@0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-0.1.6.tgz#0acede849ed7dd1ccc32c811bb11b944d4f29232" - integrity sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI= +eventsource@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" + integrity sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ== dependencies: - original ">=0.0.5" + original "^1.0.0" evp_bytestokey@^1.0.0, evp_bytestokey@^1.0.3: version "1.0.3" @@ -3056,19 +3672,6 @@ execa@^0.10.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -execa@^0.6.1: - version "0.6.3" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.6.3.tgz#57b69a594f081759c69e5370f0d17b9cb11658fe" - integrity sha1-V7aaWU8IF1nGnlNw8NF7nLEWWP4= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -3091,13 +3694,6 @@ expand-braces@^0.1.1: array-unique "^0.2.1" braces "^0.1.2" -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - 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" @@ -3119,14 +3715,14 @@ expand-range@^0.1.0: is-number "^0.1.1" repeat-string "^0.2.2" -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= +express-logging@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/express-logging/-/express-logging-1.1.1.tgz#62839618cbab5bb3610f1a1c1485352fe9d26c2a" + integrity sha1-YoOWGMurW7NhDxocFIU1L+nSbCo= dependencies: - fill-range "^2.1.0" + on-headers "^1.0.0" -express@^4.16.2: +express@^4.16.2, express@^4.16.4: version "4.16.4" resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== @@ -3191,12 +3787,14 @@ external-editor@^2.0.4: iconv-lite "^0.4.17" tmp "^0.0.33" -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= +external-editor@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" + integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== dependencies: - is-extglob "^1.0.0" + chardet "^0.7.0" + iconv-lite "^0.4.24" + tmp "^0.0.33" extglob@^2.0.4: version "2.0.4" @@ -3212,6 +3810,11 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extract-stack@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/extract-stack/-/extract-stack-1.0.0.tgz#b97acaf9441eea2332529624b732fc5a1c8165fa" + integrity sha1-uXrK+UQe6iMyUpYktzL8WhyBZfo= + extract-zip@^1.6.7: version "1.6.7" resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" @@ -3247,7 +3850,7 @@ fast-json-stable-stringify@^2.0.0: resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= -fast-levenshtein@~2.0.4: +fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= @@ -3259,7 +3862,7 @@ faye-websocket@^0.10.0: dependencies: websocket-driver ">=0.5.1" -faye-websocket@~0.11.0: +faye-websocket@~0.11.1: version "0.11.1" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.1.tgz#f0efe18c4f56e4f40afc7e06c719fd5ee6188f38" integrity sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg= @@ -3273,6 +3876,11 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" +figgy-pudding@^3.5.1: + version "3.5.1" + resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" + integrity sha512-vNKxJHTEKNThjfrdJwHc7brvM6eVevuO5nTj6ez8ZQ1qbXTvGthucRF7S4vf2cr71QVnT70V34v0S1DyQsti0w== + figures@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" @@ -3288,11 +3896,6 @@ file-entry-cache@^2.0.0: flat-cache "^1.2.1" object-assign "^4.0.1" -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - fileset@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" @@ -3301,17 +3904,6 @@ fileset@^2.0.3: glob "^7.0.3" minimatch "^3.0.3" -fill-range@^2.1.0: - version "2.2.4" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q== - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.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" @@ -3357,6 +3949,15 @@ find-cache-dir@^1.0.0: make-dir "^1.0.0" pkg-dir "^2.0.0" +find-cache-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.0.0.tgz#4c1faed59f45184530fb9d7fa123a4d04a98472d" + integrity sha512-LDUY6V1Xs5eFskUVYtIwatojt6+9xC9Chnlk/jYOOvn3FAFfSaWddxahDGyNHh0b2dMXa6YW2m0tk8TdVaXHlA== + dependencies: + commondir "^1.0.1" + make-dir "^1.0.0" + pkg-dir "^3.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" @@ -3389,7 +3990,17 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" -flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: +flatted@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.0.tgz#55122b6536ea496b4b44893ee2608141d10d9916" + integrity sha512-R+H8IZclI8AAkSBRQJLVOsxwAoHd6WC40b4QTNWIjzAa6BXOBfQcM587MXDTVPeYaopFNWHUFLx7eNmHDSxMWg== + +flatten@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" + integrity sha1-2uRqnXj74lKSJYzB54CkHZXAN4I= + +flush-write-stream@^1.0.0: version "1.0.3" resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.0.3.tgz#c5d586ef38af6097650b49bc41b55fabb19f35bd" integrity sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw== @@ -3397,6 +4008,21 @@ flush-write-stream@^1.0.0, flush-write-stream@^1.0.2: inherits "^2.0.1" readable-stream "^2.0.4" +flush-write-stream@^1.0.3: + version "1.1.1" + resolved "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz#8dd7d873a1babc207d94ead0c2e0e44276ebf2e8" + integrity sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w== + dependencies: + inherits "^2.0.3" + readable-stream "^2.3.6" + +folder-walker@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/folder-walker/-/folder-walker-3.2.0.tgz#98e00e59773f43416a6dcf0926d4c9436f65121d" + integrity sha512-VjAQdSLsl6AkpZNyrQJfO7BXLo4chnStqb055bumZMbRUPpVuPN3a4ktsnRCmrFZjtMlYLkyXiR5rAs4WOpC4Q== + dependencies: + from2 "^2.1.0" + follow-redirects@^1.0.0: version "1.5.9" resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.9.tgz#c9ed9d748b814a39535716e531b9196a845d89c6" @@ -3404,18 +4030,11 @@ follow-redirects@^1.0.0: dependencies: debug "=3.1.0" -for-in@^1.0.1, for-in@^1.0.2: +for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -3447,7 +4066,14 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= -from2@^2.1.0: +from2-array@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/from2-array/-/from2-array-0.0.4.tgz#eafc16b65f6e2719bcd57fdc1869005ac1332cd6" + integrity sha1-6vwWtl9uJxm81X/cGGkAWsEzLNY= + dependencies: + from2 "^2.0.3" + +from2@^2.0.3, from2@^2.1.0: version "2.3.0" resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af" integrity sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8= @@ -3462,6 +4088,11 @@ fs-access@^1.0.0: dependencies: null-check "^1.0.0" +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + fs-extra@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-1.0.0.tgz#cd3ce5f7e7cb6145883fcae3191e9877f8587950" @@ -3480,6 +4111,15 @@ fs-extra@5.0.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^7.0.0, fs-extra@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz#4f189c44aa123b895f722804f55ea23eadc348e9" + integrity sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw== + dependencies: + graceful-fs "^4.1.2" + jsonfile "^4.0.0" + universalify "^0.1.0" + fs-minipass@^1.2.5: version "1.2.5" resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-1.2.5.tgz#06c277218454ec288df77ada54a03b8702aacb9d" @@ -3487,14 +4127,6 @@ fs-minipass@^1.2.5: dependencies: minipass "^2.2.1" -fs-mkdirp-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz#0b7815fc3201c6a69e14db98ce098c16935259eb" - integrity sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes= - dependencies: - graceful-fs "^4.1.11" - through2 "^2.0.3" - fs-write-stream-atomic@^1.0.8: version "1.0.10" resolved "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz#b47df53493ef911df75731e70a9ded0189db40c9" @@ -3518,6 +4150,14 @@ fsevents@^1.2.2: nan "^2.9.2" node-pre-gyp "^0.10.0" +fsevents@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.7.tgz#4851b664a3783e52003b3c66eb0eee1074933aa4" + integrity sha512-Pxm6sI2MeBD7RdD12RYsqaP0nMiwx8eZBXCa6z2L+mRHm2DYrOYwihmhjpkdjUHwQhslWQjRpEgNq4XvBmaAuw== + dependencies: + nan "^2.9.2" + node-pre-gyp "^0.10.0" + function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -3542,6 +4182,14 @@ gauge@~2.7.3: strip-ansi "^3.0.1" wide-align "^1.1.0" +get-amd-module-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-amd-module-type/-/get-amd-module-type-3.0.0.tgz#bb334662fa04427018c937774570de495845c288" + integrity sha512-99Q7COuACPfVt18zH9N4VAMyb81S6TUgJm2NgV6ERtkh9VIkAaByZkW530wl3lLN5KTtSrK9jVLxYsoP5hQKsw== + dependencies: + ast-module-types "^2.3.2" + node-source-walk "^4.0.0" + get-caller-file@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" @@ -3552,6 +4200,11 @@ get-func-name@^2.0.0: resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= +get-port@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-port/-/get-port-4.1.0.tgz#93eb3d5552c197497d76e9c389a6ac9920e20192" + integrity sha512-4/fqAYrzrzOiqDrdeZRKXGdTGgbkfTEumGlNQPeP6Jy8w0PzN9mzeNQ3XgHaTNie8pQ3hOUkrwlZt2Fzk5H9mA== + get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" @@ -3574,34 +4227,25 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -git-commit-info@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/git-commit-info/-/git-commit-info-1.0.0.tgz#9e0eb55b245fac9d74f59d7d0c9c58f0ee2df74b" - integrity sha1-ng61WyRfrJ109Z19DJxY8O4t90s= +git-remote-origin-url@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz#5282659dae2107145a11126112ad3216ec5fa65f" + integrity sha1-UoJlna4hBxRaERJhEq0yFuxfpl8= dependencies: - execa "^0.6.1" - is-git-repository "^1.1.1" - path-is-absolute "^1.0.1" + gitconfiglocal "^1.0.0" + pify "^2.3.0" -git-tag-version@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/git-tag-version/-/git-tag-version-1.3.1.tgz#39458c3f891b8e6fd31cf3dbfa20675b437adcec" - integrity sha512-bhMl/aTCduq+Ll+Cw0sBz7zp8eIIZ6zv2mmYP2SiMdQoPtKSaVLGYDE9vcsDbbQt53zNnyi9CUbWOYJIzHrrFg== - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" +git-repo-info@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.0.tgz#13d1f753c75bc2994432e65a71e35377ff563813" + integrity sha512-+kigfDB7j3W80f74BoOUX+lKOmf4pR3/i2Ww6baKTCPe2hD4FRdjhV3s4P5Dy0Tak1uY1891QhKoYNtnyX2VvA== -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= +gitconfiglocal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz#41d045f3851a5ea88f03f24ca1c6178114464b9b" + integrity sha1-QdBF84UaXqiPA/JMocYXgRRGS5s= dependencies: - is-glob "^2.0.0" + ini "^1.3.2" glob-parent@^3.1.0: version "3.1.0" @@ -3611,22 +4255,6 @@ glob-parent@^3.1.0: is-glob "^3.1.0" path-dirname "^1.0.0" -glob-stream@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-6.1.0.tgz#7045c99413b3eb94888d83ab46d0b404cc7bdde4" - integrity sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ= - dependencies: - extend "^3.0.0" - glob "^7.1.1" - glob-parent "^3.1.0" - is-negated-glob "^1.0.0" - ordered-read-streams "^1.0.0" - pumpify "^1.3.5" - readable-stream "^2.1.5" - remove-trailing-separator "^1.0.1" - to-absolute-glob "^2.0.0" - unique-stream "^2.0.2" - glob@7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -3639,7 +4267,7 @@ glob@7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -3696,6 +4324,13 @@ globby@^6.1.0: pify "^2.0.0" pinkie-promise "^2.0.0" +gonzales-pe@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/gonzales-pe/-/gonzales-pe-4.2.3.tgz#41091703625433285e0aee3aa47829fc1fbeb6f2" + integrity sha512-Kjhohco0esHQnOiqqdJeNz/5fyPkOMD/d6XVjwTAoPGUFh0mCollPUTUTa2OZy4dYNAqlPIQdTiNzJTWdd9Htw== + dependencies: + minimist "1.1.x" + got@^6.7.1: version "6.7.1" resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" @@ -3713,7 +4348,12 @@ got@^6.7.1: unzip-response "^2.0.1" url-parse-lax "^1.0.0" -graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: +graceful-fs@^4.1.0, graceful-fs@^4.1.15: + version "4.1.15" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" + integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== + +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= @@ -3723,10 +4363,10 @@ growl@1.10.5: resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA== -handle-thing@^1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" - integrity sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ= +handle-thing@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754" + integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ== handlebars@^4.0.11: version "4.0.12" @@ -3771,6 +4411,11 @@ has-cors@1.1.0: resolved "https://registry.yarnpkg.com/has-cors/-/has-cors-1.1.0.tgz#5e474793f7ea9843d1bb99c23eef49ff126fff39" integrity sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk= +has-flag@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" + integrity sha1-6CB68cx7MNRGzHC3NLXovhj4jVE= + has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" @@ -3817,7 +4462,7 @@ has-values@^1.0.0: is-number "^3.0.0" kind-of "^4.0.0" -has@^1.0.1: +has@^1.0.1, has@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== @@ -3840,6 +4485,13 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" +hasha@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-3.0.0.tgz#52a32fab8569d41ca69a61ff1a214f8eb7c8bd39" + integrity sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk= + dependencies: + is-stream "^1.0.1" + he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" @@ -3859,13 +4511,10 @@ hmac-drbg@^1.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - integrity sha1-42w/LSyufXRqhX440Y1fMqeILbg= - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" +home-or-tmp@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-3.0.0.tgz#57a8fe24cf33cdd524860a15821ddc25c86671fb" + integrity sha1-V6j+JM8zzdUkhgoVgh3cJchmcfs= hosted-git-info@^2.1.4: version "2.7.1" @@ -3910,6 +4559,17 @@ htmlparser2@~3.8.1: entities "1.0" readable-stream "1.1" +http-call@^5.2.2: + version "5.2.3" + resolved "https://registry.yarnpkg.com/http-call/-/http-call-5.2.3.tgz#4b59df8c313c92056e2004e666330b46f7d0532b" + integrity sha512-IkwGruHVHATmnonLKMGX5tkpM0KSn/C240o8/OfBsESRaJacykSia+akhD0d3fljQ5rQPXtBvSrVShAsj+EOUQ== + dependencies: + content-type "^1.0.4" + debug "^3.1.0" + is-retry-allowed "^1.1.0" + is-stream "^1.1.0" + tunnel-agent "^0.6.0" + http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" @@ -3930,15 +4590,15 @@ http-parser-js@>=0.4.0: resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.0.tgz#d65edbede84349d0dc30320815a15d39cc3cbbd8" integrity sha512-cZdEF7r4gfRIq7ezX9J0T+kQmJNOub71dWbgAXVHDct80TKP4MCETtZQ31xyv38UwgzkWPYF/Xc0ge55dW9Z9w== -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" - integrity sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM= +http-proxy-middleware@~0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.18.0.tgz#0987e6bb5a5606e5a69168d8f967a87f15dd8aab" + integrity sha512-Fs25KVMPAIIcgjMZkVHJoKg9VcXcC1C8yb9JUgeDvVXY0S/zgVIhMb+qVswDIgtJe2DfckMSY2d6TuTEutlk6Q== dependencies: http-proxy "^1.16.2" - is-glob "^3.1.0" - lodash "^4.17.2" - micromatch "^2.3.11" + is-glob "^4.0.0" + lodash "^4.17.5" + micromatch "^3.1.9" http-proxy@^1.13.0, http-proxy@^1.16.2, http-proxy@^1.8.1: version "1.17.0" @@ -3986,6 +4646,11 @@ husky@^0.14.3: normalize-path "^1.0.0" strip-indent "^2.0.0" +hyperlinker@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/hyperlinker/-/hyperlinker-1.0.0.tgz#23dc9e38a206b208ee49bc2d6c8ef47027df0c0e" + integrity sha512-Ty8UblRWFEcfSuIaajM34LdPXIhbs1ajEX/BBPv24J+enSVaEVY63xQ6lTO9VRYS5LAoghIG0IDJ+p+IPzKUQQ== + ice-cap@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/ice-cap/-/ice-cap-0.0.4.tgz#8a6d31ab4cac8d4b56de4fa946df3352561b6e18" @@ -4001,7 +4666,7 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.4.17, iconv-lite@^0.4.4: +iconv-lite@^0.4.17, iconv-lite@^0.4.24, iconv-lite@^0.4.4: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4040,14 +4705,6 @@ import-lazy@^2.1.0: resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= -import-local@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" - integrity sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ== - dependencies: - pkg-dir "^2.0.0" - resolve-cwd "^2.0.0" - import-local@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz#55070be38a5993cf18ef6db7e961f5bee5c5a09d" @@ -4061,12 +4718,15 @@ imurmurhash@^0.1.4: resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - integrity sha1-ji1INIdCEhtKghi3oTfppSBJ3IA= - dependencies: - repeating "^2.0.0" +indent-string@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" + integrity sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok= + +indexes-of@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607" + integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc= indexof@0.0.1: version "0.0.1" @@ -4091,7 +4751,7 @@ inherits@2.0.1: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz#b17d08d326b4423e568eff719f91b0b1cbdf69f1" integrity sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE= -ini@^1.3.4, ini@~1.3.0: +ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: version "1.3.5" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== @@ -4116,12 +4776,32 @@ inquirer@^3.0.6: strip-ansi "^4.0.0" through "^2.3.6" -internal-ip@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-1.2.0.tgz#ae9fbf93b984878785d50a8de1b356956058cf5c" - integrity sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w= +inquirer@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" + integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== + dependencies: + ansi-escapes "^3.2.0" + chalk "^2.4.2" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^3.0.3" + figures "^2.0.0" + lodash "^4.17.11" + mute-stream "0.0.7" + run-async "^2.2.0" + rxjs "^6.4.0" + string-width "^2.1.0" + strip-ansi "^5.0.0" + through "^2.3.6" + +internal-ip@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-3.0.1.tgz#df5c99876e1d2eb2ea2d74f520e3f669a00ece27" + integrity sha512-NXXgESC2nNVtU+pqmC9e6R8B1GpKxzsAQhffvh5AL79qKnodd+L7tnEQmTiUAVngqLalPbSqRA7XGIEL5nCd0Q== dependencies: - meow "^3.3.0" + default-gateway "^2.6.0" + ipaddr.js "^1.5.2" interpret@^1.1.0: version "1.1.0" @@ -4135,11 +4815,6 @@ invariant@^2.2.2: dependencies: loose-envify "^1.0.0" -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - invert-kv@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-2.0.0.tgz#7393f5afa59ec9ff5f67a27620d11c226e3eec02" @@ -4160,13 +4835,10 @@ ipaddr.js@1.8.0: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= -is-absolute@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" - integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== - dependencies: - is-relative "^1.0.0" - is-windows "^1.0.1" +ipaddr.js@^1.5.2: + version "1.9.0" + resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.0.tgz#37df74e430a0e47550fe54a2defe30d8acd95f65" + integrity sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA== is-accessor-descriptor@^0.1.6: version "0.1.6" @@ -4206,7 +4878,7 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.3, is-callable@^1.1.4: +is-callable@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.4.tgz#1e1adf219e1eeb684d691f9d6a05ff0d30a24d75" integrity sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA== @@ -4255,17 +4927,10 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2: 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" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" +is-docker@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-1.1.0.tgz#f04374d4eee5310e9a8e113bf1495411e46176a1" + integrity sha1-8EN01O7lMQ6ajhE78UlUEeRhdqE= is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" @@ -4279,11 +4944,6 @@ is-extendable@^1.0.1: 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" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - 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" @@ -4308,21 +4968,6 @@ is-fullwidth-code-point@^2.0.0: resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= -is-git-repository@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/is-git-repository/-/is-git-repository-1.1.1.tgz#c68e4b7a806422349aaec488973a90558d7e9be0" - integrity sha1-xo5LeoBkIjSarsSIlzqQVY1+m+A= - dependencies: - execa "^0.6.1" - path-is-absolute "^1.0.1" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - 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" @@ -4345,11 +4990,6 @@ is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" -is-negated-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-negated-glob/-/is-negated-glob-1.0.0.tgz#6910bca5da8c95e784b5751b976cf5a10fee36d2" - integrity sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI= - is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" @@ -4360,13 +5000,6 @@ is-number@^0.1.1: resolved "https://registry.yarnpkg.com/is-number/-/is-number-0.1.1.tgz#69a7af116963d47206ec9bd9b48a14216f1e3806" integrity sha1-aaevEWlj1HIG7JvZtIoUIW8eOAY= -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -4374,11 +5007,6 @@ is-number@^3.0.0: dependencies: kind-of "^3.0.2" -is-number@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ== - is-obj@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" @@ -4410,16 +5038,6 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: 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" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -4437,24 +5055,17 @@ is-regex@^1.0.4: dependencies: has "^1.0.1" -is-relative@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" - integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== - dependencies: - is-unc-path "^1.0.0" - is-resolvable@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== -is-retry-allowed@^1.0.0: +is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" integrity sha1-EaBgVotnM5REAz0BJaYaINVk+zQ= -is-stream@^1.0.0, is-stream@^1.1.0: +is-stream@^1.0.0, is-stream@^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" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -4471,29 +5082,12 @@ is-typedarray@~1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-unc-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" - integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== - dependencies: - unc-path-regex "^0.1.2" - -is-url@^1.2.2: +is-url@^1.2.2, is-url@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== -is-utf8@^0.2.0, is-utf8@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - -is-valid-glob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-1.0.0.tgz#29bf3eff701be2d4d315dbacc39bc39fe8f601aa" - integrity sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao= - -is-windows@^1.0.0, is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -4654,6 +5248,11 @@ istanbul-reports@^2.0.1: dependencies: handlebars "^4.0.11" +js-levenshtein@^1.1.3: + version "1.1.6" + resolved "https://registry.yarnpkg.com/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" + integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== + "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -4713,7 +5312,7 @@ jsesc@~0.5.0: resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d" integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0= -json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.1, json-parse-better-errors@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== @@ -4738,13 +5337,6 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= -json-stable-stringify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= - dependencies: - jsonify "~0.0.0" - 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" @@ -4755,11 +5347,18 @@ json3@^3.3.2: resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= -json5@^0.5.0, json5@^0.5.1: +json5@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= +json5@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.0.tgz#e7a0c62c48285c628d20a10b85c89bb807c32850" + integrity sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ== + dependencies: + minimist "^1.2.0" + jsonfile@^2.1.0: version "2.4.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-2.4.0.tgz#3736a2b428b87bbda0cc83b53fa3d633a35c2ae8" @@ -4774,11 +5373,6 @@ jsonfile@^4.0.0: 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" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= - jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -4813,7 +5407,7 @@ karma-chrome-launcher@^2.2.0: fs-access "^1.0.0" which "^1.2.1" -karma-coverage-istanbul-reporter@^2.0.4: +karma-coverage-istanbul-reporter@2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.0.4.tgz#402ae4ed6eadb9d9dafbd408ffda17897c0d003a" integrity sha512-xJS7QSQIVU6VK9HuJ/ieE5yynxKhjCCkd96NLY/BX/HXsx0CskU9JJiMQbd4cHALiddMwI4OWh1IIzeWrsavJw== @@ -4821,7 +5415,7 @@ karma-coverage-istanbul-reporter@^2.0.4: istanbul-api "^2.0.5" minimatch "^3.0.4" -karma-mocha-reporter@^2.2.3: +karma-mocha-reporter@^2.2.5: version "2.2.5" resolved "https://registry.yarnpkg.com/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz#15120095e8ed819186e47a0b012f3cd741895560" integrity sha1-FRIAlejtgZGG5HoLAS8810GJVWA= @@ -4866,10 +5460,10 @@ karma-webpack@^3.0.5: source-map "^0.5.6" webpack-dev-middleware "^2.0.6" -karma@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/karma/-/karma-3.1.1.tgz#94c8edd20fb9597ccde343326da009737fb0423a" - integrity sha512-NetT3wPCQMNB36uiL9LLyhrOt8SQwrEKt0xD3+KpTCfm0VxVyUJdPL5oTq2Ic5ouemgL/Iz4wqXEbF3zea9kQQ== +karma@3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/karma/-/karma-3.1.3.tgz#6e251648e3aff900927bc1126dbcbcb92d3edd61" + integrity sha512-JU4FYUtFEGsLZd6ZJzLrivcPj0TkteBiIRDcXWFsltPMGgZMDtby/MIzNOzgyZv/9dahs9vHpSxerC/ZfeX9Qw== dependencies: bluebird "^3.3.0" body-parser "^1.16.1" @@ -4881,11 +5475,12 @@ karma@^3.1.1: di "^0.0.1" dom-serialize "^2.2.0" expand-braces "^0.1.1" + flatted "^2.0.0" glob "^7.1.1" graceful-fs "^4.1.2" http-proxy "^1.13.0" isbinaryfile "^3.0.0" - lodash "^4.17.4" + lodash "^4.17.5" log4js "^3.0.0" mime "^2.3.1" minimatch "^3.0.2" @@ -4897,7 +5492,7 @@ karma@^3.1.1: socket.io "2.1.1" source-map "^0.6.1" tmp "0.0.33" - useragent "2.2.1" + useragent "2.3.0" kew@^0.7.0: version "0.7.0" @@ -4954,13 +5549,6 @@ lazystream@^1.0.0: dependencies: readable-stream "^2.0.5" -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - lcid@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-2.0.0.tgz#6ef5d2df60e52f82eb228a4c373e8d1f397253cf" @@ -4968,13 +5556,6 @@ lcid@^2.0.0: dependencies: invert-kv "^2.0.0" -lead@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lead/-/lead-1.0.0.tgz#6f14f99a37be3a9dd784f5495690e5903466ee42" - integrity sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI= - dependencies: - flush-write-stream "^1.0.2" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -4990,17 +5571,6 @@ lie@~3.1.0: dependencies: immediate "~3.0.5" -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - 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" @@ -5011,6 +5581,26 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" +load-json-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-4.0.0.tgz#2f5f45ab91e33216234fd53adab668eb4ec0993b" + integrity sha1-L19Fq5HjMhYjT9U62rZo607AmTs= + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + +load-json-file@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-5.1.0.tgz#c062f048e0ee556bf7f535bb16f6e45bb9d06b18" + integrity sha512-+ggO8OpTviHQ/zoyFxLJglsu1CylXUt1vpGa+mIUeesCkTC0G+JO6rdTS1/WcGBZDC7Nejo1aZ9MxbqflpmO6Q== + dependencies: + graceful-fs "^4.1.2" + parse-json "^4.0.0" + pify "^3.0.0" + strip-bom "^3.0.0" + loader-runner@^2.3.0: version "2.3.1" resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979" @@ -5041,6 +5631,11 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +lodash._reinterpolate@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= + lodash.assign@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" @@ -5056,22 +5651,32 @@ lodash.bind@^4.1.4: resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= -lodash.defaults@^4.0.1: +lodash.defaults@^4.0.1, lodash.defaults@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= +lodash.difference@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" + integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= + lodash.filter@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace" integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4= -lodash.flatten@^4.2.0: +lodash.flatten@^4.2.0, lodash.flatten@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= @@ -5086,16 +5691,31 @@ lodash.get@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= +lodash.isempty@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" + integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + lodash.map@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3" integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM= -lodash.merge@^4.4.0: +lodash.merge@^4.4.0, lodash.merge@^4.6.1: version "4.6.1" resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.1.tgz#adc25d9cb99b9391c59624f379fbba60d7111d54" integrity sha512-AOYza4+Hf5z1/0Hztxpm2/xiPZgi/cjMqdnKTUWTBSKchJlxXXuUSxCCl8rJlf4g6yww/j6mA8nC8Hw/EZWxKQ== +lodash.mergewith@^4.6.1: + version "4.6.1" + resolved "https://registry.yarnpkg.com/lodash.mergewith/-/lodash.mergewith-4.6.1.tgz#639057e726c3afbdb3e7d42741caa8d6e4335927" + integrity sha512-eWw5r+PYICtEBgrBE5hhlT6aAa75f411bgDz/ZL2KZqYV03USvucsxcHUIlGTDTECs1eunpI7HOV7U+WLDvNdQ== + lodash.pick@^4.2.1: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" @@ -5111,22 +5731,67 @@ lodash.reject@^4.4.0: resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415" integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU= +lodash.set@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + integrity sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM= + +lodash.snakecase@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" + integrity sha1-OdcUo1NXFHg3rv1ktdy7Fr7Nj40= + lodash.some@^4.4.0: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d" integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0= +lodash.template@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.4.0.tgz#e73a0385c8355591746e020b99679c690e68fba0" + integrity sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A= + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.templatesettings "^4.0.0" + +lodash.templatesettings@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz#2b4d4e95ba440d915ff08bc899e4553666713316" + integrity sha1-K01OlbpEDZFf8IvImeRVNmZxMxY= + dependencies: + lodash._reinterpolate "~3.0.0" + lodash.toarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE= -lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.2, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0: +lodash.transform@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.transform/-/lodash.transform-4.6.0.tgz#12306422f63324aed8483d3f38332b5f670547a0" + integrity sha1-EjBkIvYzJK7YSD0/ODMrX2cFR6A= + +lodash.unescape@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c" + integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw= + +lodash.union@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88" + integrity sha1-SLtQiECfFvGCFmZkHETdGqrjzYg= + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= + +lodash@^4.0.0, lodash@^4.1.0, lodash@^4.15.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.4, lodash@^4.17.5, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.5.0: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -log-symbols@^2.1.0: +log-symbols@^2.1.0, log-symbols@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz#5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a" integrity sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg== @@ -5174,7 +5839,7 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0, loud-rejection@^1.6.0: +loud-rejection@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= @@ -5187,12 +5852,15 @@ lowercase-keys@^1.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== -lru-cache@2.2.x: - version "2.2.4" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.2.4.tgz#6c658619becf14031d0d0b594b16042ce4dc063d" - integrity sha1-bGWGGb7PFAMdDQtZSxYELOTcBj0= +lru-cache@4.1.x: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" -lru-cache@^4.0.1, lru-cache@^4.1.1: +lru-cache@^4.0.1: version "4.1.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== @@ -5200,6 +5868,18 @@ lru-cache@^4.0.1, lru-cache@^4.1.1: pseudomap "^1.0.2" yallist "^2.1.2" +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +macos-release@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.0.0.tgz#7dddf4caf79001a851eb4fba7fb6034f251276ab" + integrity sha512-iCM3ZGeqIzlrH7KxYK+fphlJpCCczyHXc+HhRVbEu9uNTCrzYJjvvtefzeKTCVHd5AP/aD/fzC80JZ4ZP+dQ/A== + make-dir@^1.0.0, make-dir@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -5207,6 +5887,14 @@ make-dir@^1.0.0, make-dir@^1.3.0: dependencies: pify "^3.0.0" +make-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.0.0.tgz#648a648c64fe460621461997f7ae2b40d1f65c7e" + integrity sha512-DCZvJtCxpfY3a0Onp57Jm0PY9ggZENfVtBMsPdXFZDrMSHU5kYCMJkJesLr0/UrFdJKuDUYoGxCpc93n4F3Z8g== + dependencies: + pify "^4.0.1" + semver "^5.6.0" + map-age-cleaner@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz#098fb15538fd3dbe461f12745b0ca8568d4e3f74" @@ -5219,11 +5907,6 @@ map-cache@^0.2.2: resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= -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" - integrity sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0= - map-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" @@ -5231,32 +5914,11 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -marked-terminal@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/marked-terminal/-/marked-terminal-3.1.1.tgz#1e726816ddc4552a83393228ff0952b6cd4e5e04" - integrity sha512-7UBFww1rdx0w9HehLMCVYa8/AxXaiDigDfMsJcj82/wgLQG9cj+oiMAVlJpeWD57VFJY2OYY+bKeEVIjIlxi+w== - dependencies: - cardinal "^2.1.1" - chalk "^2.4.1" - cli-table "^0.3.1" - lodash.assign "^4.2.0" - node-emoji "^1.4.1" - marked@0.3.19: version "0.3.19" resolved "https://registry.yarnpkg.com/marked/-/marked-0.3.19.tgz#5d47f709c4c9fc3c216b6d46127280f40b39d790" integrity sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg== -marked@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/marked/-/marked-0.5.1.tgz#062f43b88b02ee80901e8e8d8e6a620ddb3aa752" - integrity sha512-iUkBZegCZou4AdwbKTwSW/lNDcz5OuRSl3qdcl31Ia0B2QPG0Jn+tKblh/9/eP9/6+4h27vpoh8wel/vQOV0vw== - -math-random@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/math-random/-/math-random-1.0.1.tgz#8b3aac588b8a66e4975e3cdea67f7bb329601fac" - integrity sha1-izqsWIuKZuSXXjzepn97sylgH6w= - md5.js@^1.3.4: version "1.3.5" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz#b5d07b8e3216e3e27cd728d72f70d1e6a342005f" @@ -5288,22 +5950,6 @@ memory-fs@^0.4.0, memory-fs@~0.4.1: errno "^0.1.3" readable-stream "^2.0.1" -meow@^3.3.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - integrity sha1-cstmi0JSKCkKu/qFaJJYcwioAfs= - 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" @@ -5314,26 +5960,12 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^2.3.11: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" +micro-api-client@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/micro-api-client/-/micro-api-client-3.3.0.tgz#52dd567d322f10faffe63d19d4feeac4e4ffd215" + integrity sha512-y0y6CUB9RLVsy3kfgayU28746QrNMpSm9O/AYGNsBgOkJr/X/Jk0VLGoO8Ude7Bpa8adywzF+MzXNZRFRsNPhg== -micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8: +micromatch@^3.1.10, micromatch@^3.1.4, micromatch@^3.1.8, micromatch@^3.1.9: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -5377,7 +6009,7 @@ mime@1.4.1: resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== -mime@^1.5.0, mime@^1.6.0: +mime@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== @@ -5414,7 +6046,12 @@ minimist@0.0.8: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= -minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: +minimist@1.1.x: + version "1.1.3" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.1.3.tgz#3bedfd91a92d39016fcfaa1c681e8faa1a1efda8" + integrity sha1-O+39kaktOQFvz6ocaB6Pqhoe/ag= + +minimist@1.2.0, minimist@^1.1.0, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= @@ -5439,10 +6076,10 @@ minizlib@^1.1.0: dependencies: minipass "^2.2.1" -mississippi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-2.0.0.tgz#3442a508fafc28500486feea99409676e4ee5a6f" - integrity sha512-zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw== +mississippi@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz#ea0a3291f97e0b5e8776b363d5f0a12d94c67022" + integrity sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA== dependencies: concat-stream "^1.5.0" duplexify "^3.4.2" @@ -5450,7 +6087,7 @@ mississippi@^2.0.0: flush-write-stream "^1.0.0" from2 "^2.1.0" parallel-transform "^1.1.0" - pump "^2.0.1" + pump "^3.0.0" pumpify "^1.3.3" stream-each "^1.1.0" through2 "^2.0.0" @@ -5487,6 +6124,14 @@ mocha@^5.2.0: mkdirp "0.5.1" supports-color "5.4.0" +module-definition@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/module-definition/-/module-definition-3.1.0.tgz#201c062b89f81ed18018e1a2f15afc0c8089a126" + integrity sha512-XtgUeQUi/4UshwxWlCxCjt4SoJC+LJbjHvhGopOskzZOH3GSy2X6KC96APK3rgA9p9hekHcVP87qdwQpSvhNlQ== + dependencies: + ast-module-types "^2.4.0" + node-source-walk "^4.0.0" + move-concurrently@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz#be2c005fda32e0b29af1f05d7c4b33214c701f92" @@ -5527,22 +6172,6 @@ mute-stream@0.0.7: resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= -mversion@^1.10.1: - version "1.12.0" - resolved "https://registry.yarnpkg.com/mversion/-/mversion-1.12.0.tgz#68f383ed5778c49794433dc7b9b8b94c10311562" - integrity sha512-Ax/IG1lW1OkB/HdhlmpM93jWboFP+hhWn7OTTOoQRckGNkWes78/di2YG77Oa+3vMZHeBKs0yrV6F5H1hWBR9g== - dependencies: - chalk "^2.4.1" - cli-usage "^0.1.2" - contra "^1.6.8" - minimatch "^3.0.3" - minimist "^1.2.0" - rc "^1.1.6" - semver "^5.3.0" - through2 "^2.0.3" - update-notifier "^2.5.0" - vinyl-fs "^3.0.3" - nan@^2.9.2: version "2.11.1" resolved "https://registry.yarnpkg.com/nan/-/nan-2.11.1.tgz#90e22bccb8ca57ea4cd37cc83d3819b52eea6766" @@ -5570,6 +6199,11 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= +natural-orderby@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/natural-orderby/-/natural-orderby-1.1.1.tgz#26a0d6bab64595297cfeaf7c2fc3e055f882b481" + integrity sha512-WM3K4I9eKgn8tXcx5iR4/UYXFCnKOWUvKPkWRzGS/WIHleqoVBeL+8hArQsULl0unH87c2Kgg/usM2UMAuz8gw== + needle@^2.2.1: version "2.2.4" resolved "https://registry.yarnpkg.com/needle/-/needle-2.2.4.tgz#51931bff82533b1928b7d1d69e01f1b00ffd2a4e" @@ -5589,6 +6223,81 @@ neo-async@^2.5.0: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.0.tgz#b9d15e4d71c6762908654b5183ed38b753340835" integrity sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA== +netlify-cli@^2.5.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/netlify-cli/-/netlify-cli-2.7.0.tgz#3c672468abbb51b6ef9740afe1e944db12ef8eb8" + integrity sha512-jTJYenN6eRPd3iSeO1x88xepG5JxWhveEENXEBtQCi4TcD+MhKsO1WuemfrhUI1/7SGCgTbtu/ma9HDsirrr+w== + dependencies: + "@iarna/toml" "^2.0.0" + "@oclif/command" "^1.5.8" + "@oclif/config" "^1.12.4" + "@oclif/errors" "^1.1.2" + "@oclif/plugin-help" "^2.1.6" + "@oclif/plugin-not-found" "^1.1.4" + "@oclif/plugin-plugins" "^1.7.7" + "@octokit/rest" "^16.15.0" + ascii-table "0.0.9" + chalk "^2.4.2" + ci-info "^2.0.0" + clean-deep "^3.0.2" + cli-spinners "^1.3.1" + cli-ux "^5.1.0" + configstore "^4.0.0" + dot-prop "^4.2.0" + find-up "^3.0.0" + git-remote-origin-url "^2.0.0" + git-repo-info "^2.1.0" + inquirer "^6.2.2" + is-docker "^1.1.0" + lodash.get "^4.4.2" + lodash.isempty "^4.4.0" + lodash.merge "^4.6.1" + lodash.mergewith "^4.6.1" + lodash.snakecase "^4.1.1" + log-symbols "^2.2.0" + make-dir "^2.0.0" + netlify "^2.3.0" + node-fetch "^2.2.0" + ora "^3.0.0" + p-wait-for "^2.0.0" + parse-github-url "^1.0.2" + prettyjson "^1.2.1" + random-item "^1.0.0" + update-notifier "^2.5.0" + uuid "^3.3.2" + write-file-atomic "^2.4.2" + +netlify@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/netlify/-/netlify-2.3.0.tgz#467d5fb84169d386a08fff1b3ad04eb5cad9be82" + integrity sha512-FI5PGYDR44NrHf7xxQ/Q3m+JwG4sHBvJuvkdW65Zd51FNbyOeLZAZk7BRrbhNIlO65VzPn0JJJNB7T3EQH0uGQ== + dependencies: + "@netlify/open-api" "^0.5.0" + "@netlify/zip-it-and-ship-it" "^0.2.0" + backoff "^2.5.0" + clean-deep "^3.0.2" + debug "^4.1.1" + flush-write-stream "^1.0.3" + folder-walker "^3.2.0" + from2-array "0.0.4" + hasha "^3.0.0" + is-stream "^1.1.0" + lodash.camelcase "^4.3.0" + lodash.flatten "^4.4.0" + lodash.get "^4.4.2" + lodash.set "^4.3.2" + micro-api-client "^3.3.0" + node-fetch "^2.2.0" + p-map "^2.0.0" + p-wait-for "^2.0.0" + parallel-transform "^1.1.0" + pump "^3.0.0" + qs "^6.5.2" + tempy "^0.2.1" + through2-filter "^3.0.0" + through2-map "^3.0.0" + util.promisify "^1.0.0" + next-tick@1: version "1.0.0" resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" @@ -5610,12 +6319,10 @@ nise@^1.4.6: path-to-regexp "^1.7.0" text-encoding "^0.6.4" -node-emoji@^1.4.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.8.1.tgz#6eec6bfb07421e2148c75c6bba72421f8530a826" - integrity sha512-+ktMAh1Jwas+TnGodfCfjUbJKoANqPaJFN0z0iqh41eqD8dvguNzcitVSBSVK1pidz0AqGbLKcoVuVLRVZ/aVg== - dependencies: - lodash.toarray "^4.4.0" +node-fetch@^2.2.0, node-fetch@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.3.0.tgz#1a1d940bbfb916a1d3e0219f037e89e71f8c5fa5" + integrity sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA== node-forge@0.7.5: version "0.7.5" @@ -5651,6 +6358,11 @@ node-libs-browser@^2.0.0: util "^0.10.3" vm-browserify "0.0.4" +node-modules-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz#8d9dbe28964a4ac5712e9131642107c71e90ec40" + integrity sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA= + node-pre-gyp@^0.10.0: version "0.10.3" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.10.3.tgz#3070040716afdc778747b61b6887bf78880b80fc" @@ -5667,6 +6379,20 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" +node-releases@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.7.tgz#b09a10394d0ed8f7778f72bb861dde68b146303b" + integrity sha512-bKdrwaqJUPHqlCzDD7so/R+Nk0jGv9a11ZhLrD9f6i947qGLrGAhU3OxRENa19QQmwzGy/g6zCDEuLGDO8HPvA== + dependencies: + semver "^5.3.0" + +node-source-walk@^4.0.0, node-source-walk@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/node-source-walk/-/node-source-walk-4.2.0.tgz#c2efe731ea8ba9c03c562aa0a9d984e54f27bc2c" + integrity sha512-hPs/QMe6zS94f5+jG3kk9E7TNm4P2SulrKiLWMzKszBfNZvL/V6wseHlTd7IvfW0NZWqPtK3+9yYNr+3USGteA== + dependencies: + "@babel/parser" "^7.0.0" + nopt@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" @@ -5675,7 +6401,7 @@ nopt@^4.0.1: abbrev "1" osenv "^0.1.4" -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: +normalize-package-data@^2.3.2: version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" integrity sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw== @@ -5690,25 +6416,31 @@ normalize-path@^1.0.0: resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" integrity sha1-MtDkcvkf80VwHBWoMRAY07CpA3k= -normalize-path@^2.0.1, normalize-path@^2.1.1: +normalize-path@^2.0.0, normalize-path@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= dependencies: remove-trailing-separator "^1.0.1" -now-and-later@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/now-and-later/-/now-and-later-2.0.0.tgz#bc61cbb456d79cb32207ce47ca05136ff2e7d6ee" - integrity sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4= - dependencies: - once "^1.3.2" +normalize-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== npm-bundled@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.5.tgz#3c1732b7ba936b3a10325aef616467c0ccbcc979" integrity sha512-m/e6jgWu8/v5niCUKQi9qQl8QdeEduFA96xHDDzFGqly0OOjI7c+60KM/2sppfnUU9JJagf+zs+yGhqSOFj71g== +npm-packlist@^1.1.12: + version "1.3.0" + resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.3.0.tgz#7f01e8e44408341379ca98cfd756e7b29bd2626c" + integrity sha512-qPBc6CnxEzpOcc4bjoIBJbYdy0D/LFFPUdxvfwor4/w3vxeE0h6TiOVurCEPpQ6trjN77u/ShyfeJGsbAfB3dA== + dependencies: + ignore-walk "^3.0.1" + npm-bundled "^1.0.1" + npm-packlist@^1.1.6: version "1.1.12" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" @@ -5717,7 +6449,7 @@ npm-packlist@^1.1.6: ignore-walk "^3.0.1" npm-bundled "^1.0.1" -npm-run-path@^2.0.0: +npm-run-path@^2.0.0, npm-run-path@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= @@ -5792,7 +6524,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.0.4, object.assign@^4.1.0: +object.assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz#968bf1100d7956bb3ca086f006f846b3bc4008da" integrity sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w== @@ -5802,13 +6534,13 @@ object.assign@^4.0.4, object.assign@^4.1.0: has-symbols "^1.0.0" object-keys "^1.0.11" -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= +object.getownpropertydescriptors@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" + integrity sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY= dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" + define-properties "^1.1.2" + es-abstract "^1.5.1" object.pick@^1.3.0: version "1.3.0" @@ -5817,11 +6549,16 @@ object.pick@^1.3.0: dependencies: isobject "^3.0.1" -obuf@^1.0.0, obuf@^1.1.1: +obuf@^1.0.0, obuf@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== +octokit-pagination-methods@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz#cf472edc9d551055f9ef73f6e42b4dbb4c80bea4" + integrity sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ== + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -5829,12 +6566,12 @@ on-finished@~2.3.0: dependencies: ee-first "1.1.1" -on-headers@~1.0.1: +on-headers@^1.0.0, on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= -once@^1.3.0, once@^1.3.1, once@^1.3.2, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= @@ -5880,14 +6617,19 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -ordered-read-streams@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz#77c0cb37c41525d64166d990ffad7ec6a0e1363e" - integrity sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4= +ora@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ora/-/ora-3.0.0.tgz#8179e3525b9aafd99242d63cc206fd64732741d0" + integrity sha512-LBS97LFe2RV6GJmXBi6OKcETKyklHNMV0xw7BtsVn2MlsgsydyZetSCbCANr+PFLmDyv4KV88nn0eCKza665Mg== dependencies: - readable-stream "^2.0.1" + chalk "^2.3.1" + cli-cursor "^2.1.0" + cli-spinners "^1.1.0" + log-symbols "^2.2.0" + strip-ansi "^4.0.0" + wcwidth "^1.0.1" -original@>=0.0.5: +original@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz#e442a61cffe1c5fd20a65f3261c26663b303f25f" integrity sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg== @@ -5904,13 +6646,6 @@ os-homedir@^1.0.0: resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk= - dependencies: - lcid "^1.0.0" - os-locale@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-3.0.1.tgz#3b014fbf01d87f60a1e5348d80fe870dc82c4620" @@ -5920,7 +6655,15 @@ os-locale@^3.0.0: lcid "^2.0.0" mem "^4.0.0" -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: +os-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-3.0.0.tgz#e1434dbfddb8e74b44c98b56797d951b7648a5d9" + integrity sha512-7c74tib2FsdFbQ3W+qj8Tyd1R3Z6tuVRNNxXjJcZ4NgjIEQU9N/prVMqcW29XZPXGACqaXN3jq58/6hoaoXH6g== + dependencies: + macos-release "^2.0.0" + windows-release "^3.1.0" + +os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= @@ -5933,6 +6676,13 @@ osenv@^0.1.4: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-all@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-all/-/p-all-1.0.0.tgz#93bdf53a55a23821fdfa98b4174a99bf7f31df8d" + integrity sha1-k731OlWiOCH9+pi0F0qZv38x340= + dependencies: + p-map "^1.0.0" + p-defer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-1.0.0.tgz#9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c" @@ -5976,11 +6726,23 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" -p-map@^1.1.1: +p-map@^1.0.0, p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" integrity sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA== +p-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.0.0.tgz#be18c5a5adeb8e156460651421aceca56c213a50" + integrity sha512-GO107XdrSUmtHxVoi60qc9tUl/KkNKm+X2CF4P9amalpGxv5YqVPJNfSb0wcA+syCopkZvYYIzW8OVTQW59x/w== + +p-timeout@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-timeout/-/p-timeout-2.0.1.tgz#d8dd1979595d2dc0139e1fe46b8b646cb3cdf038" + integrity sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA== + dependencies: + p-finally "^1.0.0" + p-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -5991,6 +6753,13 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== +p-wait-for@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/p-wait-for/-/p-wait-for-2.0.1.tgz#bc4dc3410dcba8ca4a92354f5b44f5c4ee6b6d7f" + integrity sha512-edEuJC7eRokPf3AWycsS3lp8JimWLnVgCeGoWw67qFerUmsAHKyhRBj8rDvaBjPV2bTyzgTwmF+U8vNMMBEcyA== + dependencies: + p-timeout "^2.0.1" + package-json@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" @@ -6026,15 +6795,10 @@ parse-asn1@^5.0.0: evp_bytestokey "^1.0.0" pbkdf2 "^3.0.3" -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" +parse-github-url@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/parse-github-url/-/parse-github-url-1.0.2.tgz#242d3b65cbcdda14bb50439e3242acf6971db395" + integrity sha512-kgBf6avCbO3Cn6+RnzRGLkUsv4ZVqv/VfAYkRsyBcgkshNvVBkRn1FEZcW0Jb+npXQWm2vHPnnOqFteZxRRGNw== parse-json@^2.2.0: version "2.2.0" @@ -6043,6 +6807,14 @@ parse-json@^2.2.0: dependencies: error-ex "^1.2.0" +parse-json@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz#be35f5425be1f7f6c747184f98a788cb99477ee0" + integrity sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA= + dependencies: + error-ex "^1.3.1" + json-parse-better-errors "^1.0.1" + parse5@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-1.5.1.tgz#9b7f3b0de32be78dc2401b17573ccaf0f6f59d94" @@ -6079,6 +6851,14 @@ pascalcase@^0.1.1: resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= +password-prompt@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/password-prompt/-/password-prompt-1.0.7.tgz#8e27748d3400bc9c9140d5ade705dfb7aeb7d91a" + integrity sha1-jid0jTQAvJyRQNWt5wXft6632Ro= + dependencies: + ansi-escapes "^3.1.0" + cross-spawn "^6.0.5" + path-browserify@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.0.tgz#a0b870729aae214005b7d5032ec2cbbb0fb4451a" @@ -6101,7 +6881,7 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= @@ -6116,7 +6896,7 @@ path-key@^2.0.0, path-key@^2.0.1: resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= -path-parse@^1.0.5: +path-parse@^1.0.5, path-parse@^1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== @@ -6133,15 +6913,6 @@ path-to-regexp@^1.7.0: 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" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - 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" @@ -6149,6 +6920,13 @@ path-type@^2.0.0: dependencies: pify "^2.0.0" +path-type@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" + integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== + dependencies: + pify "^3.0.0" + pathval@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" @@ -6175,7 +6953,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -pify@^2.0.0: +pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= @@ -6185,6 +6963,11 @@ pify@^3.0.0: resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + pinkie-promise@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" @@ -6197,6 +6980,13 @@ pinkie@^2.0.0: resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= +pirates@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.0.tgz#850b18781b4ac6ec58a43c9ed9ec5fe6796addbd" + integrity sha512-8t5BsXy1LUIjn3WWOlOuFDuKswhQb/tkak641lvBgmPOBUQHXveORtlMCp6OdPV1dtuTaEahKA8VNz6uLfKBtA== + dependencies: + node-modules-regexp "^1.0.0" + pkg-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" @@ -6237,6 +7027,48 @@ posix-character-classes@^0.1.0: resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= +postcss-values-parser@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/postcss-values-parser/-/postcss-values-parser-1.5.0.tgz#5d9fa63e2bcb0179ce48f3235303765eb89f3047" + integrity sha512-3M3p+2gMp0AH3da530TlX8kiO1nxdTnc3C6vr8dMxRLIlh8UYkz0/wcwptSXjhtx2Fr0TySI7a+BHDQ8NL7LaQ== + dependencies: + flatten "^1.0.2" + indexes-of "^1.0.1" + uniq "^1.0.1" + +postcss@^7.0.2: + version "7.0.14" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5" + integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg== + dependencies: + chalk "^2.4.2" + source-map "^0.6.1" + supports-color "^6.1.0" + +precinct@^5.2.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/precinct/-/precinct-5.3.1.tgz#4ab0ec1d1a8f1b2f4982b810d56419e7b3025870" + integrity sha512-HOIXDarP6S5JXYC5GhnpoAj9RqJ6yAwZ8VI71vQFlq1rmkBRPs+Mt60TOr7DUc/fx309iIQaniB4x3zueOOSdw== + dependencies: + commander "^2.19.0" + debug "^4.1.1" + detective-amd "^3.0.0" + detective-cjs "^3.1.1" + detective-es6 "^2.0.0" + detective-less "^1.0.2" + detective-postcss "^3.0.0" + detective-sass "^3.0.0" + detective-scss "^2.0.0" + detective-stylus "^1.0.0" + detective-typescript "^4.1.2" + module-definition "^3.1.0" + node-source-walk "^4.2.0" + +precond@0.2: + version "0.2.3" + resolved "https://registry.yarnpkg.com/precond/-/precond-0.2.3.tgz#aa9591bcaa24923f1e0f4849d240f47efc1075ac" + integrity sha1-qpWRvKokkj8eD0hJ0kD0fvwQdaw= + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -6247,26 +7079,29 @@ prepend-http@^1.0.1: resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= +prettyjson@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prettyjson/-/prettyjson-1.2.1.tgz#fcffab41d19cab4dfae5e575e64246619b12d289" + integrity sha1-/P+rQdGcq0365eV15kJGYZsS0ok= + dependencies: + colors "^1.1.2" + minimist "^1.2.0" -private@^0.1.6, private@^0.1.8: +private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== -process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" - integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== - process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" integrity sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M= +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + integrity sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw== + process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" @@ -6317,7 +7152,7 @@ public-encrypt@^4.0.0: randombytes "^2.0.1" safe-buffer "^5.1.2" -pump@^2.0.0, pump@^2.0.1: +pump@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" integrity sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA== @@ -6325,7 +7160,15 @@ pump@^2.0.0, pump@^2.0.1: end-of-stream "^1.1.0" once "^1.3.1" -pumpify@^1.3.3, pumpify@^1.3.5: +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +pumpify@^1.3.3: version "1.5.1" resolved "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz#36513be246ab27570b1a374a5ce278bfd74370ce" integrity sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ== @@ -6359,6 +7202,11 @@ qs@6.5.2, qs@~6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== +qs@^6.5.2: + version "6.6.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz#a99c0f69a8d26bf7ef012f871cdabb0aee4424c2" + integrity sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA== + qs@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/qs/-/qs-2.3.3.tgz#e9e85adbe75da0bbe4c8e0476a086290f863b404" @@ -6379,14 +7227,15 @@ querystringify@^2.0.0: resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.0.tgz#7ded8dfbf7879dcc60d0a644ac6754b283ad17ef" integrity sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg== -randomatic@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha512-TuDE5KxZ0J461RVjrJZCJc+J+zCkTb1MbH9AQUq68sMhOMcy9jLcb3BrZKgp9q9Ncltdg4QVqWrH02W2EFFVYw== - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" +ramda@^0.26.1: + version "0.26.1" + resolved "https://registry.yarnpkg.com/ramda/-/ramda-0.26.1.tgz#8d41351eb8111c55353617fc3bbffad8e4d35d06" + integrity sha512-hLWjpy7EnsDBb0p+Z3B7rPi3GDeRG5ZtiI33kJhTt+ORCd38AbAIjB/9zRIUoeTbE/AVX5ZkU7m6bznsvrf8eQ== + +random-item@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/random-item/-/random-item-1.0.0.tgz#16ee31626cb050c8a1686a5f0f42a6b99a2aaf11" + integrity sha1-Fu4xYmywUMihaGpfD0KmuZoqrxE= randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: version "2.0.6" @@ -6428,14 +7277,6 @@ rc@^1.0.1, rc@^1.1.6, rc@^1.2.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" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - 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" @@ -6444,14 +7285,13 @@ 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" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= +read-pkg-up@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-4.0.0.tgz#1b221c6088ba7799601c808f91161c66e58f8978" + integrity sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA== dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" + find-up "^3.0.0" + read-pkg "^3.0.0" read-pkg@^2.0.0: version "2.0.0" @@ -6462,7 +7302,16 @@ read-pkg@^2.0.0: normalize-package-data "^2.3.2" path-type "^2.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.2.9, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: +read-pkg@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389" + integrity sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k= + dependencies: + load-json-file "^4.0.0" + normalize-package-data "^2.3.2" + path-type "^3.0.0" + +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.0, readable-stream@^2.3.3, readable-stream@^2.3.5, readable-stream@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== @@ -6506,7 +7355,7 @@ readable-stream@~2.0.6: string_decoder "~0.10.x" util-deprecate "~1.0.1" -readdirp@^2.0.0: +readdirp@^2.0.0, readdirp@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" integrity sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ== @@ -6515,14 +7364,6 @@ readdirp@^2.0.0: micromatch "^3.1.10" readable-stream "^2.0.2" -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - integrity sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94= - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - redeyed@~2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-2.1.1.tgz#8984b5815d99cb220469c99eeeffe38913e6cc0b" @@ -6530,7 +7371,14 @@ redeyed@~2.1.0: dependencies: esprima "~4.0.0" -regenerate@^1.2.1: +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + integrity sha512-s5NGghCE4itSlUS+0WUj88G6cfMVMmH8boTPNvABf8od+2dhT9WDlWu8n01raQAJZMOK8Ch6jSexaRO7swd6aw== + dependencies: + regenerate "^1.4.0" + +regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== @@ -6540,22 +7388,13 @@ regenerator-runtime@^0.11.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== -regenerator-transform@^0.10.0: - version "0.10.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" - integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q== +regenerator-transform@^0.13.3: + version "0.13.3" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.13.3.tgz#264bd9ff38a8ce24b06e0636496b2c856b57bcbb" + integrity sha512-5ipTrZFSq5vU2YoGoww4uaRVAK4wyYC4TSICibbfEPOruUu8FFP7ErV0BjmbIOEpn3O/k9na9UEdYR/3m7N6uA== dependencies: - babel-runtime "^6.18.0" - babel-types "^6.19.0" private "^0.1.6" -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ== - dependencies: - is-equal-shallow "^0.1.3" - regex-not@^1.0.0, regex-not@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" @@ -6569,14 +7408,17 @@ regexpp@^1.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw== -regexpu-core@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" - integrity sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA= +regexpu-core@^4.1.3, regexpu-core@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" + integrity sha512-eDDWElbwwI3K0Lo6CqbQbA6FwgtCz4kYTarrri1okfkRLZAqstU+B3voZBCjg8Fl6iq0gXrJG6MvRgLthfvgOA== dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" registry-auth-token@^3.0.1: version "3.3.2" @@ -6593,35 +7435,18 @@ registry-url@^3.0.3: dependencies: rc "^1.0.1" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + integrity sha512-RnIrLhrXCX5ow/E5/Mh2O4e/oa1/jW0eaBKTSy3LaCj+M3Bqvm97GWDp2yUtzIs4LEn65zR2yiYGFqb2ApnzDA== -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + integrity sha512-RQ7YyokLiQBomUJuUG8iGVvkgOLxwyZM8k6d3q5SAXpg4r5TZJZigKFvC6PpD+qQ98bCDC5YelPeA3EucDoNeQ== dependencies: jsesc "~0.5.0" -remove-bom-buffer@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz#c2bf1e377520d324f623892e33c10cac2c252b53" - integrity sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ== - dependencies: - is-buffer "^1.1.5" - is-utf8 "^0.2.1" - -remove-bom-stream@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz#05f1a593f16e42e1fb90ebf59de8e569525f9523" - integrity sha1-BfGlk/FuQuH7kOv1nejlaVJflSM= - dependencies: - remove-bom-buffer "^3.0.0" - safe-buffer "^5.1.0" - through2 "^2.0.3" - remove-trailing-separator@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" @@ -6637,7 +7462,7 @@ repeat-string@^0.2.2: resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-0.2.2.tgz#c7a8d3236068362059a7e4651fc6884e8b1fb4ae" integrity sha1-x6jTI2BoNiBZp+RlH8aITosftK4= -repeat-string@^1.5.2, repeat-string@^1.6.1: +repeat-string@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= @@ -6656,11 +7481,6 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -replace-ext@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" - integrity sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs= - request@^2.55.0, request@^2.87.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" @@ -6697,6 +7517,11 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +require-package-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/require-package-name/-/require-package-name-2.0.1.tgz#c11e97276b65b8e2923f75dabf5fb2ef0c3841b9" + integrity sha1-wR6XJ2tluOKSP3Xav1+y7ww4Qbk= + require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -6705,6 +7530,11 @@ require-uncached@^1.0.3: caller-path "^0.1.0" resolve-from "^1.0.0" +requireindex@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.1.0.tgz#e5404b81557ef75db6e49c5a72004893fe03e162" + integrity sha1-5UBLgVV+91225JxacgBIk/4D4WI= + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -6727,18 +7557,18 @@ resolve-from@^3.0.0: resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" integrity sha1-six699nWiBvItuZTM17rywoYh0g= -resolve-options@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/resolve-options/-/resolve-options-1.1.0.tgz#32bb9e39c06d67338dc9378c0d6d6074566ad131" - integrity sha1-MrueOcBtZzONyTeMDW1gdFZq0TE= - dependencies: - value-or-function "^3.0.0" - resolve-url@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= +resolve@^1.3.2: + version "1.10.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba" + integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg== + dependencies: + path-parse "^1.0.6" + resolve@^1.3.3, resolve@^1.5.0, resolve@^1.6.0: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" @@ -6805,6 +7635,13 @@ rx-lite@*, rx-lite@^4.0.8: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" integrity sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ= +rxjs@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" + integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== + dependencies: + tslib "^1.9.0" + safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -6834,12 +7671,13 @@ schema-utils@^0.3.0: dependencies: ajv "^5.0.0" -schema-utils@^0.4.4, schema-utils@^0.4.5: - version "0.4.7" - resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-0.4.7.tgz#ba74f597d2be2ea880131746ee17d0a093c68187" - integrity sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ== +schema-utils@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770" + integrity sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g== dependencies: ajv "^6.1.0" + ajv-errors "^1.0.0" ajv-keywords "^3.1.0" select-hose@^2.0.0: @@ -6871,11 +7709,16 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== +semver@5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + integrity sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA== + send@0.16.2: version "0.16.2" resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" @@ -6983,12 +7826,12 @@ signal-exit@^3.0.0, signal-exit@^3.0.2: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= -sinon-chai@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.2.0.tgz#ed995e13a8a3cfccec18f218d9b767edc47e0715" - integrity sha512-Z72B4a0l0IQe5uWi9yzcqX/Ml6K9e1Hp03NmkjJnRG3gDsKTX7KvLFZsVUmCaz0eqeXLLK089mwTsP1P1W+DUQ== +sinon-chai@3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-3.3.0.tgz#8084ff99451064910fbe2c2cb8ab540c00b740ea" + integrity sha512-r2JhDY7gbbmh5z3Q62pNbrjxZdOAjpsqW/8yxAZRSqLZqowmfGZPGUZPFf3UX36NLis0cv8VEM5IJh9HgkSOAA== -sinon@^7.1.1: +sinon@7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/sinon/-/sinon-7.1.1.tgz#1202f317aa14d93cb9b69ff50b6bd49c0e05ffc9" integrity sha512-iYagtjLVt1vN3zZY7D8oH7dkjNJEjLjyuzy8daX5+3bbQl8gaohrheB9VfH1O3L6LKuue5WTJvFluHiuZ9y3nQ== @@ -7003,11 +7846,6 @@ sinon@^7.1.1: supports-color "^5.5.0" type-detect "^4.0.8" -slash@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" - integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= - slice-ansi@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" @@ -7091,17 +7929,17 @@ socket.io@2.1.1: socket.io-client "2.1.1" socket.io-parser "~3.2.0" -sockjs-client@1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.1.5.tgz#1bb7c0f7222c40f42adf14f4442cbd1269771a83" - integrity sha1-G7fA9yIsQPQq3xT0RCy9Eml3GoM= +sockjs-client@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.3.0.tgz#12fc9d6cb663da5739d3dc5fb6e8687da95cb177" + integrity sha512-R9jxEzhnnrdxLCNln0xg5uGHqMnkhPSTzUZH2eXcR03S/On9Yvoq2wyUZILRUhZCNVu2PmwWVoyuiPz8th8zbg== dependencies: - debug "^2.6.6" - eventsource "0.1.6" - faye-websocket "~0.11.0" - inherits "^2.0.1" + debug "^3.2.5" + eventsource "^1.0.7" + faye-websocket "~0.11.1" + inherits "^2.0.3" json3 "^3.3.2" - url-parse "^1.1.8" + url-parse "^1.4.3" sockjs@0.3.19: version "0.3.19" @@ -7127,12 +7965,13 @@ source-map-resolve@^0.5.0: 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" - integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA== +source-map-support@^0.5.9, source-map-support@~0.5.9: + version "0.5.10" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c" + integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ== dependencies: - source-map "^0.5.6" + buffer-from "^1.0.0" + source-map "^0.6.0" source-map-url@^0.4.0: version "0.4.0" @@ -7144,7 +7983,7 @@ source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= -source-map@^0.6.1, source-map@~0.6.1: +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== @@ -7175,30 +8014,28 @@ spdx-license-ids@^3.0.0: resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg== -spdy-transport@^2.0.18: - version "2.1.0" - resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.0.tgz#4bbb15aaffed0beefdd56ad61dbdc8ba3e2cb7a1" - integrity sha512-bpUeGpZcmZ692rrTiqf9/2EUakI6/kXX1Rpe0ib/DyOzbiexVfXkw6GnvI9hVGvIwVaUhkaBojjCZwLNRGQg1g== +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== dependencies: - debug "^2.6.8" - detect-node "^2.0.3" + debug "^4.1.0" + detect-node "^2.0.4" hpack.js "^2.1.6" - obuf "^1.1.1" - readable-stream "^2.2.9" - safe-buffer "^5.0.1" - wbuf "^1.7.2" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" -spdy@^3.4.1: - version "3.4.7" - resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" - integrity sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw= +spdy@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52" + integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q== dependencies: - debug "^2.6.8" - handle-thing "^1.2.5" + debug "^4.1.0" + handle-thing "^2.0.0" http-deceiver "^1.2.7" - safe-buffer "^5.0.1" select-hose "^2.0.0" - spdy-transport "^2.0.18" + spdy-transport "^3.0.0" split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -7227,12 +8064,12 @@ sshpk@^1.7.0: safer-buffer "^2.0.2" tweetnacl "~0.14.0" -ssri@^5.2.4: - version "5.3.0" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-5.3.0.tgz#ba3872c9c6d33a0704a7d71ff045e5ec48999d06" - integrity sha512-XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ== +ssri@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" + integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== dependencies: - safe-buffer "^5.1.1" + figgy-pudding "^3.5.1" static-extend@^0.1.1: version "0.1.2" @@ -7299,7 +8136,7 @@ streamroller@0.7.0: mkdirp "^0.5.1" readable-stream "^2.3.0" -string-width@^1.0.1, string-width@^1.0.2: +string-width@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= @@ -7316,6 +8153,15 @@ string-width@^1.0.1, string-width@^1.0.2: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.0.0.tgz#5a1690a57cc78211fffd9bf24bbe24d090604eb1" + integrity sha512-rr8CUxBbvOZDUvc5lNIJ+OC1nPVpz+Siw9VBtUjB9b6jZehZLFt0JMCZzShFHIsI8cbhm0EsNIfWJMFV3cu3Ew== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.0.0" + string_decoder@^1.0.0, string_decoder@^1.1.1, string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -7342,12 +8188,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" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= +strip-ansi@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" + integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== dependencies: - is-utf8 "^0.2.0" + ansi-regex "^4.0.0" strip-bom@^3.0.0: version "3.0.0" @@ -7359,13 +8205,6 @@ strip-eof@^1.0.0: resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - integrity sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI= - dependencies: - get-stdin "^4.0.1" - strip-indent@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" @@ -7388,13 +8227,28 @@ supports-color@^2.0.0: resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= -supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: +supports-color@^5.0.0, supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-color@^5.5.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== dependencies: has-flag "^3.0.0" +supports-color@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3" + integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ== + dependencies: + has-flag "^3.0.0" + +supports-hyperlinks@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-1.0.1.tgz#71daedf36cc1060ac5100c351bb3da48c29c0ef7" + integrity sha512-HHi5kVSefKaJkGYXbDuKbUGRVxqnWGn3J2e39CYcNJEfWciGq2zYtOhXLTlvrOZW1QU7VX67w7fMmWafHX9Pfw== + dependencies: + has-flag "^2.0.0" + supports-color "^5.0.0" + "symbol-tree@>= 3.1.0 < 4.0.0": version "3.2.2" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" @@ -7427,6 +8281,19 @@ tapable@^1.0.0, tapable@^1.1.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" integrity sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA== +tar-stream@^1.5.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.2.tgz#8ea55dab37972253d9a9af90fdcd559ae435c555" + integrity sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A== + dependencies: + bl "^1.0.0" + buffer-alloc "^1.2.0" + end-of-stream "^1.0.0" + fs-constants "^1.0.0" + readable-stream "^2.3.0" + to-buffer "^1.1.1" + xtend "^4.0.0" + tar@^4: version "4.4.6" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.6.tgz#63110f09c00b4e60ac8bcfe1bf3c8660235fbc9b" @@ -7448,6 +8315,19 @@ tcp-port-used@^1.0.0: debug "4.1.0" is2 "2.0.1" +temp-dir@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" + integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= + +tempy@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/tempy/-/tempy-0.2.1.tgz#9038e4dbd1c201b74472214179bc2c6f7776e54c" + integrity sha512-LB83o9bfZGrntdqPuRdanIVCPReam9SOZKW0fOy5I9X3A854GGWi0tjCqoXEk84XIEYBc/x9Hq3EFop/H5wJaw== + dependencies: + temp-dir "^1.0.0" + unique-string "^1.0.0" + term-size@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" @@ -7455,6 +8335,29 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" +terser-webpack-plugin@^1.1.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.2.tgz#9bff3a891ad614855a7dde0d707f7db5a927e3d9" + integrity sha512-1DMkTk286BzmfylAvLXwpJrI7dWa5BnFmscV/2dCr8+c56egFcbaeFAl7+sujAjdmpLam21XRdhA4oifLyiWWg== + dependencies: + cacache "^11.0.2" + find-cache-dir "^2.0.0" + schema-utils "^1.0.0" + serialize-javascript "^1.4.0" + source-map "^0.6.1" + terser "^3.16.1" + webpack-sources "^1.1.0" + worker-farm "^1.5.2" + +terser@^3.16.1: + version "3.16.1" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.16.1.tgz#5b0dd4fa1ffd0b0b43c2493b2c364fd179160493" + integrity sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow== + dependencies: + commander "~2.17.1" + source-map "~0.6.1" + source-map-support "~0.5.9" + text-encoding@^0.6.4: version "0.6.4" resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" @@ -7465,15 +8368,23 @@ text-table@~0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -through2-filter@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" - integrity sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw= +through2-filter@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-3.0.0.tgz#700e786df2367c2c88cd8aa5be4cf9c1e7831254" + integrity sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA== dependencies: through2 "~2.0.0" xtend "~4.0.0" -through2@^2.0.0, through2@^2.0.3, through2@~2.0.0: +through2-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/through2-map/-/through2-map-3.0.0.tgz#a6c3026ce63b4898a997d540506b66ffd970f271" + integrity sha1-psMCbOY7SJipl9VAUGtm/9lw8nE= + dependencies: + through2 "~2.0.0" + xtend "^4.0.0" + +through2@^2.0.0, through2@~2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" integrity sha1-AARWmzfHx0ujnEPzzteNGtlBQL4= @@ -7491,16 +8402,6 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.0.3.tgz#f5df732453407b09191dae73e2a8cc73f381a826" integrity sha512-YwT8pjmNcAXBZqrubu22P4FYsh2D4dxRmnWBOL8Jk8bUcRUtc5326kx32tuTmFDAZtLOGEVNl8POAR8j896Iow== -ticky@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/ticky/-/ticky-1.0.1.tgz#b7cfa71e768f1c9000c497b9151b30947c50e46d" - integrity sha1-t8+nHnaPHJAAxJe5FRswlHxQ5G0= - -time-stamp@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-2.2.0.tgz#917e0a66905688790ec7bbbde04046259af83f57" - integrity sha512-zxke8goJQpBeEgD82CXABeMh0LSJcj7CXEd0OHOg45HgcofF7pxNwZm9+RknpxpDhwN4gFpySkApKfFYfRQnUA== - timed-out@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" @@ -7527,14 +8428,6 @@ tmp@0.0.33, tmp@0.0.x, tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -to-absolute-glob@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz#1865f43d9e74b0822db9f145b78cff7d0f7c849b" - integrity sha1-GGX0PZ50sIItufFFt4z/fQ98hJs= - dependencies: - is-absolute "^1.0.0" - is-negated-glob "^1.0.0" - to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" @@ -7545,6 +8438,11 @@ to-arraybuffer@^1.0.0: resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= +to-buffer@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.1.1.tgz#493bd48f62d7c43fcded313a03dcadb2e1213a80" + integrity sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg== + 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" @@ -7580,13 +8478,6 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -to-through@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/to-through/-/to-through-2.0.0.tgz#fc92adaba072647bc0b67d6b03664aa195093af6" - integrity sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY= - dependencies: - through2 "^2.0.3" - tough-cookie@^2.2.0, tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" @@ -7600,17 +8491,17 @@ tr46@~0.0.1: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - integrity sha1-WIeWa7WCpFA6QetST301ARgVphM= +treeify@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/treeify/-/treeify-1.1.0.tgz#4e31c6a463accd0943879f30667c4fdaff411bb8" + integrity sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A== trim-right@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= -tslib@^1.9.0: +tslib@^1, tslib@^1.9.0, tslib@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== @@ -7657,13 +8548,35 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -uglify-es@^3.3.4: - version "3.3.9" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677" - integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ== +typescript-eslint-parser@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-18.0.0.tgz#3e5055a44980d69e4154350fc5d8b1ab4e2332a8" + integrity sha512-Pn/A/Cw9ysiXSX5U1xjBmPQlxtWGV2o7jDNiH/u7KgBO2yC/y37wNFl2ogSrGZBQFuglLzGq0Xl0Bt31Jv44oA== dependencies: - commander "~2.13.0" - source-map "~0.6.1" + lodash.unescape "4.0.1" + semver "5.5.0" + +typescript-eslint-parser@^21.0.2: + version "21.0.2" + resolved "https://registry.yarnpkg.com/typescript-eslint-parser/-/typescript-eslint-parser-21.0.2.tgz#270af10e4724528677fbcf34ea495284bec3a894" + integrity sha512-u+pj4RVJBr4eTzj0n5npoXD/oRthvfUCjSKndhNI714MG0mQq2DJw5WP7qmonRNIFgmZuvdDOH3BHm9iOjIAfg== + dependencies: + eslint-scope "^4.0.0" + eslint-visitor-keys "^1.0.0" + typescript-estree "5.3.0" + +typescript-estree@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/typescript-estree/-/typescript-estree-5.3.0.tgz#fb6c977b5e21073eb16cbdc0338a7f752da99ff5" + integrity sha512-Vu0KmYdSCkpae+J48wsFC1ti19Hq3Wi/lODUaE+uesc3gzqhWbZ5itWbsjylLVbjNW4K41RqDzSfnaYNbmEiMQ== + dependencies: + lodash.unescape "4.0.1" + semver "5.5.0" + +typescript@^3.0.3, typescript@^3.3.1: + version "3.3.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.3.3.tgz#f1657fc7daa27e1a8930758ace9ae8da31403221" + integrity sha512-Y21Xqe54TBVp+VDSNbuDYdGw0BpoR/Q6wo/+35M8PAU0vipahnyduJWirxxdxjsAkS7hue53x2zp8gz7F05u0A== uglify-js@^3.1.4: version "3.4.9" @@ -7673,29 +8586,33 @@ uglify-js@^3.1.4: commander "~2.17.1" source-map "~0.6.1" -uglifyjs-webpack-plugin@^1.2.4: - version "1.3.0" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de" - integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw== - dependencies: - cacache "^10.0.4" - find-cache-dir "^1.0.0" - schema-utils "^0.4.5" - serialize-javascript "^1.4.0" - source-map "^0.6.1" - uglify-es "^3.3.4" - webpack-sources "^1.1.0" - worker-farm "^1.5.2" - ultron@~1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" integrity sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og== -unc-path-regex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + integrity sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ== + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + integrity sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg== + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + integrity sha512-Rx7yODZC1L/T8XKo/2kNzVAQaRE88AaMvI1EF/Xnj3GW2wzN6fop9DDWuFAKUVFH7vozkz26DzP0qyWLKLIVPQ== + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + integrity sha512-2WSLa6OdYd2ng8oqiGIWnJqyFArvhn+5vgx5GTxMbUYjCYKUcuKS62YLFF0R/BDGlB1yzXjQOLtPAfHsgirEpg== union-value@^1.0.0: version "1.0.0" @@ -7714,7 +8631,12 @@ union@~0.4.3: dependencies: qs "~2.3.3" -unique-filename@^1.1.0: +uniq@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" + integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= + +unique-filename@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz#1d69769369ada0583103a1e6ae87681b56573230" integrity sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ== @@ -7728,14 +8650,6 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unique-stream@^2.0.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" - integrity sha1-WqADz76Uxf+GbE59ZouxxNuts2k= - dependencies: - json-stable-stringify "^1.0.0" - through2-filter "^2.0.0" - unique-string@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" @@ -7743,6 +8657,13 @@ unique-string@^1.0.0: dependencies: crypto-random-string "^1.0.0" +universal-user-agent@^2.0.0, universal-user-agent@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-2.0.3.tgz#9f6f09f9cc33de867bb720d84c08069b14937c6c" + integrity sha512-eRHEHhChCBHrZsA4WEhdgiOKgdvgrMIHwnwnqD0r5C6AO8kwKcG7qSku3iXdhvHL3YvsS9ZkSGN8h/hIpoFC8g== + dependencies: + os-name "^3.0.0" + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -7766,7 +8687,7 @@ unzip-response@^2.0.1: resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= -upath@^1.0.5: +upath@^1.0.5, upath@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" integrity sha512-bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw== @@ -7811,7 +8732,7 @@ url-parse-lax@^1.0.0: dependencies: prepend-http "^1.0.1" -url-parse@^1.1.8, url-parse@^1.4.3: +url-parse@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.3.tgz#bfaee455c889023219d757e045fa6a684ec36c15" integrity sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw== @@ -7819,6 +8740,11 @@ url-parse@^1.1.8, url-parse@^1.4.3: querystringify "^2.0.0" requires-port "^1.0.0" +url-template@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/url-template/-/url-template-2.0.8.tgz#fc565a3cccbff7730c775f5641f9555791439f21" + integrity sha1-/FZaPMy/93MMd19WQflVV5FDnyE= + url-toolkit@^2.1.2: version "2.1.6" resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.1.6.tgz#6d03246499e519aad224c44044a4ae20544154f2" @@ -7837,12 +8763,12 @@ use@^3.1.0: resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== -useragent@2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.2.1.tgz#cf593ef4f2d175875e8bb658ea92e18a4fd06d8e" - integrity sha1-z1k+9PLRdYdei7ZY6pLhik/QbY4= +useragent@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/useragent/-/useragent-2.3.0.tgz#217f943ad540cb2128658ab23fc960f6a88c9972" + integrity sha512-4AoH4pxuSvHCjqLO04sU6U/uE65BYza8l/KKBS0b0hnUPWi+cQ2BpeTEwejCSx9SPV5/U03nniDTrWx5NrmKdw== dependencies: - lru-cache "2.2.x" + lru-cache "4.1.x" tmp "0.0.x" util-deprecate@^1.0.1, util-deprecate@~1.0.1: @@ -7850,6 +8776,14 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= +util.promisify@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" + integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== + dependencies: + define-properties "^1.1.2" + object.getownpropertydescriptors "^2.0.3" + util@0.10.3: version "0.10.3" resolved "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz#7afb1afe50805246489e3db7fe0ed379336ac0f9" @@ -7887,11 +8821,6 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" -value-or-function@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/value-or-function/-/value-or-function-3.0.0.tgz#1c243a50b595c1be54a754bfece8563b9ff8d813" - integrity sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM= - vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -7906,54 +8835,6 @@ verror@1.10.0: core-util-is "1.0.2" extsprintf "^1.2.0" -vinyl-fs@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-3.0.3.tgz#c85849405f67428feabbbd5c5dbdd64f47d31bc7" - integrity sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng== - dependencies: - fs-mkdirp-stream "^1.0.0" - glob-stream "^6.1.0" - graceful-fs "^4.0.0" - is-valid-glob "^1.0.0" - lazystream "^1.0.0" - lead "^1.0.0" - object.assign "^4.0.4" - pumpify "^1.3.5" - readable-stream "^2.3.3" - remove-bom-buffer "^3.0.0" - remove-bom-stream "^1.2.0" - resolve-options "^1.1.0" - through2 "^2.0.0" - to-through "^2.0.0" - value-or-function "^3.0.0" - vinyl "^2.0.0" - vinyl-sourcemap "^1.1.0" - -vinyl-sourcemap@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz#92a800593a38703a8cdb11d8b300ad4be63b3e16" - integrity sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY= - dependencies: - append-buffer "^1.0.2" - convert-source-map "^1.5.0" - graceful-fs "^4.1.6" - normalize-path "^2.1.1" - now-and-later "^2.0.0" - remove-bom-buffer "^3.0.0" - vinyl "^2.0.0" - -vinyl@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.2.0.tgz#d85b07da96e458d25b2ffe19fece9f2caa13ed86" - integrity sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg== - dependencies: - clone "^2.1.1" - clone-buffer "^1.0.0" - clone-stats "^1.0.0" - cloneable-readable "^1.0.0" - remove-trailing-separator "^1.0.1" - replace-ext "^1.0.0" - vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" @@ -7975,13 +8856,20 @@ watchpack@^1.5.0: graceful-fs "^4.1.2" neo-async "^2.5.0" -wbuf@^1.1.0, wbuf@^1.7.2: +wbuf@^1.1.0, wbuf@^1.7.3: version "1.7.3" resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== dependencies: minimalistic-assert "^1.0.0" +wcwidth@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" + integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= + dependencies: + defaults "^1.0.3" + webidl-conversions@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-2.0.1.tgz#3bf8258f7d318c7443c36f2e169402a1a6703506" @@ -8003,16 +8891,15 @@ webpack-cli@^3.1.2: v8-compile-cache "^2.0.2" yargs "^12.0.2" -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" - integrity sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A== +webpack-dev-middleware@3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.4.0.tgz#1132fecc9026fd90f0ecedac5cbff75d1fb45890" + integrity sha512-Q9Iyc0X9dP9bAsYskAVJ/hmIZZQwf/3Sy4xCAZgL5cUkjZmUZLt4l5HpbST/Pdgjn3u6pE7u5OdGd1apgzRujA== dependencies: memory-fs "~0.4.1" - mime "^1.5.0" - path-is-absolute "^1.0.0" + mime "^2.3.1" range-parser "^1.0.3" - time-stamp "^2.0.0" + webpack-log "^2.0.0" webpack-dev-middleware@^2.0.6: version "2.0.6" @@ -8027,13 +8914,12 @@ webpack-dev-middleware@^2.0.6: url-join "^2.0.2" webpack-log "^1.0.1" -webpack-dev-server@^2.7.1: - version "2.11.3" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-2.11.3.tgz#3fd48a402164a6569d94d3d17f131432631b4873" - integrity sha512-Qz22YEFhWx+M2vvJ+rQppRv39JA0h5NNbOOdODApdX6iZ52Diz7vTPXjF7kJlfn+Uc24Qr48I3SZ9yncQwRycg== +webpack-dev-server@^3.1.4: + version "3.1.14" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz#60fb229b997fc5a0a1fc6237421030180959d469" + integrity sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ== dependencies: ansi-html "0.0.7" - array-includes "^3.0.3" bonjour "^3.5.0" chokidar "^2.0.0" compression "^1.5.2" @@ -8042,23 +8928,27 @@ webpack-dev-server@^2.7.1: 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" + http-proxy-middleware "~0.18.0" + import-local "^2.0.0" + internal-ip "^3.0.1" ip "^1.1.5" killable "^1.0.0" loglevel "^1.4.1" opn "^5.1.0" portfinder "^1.0.9" + schema-utils "^1.0.0" selfsigned "^1.9.1" + semver "^5.6.0" serve-index "^1.7.2" sockjs "0.3.19" - sockjs-client "1.1.5" - spdy "^3.4.1" + sockjs-client "1.3.0" + spdy "^4.0.0" strip-ansi "^3.0.0" supports-color "^5.1.0" - webpack-dev-middleware "1.12.2" - yargs "6.6.0" + url "^0.11.0" + webpack-dev-middleware "3.4.0" + webpack-log "^2.0.0" + yargs "12.0.2" webpack-log@^1.0.1: version "1.2.0" @@ -8070,6 +8960,21 @@ webpack-log@^1.0.1: loglevelnext "^1.0.1" uuid "^3.1.0" +webpack-log@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz#5b7928e0637593f119d32f6227c1e0ac31e1b47f" + integrity sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg== + dependencies: + ansi-colors "^3.0.0" + uuid "^3.3.2" + +webpack-merge@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.1.tgz#5e923cf802ea2ace4fd5af1d3247368a633489b4" + integrity sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw== + dependencies: + lodash "^4.17.5" + webpack-sources@^1.1.0, webpack-sources@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" @@ -8078,17 +8983,17 @@ webpack-sources@^1.1.0, webpack-sources@^1.3.0: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^4.19.1: - version "4.23.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.23.1.tgz#db7467b116771ae020c58bdfe2a0822785bb8239" - integrity sha512-iE5Cu4rGEDk7ONRjisTOjVHv3dDtcFfwitSxT7evtYj/rANJpt1OuC/Kozh1pBa99AUBr1L/LsaNB+D9Xz3CEg== - dependencies: - "@webassemblyjs/ast" "1.7.10" - "@webassemblyjs/helper-module-context" "1.7.10" - "@webassemblyjs/wasm-edit" "1.7.10" - "@webassemblyjs/wasm-parser" "1.7.10" - acorn "^5.6.2" - acorn-dynamic-import "^3.0.0" +webpack@^4.27.1: + version "4.29.3" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.3.tgz#e0b406a7b4201ed5e4fb4f84fd7359f9a7db4647" + integrity sha512-xPJvFeB+8tUflXFq+OgdpiSnsCD5EANyv56co5q8q8+YtEasn5Sj3kzY44mta+csCIEB0vneSxnuaHkOL2h94A== + dependencies: + "@webassemblyjs/ast" "1.7.11" + "@webassemblyjs/helper-module-context" "1.7.11" + "@webassemblyjs/wasm-edit" "1.7.11" + "@webassemblyjs/wasm-parser" "1.7.11" + acorn "^6.0.5" + acorn-dynamic-import "^4.0.0" ajv "^6.1.0" ajv-keywords "^3.1.0" chrome-trace-event "^1.0.0" @@ -8102,9 +9007,9 @@ webpack@^4.19.1: mkdirp "~0.5.0" neo-async "^2.5.0" node-libs-browser "^2.0.0" - schema-utils "^0.4.4" + schema-utils "^1.0.0" tapable "^1.1.0" - uglifyjs-webpack-plugin "^1.2.4" + terser-webpack-plugin "^1.1.0" watchpack "^1.5.0" webpack-sources "^1.3.0" @@ -8121,9 +9026,9 @@ websocket-extensions@>=0.1.1: resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29" integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg== -"webworkify-webpack@git+ssh://git@github.com:johnBartos/webworkify-webpack.git#refs/heads/master": +webworkify-webpack@johnBartos/webworkify-webpack#refs/heads/master: version "2.1.3" - resolved "git+ssh://git@github.com:johnBartos/webworkify-webpack.git#4da76bf2821969b19c5de79edaa526cc295cff33" + resolved "https://codeload.github.com/johnBartos/webworkify-webpack/tar.gz/4da76bf2821969b19c5de79edaa526cc295cff33" whatwg-url-compat@~0.6.5: version "0.6.5" @@ -8132,11 +9037,6 @@ whatwg-url-compat@~0.6.5: dependencies: tr46 "~0.0.1" -which-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" - integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8= - which-module@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" @@ -8156,13 +9056,20 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2 || 2" -widest-line@^2.0.0: +widest-line@^2.0.0, widest-line@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== dependencies: string-width "^2.1.1" +windows-release@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-3.1.0.tgz#8d4a7e266cbf5a233f6c717dac19ce00af36e12e" + integrity sha512-hBb7m7acFgQPQc222uEQTmdcGLeBmQLNLFIh0rDk3CwFOBrfjefLzEfEfmpMq8Af/n/GnFf3eYf203FY1PmudA== + dependencies: + execa "^0.10.0" + wordwrap@~0.0.2: version "0.0.3" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" @@ -8188,6 +9095,15 @@ wrap-ansi@^2.0.0: string-width "^1.0.1" strip-ansi "^3.0.1" +wrap-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-4.0.0.tgz#b3570d7c70156159a2d42be5cc942e957f7b1131" + integrity sha512-uMTsj9rDb0/7kk1PbcbCcwvHUxp60fGDB/NNXpVa0Q+ic/e7y5+BwTxKfQ33VYgDppSwi/FBzpetYzo8s6tfbg== + dependencies: + ansi-styles "^3.2.0" + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -8202,6 +9118,15 @@ write-file-atomic@^2.0.0: imurmurhash "^0.1.4" signal-exit "^3.0.2" +write-file-atomic@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9" + integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g== + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + write@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" @@ -8256,11 +9181,6 @@ xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68= -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - integrity sha1-bRX7qITAhnnA136I53WegR4H+kE= - "y18n@^3.2.1 || ^4.0.0", y18n@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz#95ef94f85ecc81d007c264e190a120f0a3c8566b" @@ -8283,33 +9203,7 @@ yargs-parser@^10.1.0: dependencies: camelcase "^4.1.0" -yargs-parser@^4.2.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c" - integrity sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw= - dependencies: - camelcase "^3.0.0" - -yargs@6.6.0: - version "6.6.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208" - integrity sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg= - 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@^12.0.2: +yargs@12.0.2, yargs@^12.0.2: version "12.0.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== @@ -8327,6 +9221,11 @@ yargs@^12.0.2: y18n "^3.2.1 || ^4.0.0" yargs-parser "^10.1.0" +yarn@^1.13.0: + version "1.13.0" + resolved "https://registry.yarnpkg.com/yarn/-/yarn-1.13.0.tgz#affa9c956739548024068532a902cf18c9cb523f" + integrity sha512-Unfw2eefv8imt4ZMPhvFVP44WCz38huDxkHs+Yqrx4wBTK75Tr0mh3V4rh+2Nw5iQq0rcM/VafotCZo9qTb5DA== + yauzl@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" @@ -8338,3 +9237,12 @@ yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" integrity sha1-AI4G2AlDIMNy28L47XagymyKxBk= + +zip-stream@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-2.0.1.tgz#48a062488afe91dda42f823700fae589753ccd34" + integrity sha512-c+eUhhkDpaK87G/py74wvWLtz2kzMPNCCkUApkun50ssE0oQliIQzWpTnwjB+MTKVIf2tGzIgHyqW/Y+W77ecQ== + dependencies: + archiver-utils "^2.0.0" + compress-commons "^1.2.0" + readable-stream "^2.0.0"