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"