diff options
author | Chocobozzz <me@florianbigard.com> | 2018-05-30 17:10:00 +0200 |
---|---|---|
committer | Chocobozzz <me@florianbigard.com> | 2018-05-30 17:10:00 +0200 |
commit | 960a11e89da4e4a6ad6fbad61c71625f89e267b6 (patch) | |
tree | 0cd370970c3166dd3715e46a5503a3da78f25e37 | |
parent | e10c7d5125c47830bd23ecfed2f1b2d1048e6639 (diff) | |
download | PeerTube-960a11e89da4e4a6ad6fbad61c71625f89e267b6.tar.gz PeerTube-960a11e89da4e4a6ad6fbad61c71625f89e267b6.tar.zst PeerTube-960a11e89da4e4a6ad6fbad61c71625f89e267b6.zip |
Add context menu to player
-rw-r--r-- | .sass-lint.yml | 2 | ||||
-rw-r--r-- | client/package.json | 4 | ||||
-rw-r--r-- | client/src/app/videos/+video-watch/modal/video-share.component.ts | 6 | ||||
-rw-r--r-- | client/src/app/videos/+video-watch/video-watch.component.ts | 1 | ||||
-rw-r--r-- | client/src/assets/player/peertube-link-button.ts | 20 | ||||
-rw-r--r-- | client/src/assets/player/peertube-player.ts | 27 | ||||
-rw-r--r-- | client/src/assets/player/peertube-videojs-plugin.ts | 4 | ||||
-rw-r--r-- | client/src/assets/player/utils.ts | 34 | ||||
-rw-r--r-- | client/src/assets/player/video-renderer.ts | 6 | ||||
-rw-r--r-- | client/src/sass/video-js-custom.scss | 30 | ||||
-rw-r--r-- | client/src/standalone/videos/embed.ts | 1 | ||||
-rw-r--r-- | client/yarn.lock | 15 | ||||
-rw-r--r-- | package.json | 5 | ||||
-rw-r--r-- | yarn.lock | 117 |
14 files changed, 145 insertions, 127 deletions
diff --git a/.sass-lint.yml b/.sass-lint.yml index 55a487138..50b9e4f93 100644 --- a/.sass-lint.yml +++ b/.sass-lint.yml | |||
@@ -22,4 +22,4 @@ rules: | |||
22 | space-before-colon: 1 | 22 | space-before-colon: 1 |
23 | hex-length: 1 | 23 | hex-length: 1 |
24 | hex-notation: 0 | 24 | hex-notation: 0 |
25 | indentation: 1 | 25 | indentation: 2 |
diff --git a/client/package.json b/client/package.json index 0d5acf997..61f94758a 100644 --- a/client/package.json +++ b/client/package.json | |||
@@ -23,7 +23,7 @@ | |||
23 | }, | 23 | }, |
24 | "license": "GPLv3", | 24 | "license": "GPLv3", |
25 | "resolutions": { | 25 | "resolutions": { |
26 | "videojs-dock/video.js": "^7", | 26 | "video.js": "^7", |
27 | "webtorrent/create-torrent/junk": "^1", | 27 | "webtorrent/create-torrent/junk": "^1", |
28 | "simple-get": "^2.8.1" | 28 | "simple-get": "^2.8.1" |
29 | }, | 29 | }, |
@@ -99,6 +99,8 @@ | |||
99 | "typescript": "2.7", | 99 | "typescript": "2.7", |
100 | "uglifyjs-webpack-plugin": "^1.1.2", | 100 | "uglifyjs-webpack-plugin": "^1.1.2", |
101 | "video.js": "^7.0.3", | 101 | "video.js": "^7.0.3", |
102 | "videojs-contextmenu": "^2.0.0", | ||
103 | "videojs-contextmenu-ui": "^4.0.0", | ||
102 | "videojs-dock": "^2.0.2", | 104 | "videojs-dock": "^2.0.2", |
103 | "videojs-hotkeys": "^0.2.21", | 105 | "videojs-hotkeys": "^0.2.21", |
104 | "webpack": "^4.5.0", | 106 | "webpack": "^4.5.0", |
diff --git a/client/src/app/videos/+video-watch/modal/video-share.component.ts b/client/src/app/videos/+video-watch/modal/video-share.component.ts index 678cccfb5..33998c5d8 100644 --- a/client/src/app/videos/+video-watch/modal/video-share.component.ts +++ b/client/src/app/videos/+video-watch/modal/video-share.component.ts | |||
@@ -4,6 +4,7 @@ import { NotificationsService } from 'angular2-notifications' | |||
4 | 4 | ||
5 | import { ModalDirective } from 'ngx-bootstrap/modal' | 5 | import { ModalDirective } from 'ngx-bootstrap/modal' |
6 | import { VideoDetails } from '../../../shared/video/video-details.model' | 6 | import { VideoDetails } from '../../../shared/video/video-details.model' |
7 | import { buildVideoEmbed } from '../../../../assets/player/utils' | ||
7 | 8 | ||
8 | @Component({ | 9 | @Component({ |
9 | selector: 'my-video-share', | 10 | selector: 'my-video-share', |
@@ -28,10 +29,7 @@ export class VideoShareComponent { | |||
28 | } | 29 | } |
29 | 30 | ||
30 | getVideoIframeCode () { | 31 | getVideoIframeCode () { |
31 | return '<iframe width="560" height="315" ' + | 32 | return buildVideoEmbed(this.video.embedUrl) |
32 | 'src="' + this.video.embedUrl + '" ' + | ||
33 | 'frameborder="0" allowfullscreen>' + | ||
34 | '</iframe>' | ||
35 | } | 33 | } |
36 | 34 | ||
37 | getVideoUrl () { | 35 | getVideoUrl () { |
diff --git a/client/src/app/videos/+video-watch/video-watch.component.ts b/client/src/app/videos/+video-watch/video-watch.component.ts index 35a7c04cc..c71051649 100644 --- a/client/src/app/videos/+video-watch/video-watch.component.ts +++ b/client/src/app/videos/+video-watch/video-watch.component.ts | |||
@@ -348,6 +348,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy { | |||
348 | inactivityTimeout: 2500, | 348 | inactivityTimeout: 2500, |
349 | videoFiles: this.video.files, | 349 | videoFiles: this.video.files, |
350 | playerElement: this.playerElement, | 350 | playerElement: this.playerElement, |
351 | videoEmbedUrl: this.video.embedUrl, | ||
351 | videoViewUrl: this.videoService.getVideoViewUrl(this.video.uuid), | 352 | videoViewUrl: this.videoService.getVideoViewUrl(this.video.uuid), |
352 | videoDuration: this.video.duration, | 353 | videoDuration: this.video.duration, |
353 | enableHotkeys: true, | 354 | enableHotkeys: true, |
diff --git a/client/src/assets/player/peertube-link-button.ts b/client/src/assets/player/peertube-link-button.ts index 54d802732..a13815d61 100644 --- a/client/src/assets/player/peertube-link-button.ts +++ b/client/src/assets/player/peertube-link-button.ts | |||
@@ -1,15 +1,19 @@ | |||
1 | import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' | 1 | import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' |
2 | import { buildVideoLink } from './utils' | ||
2 | 3 | ||
3 | const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button') | 4 | const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button') |
4 | class PeerTubeLinkButton extends Button { | 5 | class PeerTubeLinkButton extends Button { |
5 | 6 | ||
7 | constructor (player: videojs.Player, options) { | ||
8 | super(player, options) | ||
9 | } | ||
10 | |||
6 | createEl () { | 11 | createEl () { |
7 | return this.buildElement() | 12 | return this.buildElement() |
8 | } | 13 | } |
9 | 14 | ||
10 | updateHref () { | 15 | updateHref () { |
11 | const currentTime = Math.floor(this.player().currentTime()) | 16 | this.el().setAttribute('href', buildVideoLink(this.player().currentTime())) |
12 | this.el().setAttribute('href', this.buildHref(currentTime)) | ||
13 | } | 17 | } |
14 | 18 | ||
15 | handleClick () { | 19 | handleClick () { |
@@ -18,7 +22,7 @@ class PeerTubeLinkButton extends Button { | |||
18 | 22 | ||
19 | private buildElement () { | 23 | private buildElement () { |
20 | const el = videojsUntyped.dom.createEl('a', { | 24 | const el = videojsUntyped.dom.createEl('a', { |
21 | href: this.buildHref(), | 25 | href: buildVideoLink(), |
22 | innerHTML: 'PeerTube', | 26 | innerHTML: 'PeerTube', |
23 | title: 'Go to the video page', | 27 | title: 'Go to the video page', |
24 | className: 'vjs-peertube-link', | 28 | className: 'vjs-peertube-link', |
@@ -29,15 +33,5 @@ class PeerTubeLinkButton extends Button { | |||
29 | 33 | ||
30 | return el | 34 | return el |
31 | } | 35 | } |
32 | |||
33 | private buildHref (time?: number) { | ||
34 | let href = window.location.href.replace('embed', 'watch') | ||
35 | if (time) { | ||
36 | if (window.location.search) href += '&start=' + time | ||
37 | else href += '?start=' + time | ||
38 | } | ||
39 | |||
40 | return href | ||
41 | } | ||
42 | } | 36 | } |
43 | Button.registerComponent('PeerTubeLinkButton', PeerTubeLinkButton) | 37 | Button.registerComponent('PeerTubeLinkButton', PeerTubeLinkButton) |
diff --git a/client/src/assets/player/peertube-player.ts b/client/src/assets/player/peertube-player.ts index f419d58fc..9fe5af569 100644 --- a/client/src/assets/player/peertube-player.ts +++ b/client/src/assets/player/peertube-player.ts | |||
@@ -2,12 +2,15 @@ import { VideoFile } from '../../../../shared/models/videos' | |||
2 | 2 | ||
3 | import 'videojs-hotkeys' | 3 | import 'videojs-hotkeys' |
4 | import 'videojs-dock' | 4 | import 'videojs-dock' |
5 | import 'videojs-contextmenu' | ||
6 | import 'videojs-contextmenu-ui' | ||
5 | import './peertube-link-button' | 7 | import './peertube-link-button' |
6 | import './resolution-menu-button' | 8 | import './resolution-menu-button' |
7 | import './settings-menu-button' | 9 | import './settings-menu-button' |
8 | import './webtorrent-info-button' | 10 | import './webtorrent-info-button' |
9 | import './peertube-videojs-plugin' | 11 | import './peertube-videojs-plugin' |
10 | import { videojsUntyped } from './peertube-videojs-typings' | 12 | import { videojsUntyped } from './peertube-videojs-typings' |
13 | import { buildVideoEmbed, buildVideoLink, copyToClipboard } from './utils' | ||
11 | 14 | ||
12 | // Change 'Playback Rate' to 'Speed' (smaller for our settings menu) | 15 | // Change 'Playback Rate' to 'Speed' (smaller for our settings menu) |
13 | videojsUntyped.getComponent('PlaybackRateMenuButton').prototype.controlText_ = 'Speed' | 16 | videojsUntyped.getComponent('PlaybackRateMenuButton').prototype.controlText_ = 'Speed' |
@@ -16,6 +19,7 @@ function getVideojsOptions (options: { | |||
16 | autoplay: boolean, | 19 | autoplay: boolean, |
17 | playerElement: HTMLVideoElement, | 20 | playerElement: HTMLVideoElement, |
18 | videoViewUrl: string, | 21 | videoViewUrl: string, |
22 | videoEmbedUrl: string, | ||
19 | videoDuration: number, | 23 | videoDuration: number, |
20 | videoFiles: VideoFile[], | 24 | videoFiles: VideoFile[], |
21 | enableHotkeys: boolean, | 25 | enableHotkeys: boolean, |
@@ -38,6 +42,29 @@ function getVideojsOptions (options: { | |||
38 | videoViewUrl: options.videoViewUrl, | 42 | videoViewUrl: options.videoViewUrl, |
39 | videoDuration: options.videoDuration, | 43 | videoDuration: options.videoDuration, |
40 | startTime: options.startTime | 44 | startTime: options.startTime |
45 | }, | ||
46 | contextmenuUI: { | ||
47 | content: [ | ||
48 | { | ||
49 | label: 'Copy the video URL', | ||
50 | listener: function () { | ||
51 | copyToClipboard(buildVideoLink()) | ||
52 | } | ||
53 | }, | ||
54 | { | ||
55 | label: 'Copy the video URL at the current time', | ||
56 | listener: function () { | ||
57 | const player = this | ||
58 | copyToClipboard(buildVideoLink(player.currentTime())) | ||
59 | } | ||
60 | }, | ||
61 | { | ||
62 | label: 'Copy embed code', | ||
63 | listener: () => { | ||
64 | copyToClipboard(buildVideoEmbed(options.videoEmbedUrl)) | ||
65 | } | ||
66 | } | ||
67 | ] | ||
41 | } | 68 | } |
42 | }, | 69 | }, |
43 | controlBar: { | 70 | controlBar: { |
diff --git a/client/src/assets/player/peertube-videojs-plugin.ts b/client/src/assets/player/peertube-videojs-plugin.ts index d9ded7a7e..65103f3ab 100644 --- a/client/src/assets/player/peertube-videojs-plugin.ts +++ b/client/src/assets/player/peertube-videojs-plugin.ts | |||
@@ -268,6 +268,10 @@ class PeerTubePlugin extends Plugin { | |||
268 | this.trigger('autoResolutionUpdate') | 268 | this.trigger('autoResolutionUpdate') |
269 | } | 269 | } |
270 | 270 | ||
271 | getCurrentVideoFile () { | ||
272 | return this.currentVideoFile | ||
273 | } | ||
274 | |||
271 | private tryToPlay (done?: Function) { | 275 | private tryToPlay (done?: Function) { |
272 | if (!done) done = function () { /* empty */ } | 276 | if (!done) done = function () { /* empty */ } |
273 | 277 | ||
diff --git a/client/src/assets/player/utils.ts b/client/src/assets/player/utils.ts index 1df39d4e4..487b3a1be 100644 --- a/client/src/assets/player/utils.ts +++ b/client/src/assets/player/utils.ts | |||
@@ -64,14 +64,48 @@ function isMobile () { | |||
64 | return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent) | 64 | return /iPhone|iPad|iPod|Android/i.test(navigator.userAgent) |
65 | } | 65 | } |
66 | 66 | ||
67 | function buildVideoLink (time?: number) { | ||
68 | let href = window.location.href.replace('/embed/', '/watch/') | ||
69 | if (time) { | ||
70 | const timeInt = Math.floor(time) | ||
71 | |||
72 | if (window.location.search) href += '&start=' + timeInt | ||
73 | else href += '?start=' + timeInt | ||
74 | } | ||
75 | |||
76 | return href | ||
77 | } | ||
78 | |||
79 | function buildVideoEmbed (embedUrl: string) { | ||
80 | return '<iframe width="560" height="315" ' + | ||
81 | 'src="' + embedUrl + '" ' + | ||
82 | 'frameborder="0" allowfullscreen>' + | ||
83 | '</iframe>' | ||
84 | } | ||
85 | |||
86 | function copyToClipboard (text: string) { | ||
87 | const el = document.createElement('textarea') | ||
88 | el.value = text | ||
89 | el.setAttribute('readonly', '') | ||
90 | el.style.position = 'absolute' | ||
91 | el.style.left = '-9999px' | ||
92 | document.body.appendChild(el) | ||
93 | el.select() | ||
94 | document.execCommand('copy') | ||
95 | document.body.removeChild(el) | ||
96 | } | ||
97 | |||
67 | export { | 98 | export { |
68 | toTitleCase, | 99 | toTitleCase, |
100 | buildVideoLink, | ||
69 | getStoredVolume, | 101 | getStoredVolume, |
70 | saveVolumeInStore, | 102 | saveVolumeInStore, |
71 | saveAverageBandwidth, | 103 | saveAverageBandwidth, |
72 | getAverageBandwidth, | 104 | getAverageBandwidth, |
73 | saveMuteInStore, | 105 | saveMuteInStore, |
106 | buildVideoEmbed, | ||
74 | getStoredMute, | 107 | getStoredMute, |
108 | copyToClipboard, | ||
75 | isMobile, | 109 | isMobile, |
76 | bytes | 110 | bytes |
77 | } | 111 | } |
diff --git a/client/src/assets/player/video-renderer.ts b/client/src/assets/player/video-renderer.ts index 4b54b661a..4affb43cf 100644 --- a/client/src/assets/player/video-renderer.ts +++ b/client/src/assets/player/video-renderer.ts | |||
@@ -50,7 +50,7 @@ function renderMedia (file, elem: HTMLVideoElement, opts: RenderMediaOptions, ca | |||
50 | 50 | ||
51 | return fallbackToMediaSource() | 51 | return fallbackToMediaSource() |
52 | }) | 52 | }) |
53 | preparedElem.addEventListener('canplay', onLoadStart) | 53 | preparedElem.addEventListener('loadstart', onLoadStart) |
54 | return videostream(file, preparedElem) | 54 | return videostream(file, preparedElem) |
55 | } | 55 | } |
56 | 56 | ||
@@ -66,7 +66,7 @@ function renderMedia (file, elem: HTMLVideoElement, opts: RenderMediaOptions, ca | |||
66 | 66 | ||
67 | return callback(err) | 67 | return callback(err) |
68 | }) | 68 | }) |
69 | preparedElem.addEventListener('canplay', onLoadStart) | 69 | preparedElem.addEventListener('loadstart', onLoadStart) |
70 | 70 | ||
71 | const wrapper = new MediaElementWrapper(preparedElem) | 71 | const wrapper = new MediaElementWrapper(preparedElem) |
72 | const writable = wrapper.createWriteStream(codecs) | 72 | const writable = wrapper.createWriteStream(codecs) |
@@ -95,7 +95,7 @@ function renderMedia (file, elem: HTMLVideoElement, opts: RenderMediaOptions, ca | |||
95 | } | 95 | } |
96 | 96 | ||
97 | function onLoadStart () { | 97 | function onLoadStart () { |
98 | preparedElem.removeEventListener('canplay', onLoadStart) | 98 | preparedElem.removeEventListener('loadstart', onLoadStart) |
99 | if (opts.autoplay) preparedElem.play() | 99 | if (opts.autoplay) preparedElem.play() |
100 | 100 | ||
101 | callback(null, renderer) | 101 | callback(null, renderer) |
diff --git a/client/src/sass/video-js-custom.scss b/client/src/sass/video-js-custom.scss index 680958a9f..350e7cdd5 100644 --- a/client/src/sass/video-js-custom.scss +++ b/client/src/sass/video-js-custom.scss | |||
@@ -21,6 +21,8 @@ $slider-bg-color: lighten($primary-background-color, 33%); | |||
21 | $setting-transition-duration: 0.15s; | 21 | $setting-transition-duration: 0.15s; |
22 | $setting-transition-easing: ease-out; | 22 | $setting-transition-easing: ease-out; |
23 | 23 | ||
24 | $context-menu-width: 350px; | ||
25 | |||
24 | .video-js.vjs-peertube-skin { | 26 | .video-js.vjs-peertube-skin { |
25 | font-size: $font-size; | 27 | font-size: $font-size; |
26 | color: $primary-foreground-color; | 28 | color: $primary-foreground-color; |
@@ -787,4 +789,32 @@ $setting-transition-easing: ease-out; | |||
787 | } | 789 | } |
788 | } | 790 | } |
789 | } | 791 | } |
792 | } | ||
793 | |||
794 | /* Sass for videojs-contextmenu-ui */ | ||
795 | |||
796 | .video-js .vjs-contextmenu-ui-menu { | ||
797 | position: absolute; | ||
798 | background-color: rgba(0, 0, 0, 0.5); | ||
799 | padding: 5px 0; | ||
800 | width: $context-menu-width; | ||
801 | |||
802 | .vjs-menu-content { | ||
803 | opacity: $primary-foreground-opacity; | ||
804 | color: $primary-foreground-color; | ||
805 | font-size: $font-size !important; | ||
806 | font-weight: $font-semibold; | ||
807 | } | ||
808 | |||
809 | .vjs-menu-item { | ||
810 | cursor: pointer; | ||
811 | font-size: 1em; | ||
812 | padding: 8px 16px; | ||
813 | text-align: left; | ||
814 | text-transform: none; | ||
815 | |||
816 | &:hover { | ||
817 | background-color: rgba(255, 255, 255, 0.2); | ||
818 | } | ||
819 | } | ||
790 | } \ No newline at end of file | 820 | } \ No newline at end of file |
diff --git a/client/src/standalone/videos/embed.ts b/client/src/standalone/videos/embed.ts index ba906cc32..d603690ca 100644 --- a/client/src/standalone/videos/embed.ts +++ b/client/src/standalone/videos/embed.ts | |||
@@ -91,6 +91,7 @@ loadVideoInfo(videoId) | |||
91 | const videojsOptions = getVideojsOptions({ | 91 | const videojsOptions = getVideojsOptions({ |
92 | autoplay, | 92 | autoplay, |
93 | inactivityTimeout: 1500, | 93 | inactivityTimeout: 1500, |
94 | videoEmbedUrl: window.location.origin + videoInfo.embedPath, | ||
94 | videoViewUrl: getVideoUrl(videoId) + '/views', | 95 | videoViewUrl: getVideoUrl(videoId) + '/views', |
95 | playerElement: videoElement, | 96 | playerElement: videoElement, |
96 | videoFiles: videoInfo.files, | 97 | videoFiles: videoInfo.files, |
diff --git a/client/yarn.lock b/client/yarn.lock index 7806611f2..fe2e040d8 100644 --- a/client/yarn.lock +++ b/client/yarn.lock | |||
@@ -10006,6 +10006,21 @@ video.js@^5.19.2, "video.js@^6.8.0 || ^7.0.0", video.js@^7, video.js@^7.0.3: | |||
10006 | videojs-vtt.js "0.14.1" | 10006 | videojs-vtt.js "0.14.1" |
10007 | xhr "2.4.0" | 10007 | xhr "2.4.0" |
10008 | 10008 | ||
10009 | videojs-contextmenu-ui@^4.0.0: | ||
10010 | version "4.0.0" | ||
10011 | resolved "https://registry.yarnpkg.com/videojs-contextmenu-ui/-/videojs-contextmenu-ui-4.0.0.tgz#e7ffceacac95c5d2bc7f80db6f75675404de542a" | ||
10012 | dependencies: | ||
10013 | global "^4.3.2" | ||
10014 | video.js "^5.19.2" | ||
10015 | videojs-contextmenu "^2.0.0" | ||
10016 | |||
10017 | videojs-contextmenu@^2.0.0: | ||
10018 | version "2.0.0" | ||
10019 | resolved "https://registry.yarnpkg.com/videojs-contextmenu/-/videojs-contextmenu-2.0.0.tgz#7213c8c420ecd2904d26f19c21085f7ebf496e9e" | ||
10020 | dependencies: | ||
10021 | global "^4.3.2" | ||
10022 | video.js "^5.19.2" | ||
10023 | |||
10009 | videojs-dock@^2.0.2: | 10024 | videojs-dock@^2.0.2: |
10010 | version "2.1.2" | 10025 | version "2.1.2" |
10011 | resolved "https://registry.yarnpkg.com/videojs-dock/-/videojs-dock-2.1.2.tgz#621c27c6f7dd131c541535300ac545377e515a0e" | 10026 | resolved "https://registry.yarnpkg.com/videojs-dock/-/videojs-dock-2.1.2.tgz#621c27c6f7dd131c541535300ac545377e515a0e" |
diff --git a/package.json b/package.json index 4e890d771..608646e7d 100644 --- a/package.json +++ b/package.json | |||
@@ -65,7 +65,7 @@ | |||
65 | "lint-staged": { | 65 | "lint-staged": { |
66 | "*.{css,md}": "precise-commits", | 66 | "*.{css,md}": "precise-commits", |
67 | "*.scss": [ | 67 | "*.scss": [ |
68 | "sass-lint-auto-fix -c .sass-lint.yml --verbose", | 68 | "sass-lint -c .sass-lint.yml", |
69 | "git add" | 69 | "git add" |
70 | ] | 70 | ] |
71 | }, | 71 | }, |
@@ -156,7 +156,7 @@ | |||
156 | "chai-json-schema": "^1.5.0", | 156 | "chai-json-schema": "^1.5.0", |
157 | "chai-xml": "^0.3.2", | 157 | "chai-xml": "^0.3.2", |
158 | "husky": "^1.0.0-rc.4", | 158 | "husky": "^1.0.0-rc.4", |
159 | "libxmljs": "^0.18.9-pre0", | 159 | "libxmljs": "0.18.8", |
160 | "lint-staged": "^7.1.0", | 160 | "lint-staged": "^7.1.0", |
161 | "maildev": "^1.0.0-rc3", | 161 | "maildev": "^1.0.0-rc3", |
162 | "mocha": "^5.0.0", | 162 | "mocha": "^5.0.0", |
@@ -165,7 +165,6 @@ | |||
165 | "prettier": "1.13.2", | 165 | "prettier": "1.13.2", |
166 | "prompt": "^1.0.0", | 166 | "prompt": "^1.0.0", |
167 | "sass-lint": "^1.12.1", | 167 | "sass-lint": "^1.12.1", |
168 | "sass-lint-auto-fix": "^0.10.0", | ||
169 | "source-map-support": "^0.5.0", | 168 | "source-map-support": "^0.5.0", |
170 | "spectacle-docs": "^1.0.2", | 169 | "spectacle-docs": "^1.0.2", |
171 | "supertest": "^3.0.0", | 170 | "supertest": "^3.0.0", |
@@ -398,7 +398,7 @@ ajv-keywords@^1.0.0: | |||
398 | version "1.5.1" | 398 | version "1.5.1" |
399 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" | 399 | resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" |
400 | 400 | ||
401 | ajv@^4.7.0, ajv@^4.9.1: | 401 | ajv@^4.7.0: |
402 | version "4.11.8" | 402 | version "4.11.8" |
403 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" | 403 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" |
404 | dependencies: | 404 | dependencies: |
@@ -2849,15 +2849,7 @@ fsevents@^1.1.2: | |||
2849 | nan "^2.9.2" | 2849 | nan "^2.9.2" |
2850 | node-pre-gyp "^0.10.0" | 2850 | node-pre-gyp "^0.10.0" |
2851 | 2851 | ||
2852 | fstream-ignore@^1.0.5: | 2852 | fstream@^1.0.0, fstream@^1.0.2: |
2853 | version "1.0.5" | ||
2854 | resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" | ||
2855 | dependencies: | ||
2856 | fstream "^1.0.0" | ||
2857 | inherits "2" | ||
2858 | minimatch "^3.0.0" | ||
2859 | |||
2860 | fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: | ||
2861 | version "1.0.11" | 2853 | version "1.0.11" |
2862 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" | 2854 | resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" |
2863 | dependencies: | 2855 | dependencies: |
@@ -3308,10 +3300,6 @@ gzip-size@^3.0.0: | |||
3308 | optionalDependencies: | 3300 | optionalDependencies: |
3309 | uglify-js "^2.6" | 3301 | uglify-js "^2.6" |
3310 | 3302 | ||
3311 | har-schema@^1.0.5: | ||
3312 | version "1.0.5" | ||
3313 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" | ||
3314 | |||
3315 | har-schema@^2.0.0: | 3303 | har-schema@^2.0.0: |
3316 | version "2.0.0" | 3304 | version "2.0.0" |
3317 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" | 3305 | resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" |
@@ -3325,13 +3313,6 @@ har-validator@~2.0.6: | |||
3325 | is-my-json-valid "^2.12.4" | 3313 | is-my-json-valid "^2.12.4" |
3326 | pinkie-promise "^2.0.0" | 3314 | pinkie-promise "^2.0.0" |
3327 | 3315 | ||
3328 | har-validator@~4.2.1: | ||
3329 | version "4.2.1" | ||
3330 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" | ||
3331 | dependencies: | ||
3332 | ajv "^4.9.1" | ||
3333 | har-schema "^1.0.5" | ||
3334 | |||
3335 | har-validator@~5.0.3: | 3316 | har-validator@~5.0.3: |
3336 | version "5.0.3" | 3317 | version "5.0.3" |
3337 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" | 3318 | resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" |
@@ -3419,7 +3400,7 @@ hashish@~0.0.4: | |||
3419 | dependencies: | 3400 | dependencies: |
3420 | traverse ">=0.2.4" | 3401 | traverse ">=0.2.4" |
3421 | 3402 | ||
3422 | hawk@3.1.3, hawk@~3.1.3: | 3403 | hawk@~3.1.3: |
3423 | version "3.1.3" | 3404 | version "3.1.3" |
3424 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" | 3405 | resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" |
3425 | dependencies: | 3406 | dependencies: |
@@ -4451,13 +4432,13 @@ levn@^0.3.0, levn@~0.3.0: | |||
4451 | prelude-ls "~1.1.2" | 4432 | prelude-ls "~1.1.2" |
4452 | type-check "~0.3.2" | 4433 | type-check "~0.3.2" |
4453 | 4434 | ||
4454 | libxmljs@^0.18.9-pre0: | 4435 | libxmljs@0.18.8: |
4455 | version "0.18.9-pre0" | 4436 | version "0.18.8" |
4456 | resolved "https://registry.yarnpkg.com/libxmljs/-/libxmljs-0.18.9-pre0.tgz#2e607aae228d856777bab1205d54e0dcefe825ba" | 4437 | resolved "https://registry.yarnpkg.com/libxmljs/-/libxmljs-0.18.8.tgz#b0a07512a01290b6240600d6c2bc33a3c70976d6" |
4457 | dependencies: | 4438 | dependencies: |
4458 | bindings "~1.3.0" | 4439 | bindings "^1.3.0" |
4459 | nan "~2.10.0" | 4440 | nan "~2.10.0" |
4460 | node-pre-gyp "~0.6.37" | 4441 | node-pre-gyp "^0.9.1" |
4461 | 4442 | ||
4462 | lint-staged@^7.1.0: | 4443 | lint-staged@^7.1.0: |
4463 | version "7.1.2" | 4444 | version "7.1.2" |
@@ -5013,7 +4994,7 @@ minimatch@0.3: | |||
5013 | lru-cache "2" | 4994 | lru-cache "2" |
5014 | sigmund "~1.0.0" | 4995 | sigmund "~1.0.0" |
5015 | 4996 | ||
5016 | "minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: | 4997 | "minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4, minimatch@~3.0.2: |
5017 | version "3.0.4" | 4998 | version "3.0.4" |
5018 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" | 4999 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" |
5019 | dependencies: | 5000 | dependencies: |
@@ -5283,7 +5264,7 @@ node-gyp@^3.3.1: | |||
5283 | tar "^2.0.0" | 5264 | tar "^2.0.0" |
5284 | which "1" | 5265 | which "1" |
5285 | 5266 | ||
5286 | node-pre-gyp@0.9.1: | 5267 | node-pre-gyp@0.9.1, node-pre-gyp@^0.9.1: |
5287 | version "0.9.1" | 5268 | version "0.9.1" |
5288 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz#f11c07516dd92f87199dbc7e1838eab7cd56c9e0" | 5269 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.9.1.tgz#f11c07516dd92f87199dbc7e1838eab7cd56c9e0" |
5289 | dependencies: | 5270 | dependencies: |
@@ -5313,22 +5294,6 @@ node-pre-gyp@^0.10.0: | |||
5313 | semver "^5.3.0" | 5294 | semver "^5.3.0" |
5314 | tar "^4" | 5295 | tar "^4" |
5315 | 5296 | ||
5316 | node-pre-gyp@~0.6.37: | ||
5317 | version "0.6.39" | ||
5318 | resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" | ||
5319 | dependencies: | ||
5320 | detect-libc "^1.0.2" | ||
5321 | hawk "3.1.3" | ||
5322 | mkdirp "^0.5.1" | ||
5323 | nopt "^4.0.1" | ||
5324 | npmlog "^4.0.2" | ||
5325 | rc "^1.1.7" | ||
5326 | request "2.81.0" | ||
5327 | rimraf "^2.6.1" | ||
5328 | semver "^5.3.0" | ||
5329 | tar "^2.2.1" | ||
5330 | tar-pack "^3.4.0" | ||
5331 | |||
5332 | node-redis-scripty@0.0.5: | 5297 | node-redis-scripty@0.0.5: |
5333 | version "0.0.5" | 5298 | version "0.0.5" |
5334 | resolved "https://registry.yarnpkg.com/node-redis-scripty/-/node-redis-scripty-0.0.5.tgz#4bf2d365ab6dab202cc08b7ac63f8f55aadc9625" | 5299 | resolved "https://registry.yarnpkg.com/node-redis-scripty/-/node-redis-scripty-0.0.5.tgz#4bf2d365ab6dab202cc08b7ac63f8f55aadc9625" |
@@ -5866,10 +5831,6 @@ pem@^1.12.3: | |||
5866 | safe-buffer "^5.1.1" | 5831 | safe-buffer "^5.1.1" |
5867 | which "^1.2.4" | 5832 | which "^1.2.4" |
5868 | 5833 | ||
5869 | performance-now@^0.2.0: | ||
5870 | version "0.2.0" | ||
5871 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" | ||
5872 | |||
5873 | performance-now@^2.1.0: | 5834 | performance-now@^2.1.0: |
5874 | version "2.1.0" | 5835 | version "2.1.0" |
5875 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" | 5836 | resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" |
@@ -6289,10 +6250,6 @@ qs@~6.3.0: | |||
6289 | version "6.3.2" | 6250 | version "6.3.2" |
6290 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" | 6251 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" |
6291 | 6252 | ||
6292 | qs@~6.4.0: | ||
6293 | version "6.4.0" | ||
6294 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" | ||
6295 | |||
6296 | random-access-file@^2.0.1: | 6253 | random-access-file@^2.0.1: |
6297 | version "2.0.1" | 6254 | version "2.0.1" |
6298 | resolved "https://registry.yarnpkg.com/random-access-file/-/random-access-file-2.0.1.tgz#dc22de79270e9a84cb36a2419b759725930dcaeb" | 6255 | resolved "https://registry.yarnpkg.com/random-access-file/-/random-access-file-2.0.1.tgz#dc22de79270e9a84cb36a2419b759725930dcaeb" |
@@ -6604,33 +6561,6 @@ request@2, request@^2.81.0, request@^2.83.0: | |||
6604 | tunnel-agent "^0.6.0" | 6561 | tunnel-agent "^0.6.0" |
6605 | uuid "^3.1.0" | 6562 | uuid "^3.1.0" |
6606 | 6563 | ||
6607 | request@2.81.0: | ||
6608 | version "2.81.0" | ||
6609 | resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" | ||
6610 | dependencies: | ||
6611 | aws-sign2 "~0.6.0" | ||
6612 | aws4 "^1.2.1" | ||
6613 | caseless "~0.12.0" | ||
6614 | combined-stream "~1.0.5" | ||
6615 | extend "~3.0.0" | ||
6616 | forever-agent "~0.6.1" | ||
6617 | form-data "~2.1.1" | ||
6618 | har-validator "~4.2.1" | ||
6619 | hawk "~3.1.3" | ||
6620 | http-signature "~1.1.0" | ||
6621 | is-typedarray "~1.0.0" | ||
6622 | isstream "~0.1.2" | ||
6623 | json-stringify-safe "~5.0.1" | ||
6624 | mime-types "~2.1.7" | ||
6625 | oauth-sign "~0.8.1" | ||
6626 | performance-now "^0.2.0" | ||
6627 | qs "~6.4.0" | ||
6628 | safe-buffer "^5.0.1" | ||
6629 | stringstream "~0.0.4" | ||
6630 | tough-cookie "~2.3.0" | ||
6631 | tunnel-agent "^0.6.0" | ||
6632 | uuid "^3.0.0" | ||
6633 | |||
6634 | request@~2.79.0: | 6564 | request@~2.79.0: |
6635 | version "2.79.0" | 6565 | version "2.79.0" |
6636 | resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" | 6566 | resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" |
@@ -6734,7 +6664,7 @@ right-align@^0.1.1: | |||
6734 | dependencies: | 6664 | dependencies: |
6735 | align-text "^0.1.1" | 6665 | align-text "^0.1.1" |
6736 | 6666 | ||
6737 | rimraf@2, rimraf@2.x.x, rimraf@^2.2.1, rimraf@^2.2.8, rimraf@^2.4.2, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1: | 6667 | rimraf@2, rimraf@2.x.x, rimraf@^2.2.1, rimraf@^2.2.8, rimraf@^2.4.2, rimraf@^2.5.4, rimraf@^2.6.1: |
6738 | version "2.6.2" | 6668 | version "2.6.2" |
6739 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" | 6669 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" |
6740 | dependencies: | 6670 | dependencies: |
@@ -6811,9 +6741,9 @@ sass-graph@^2.2.4: | |||
6811 | scss-tokenizer "^0.2.3" | 6741 | scss-tokenizer "^0.2.3" |
6812 | yargs "^7.0.0" | 6742 | yargs "^7.0.0" |
6813 | 6743 | ||
6814 | sass-lint-auto-fix@^0.10.0: | 6744 | sass-lint-auto-fix@^0.9.0: |
6815 | version "0.10.0" | 6745 | version "0.9.2" |
6816 | resolved "https://registry.yarnpkg.com/sass-lint-auto-fix/-/sass-lint-auto-fix-0.10.0.tgz#89fd3cfd29fae30ddb7bbefa488053553ef0f10e" | 6746 | resolved "https://registry.yarnpkg.com/sass-lint-auto-fix/-/sass-lint-auto-fix-0.9.2.tgz#b8b6eb95644f7919dfea33d04c1fc19ae8f07a11" |
6817 | dependencies: | 6747 | dependencies: |
6818 | chalk "^2.3.2" | 6748 | chalk "^2.3.2" |
6819 | commander "^2.15.1" | 6749 | commander "^2.15.1" |
@@ -7693,19 +7623,6 @@ tar-fs@^1.13.0: | |||
7693 | pump "^1.0.0" | 7623 | pump "^1.0.0" |
7694 | tar-stream "^1.1.2" | 7624 | tar-stream "^1.1.2" |
7695 | 7625 | ||
7696 | tar-pack@^3.4.0: | ||
7697 | version "3.4.1" | ||
7698 | resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" | ||
7699 | dependencies: | ||
7700 | debug "^2.2.0" | ||
7701 | fstream "^1.0.10" | ||
7702 | fstream-ignore "^1.0.5" | ||
7703 | once "^1.3.3" | ||
7704 | readable-stream "^2.1.4" | ||
7705 | rimraf "^2.5.1" | ||
7706 | tar "^2.2.1" | ||
7707 | uid-number "^0.0.6" | ||
7708 | |||
7709 | tar-stream@^1.1.2: | 7626 | tar-stream@^1.1.2: |
7710 | version "1.6.1" | 7627 | version "1.6.1" |
7711 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395" | 7628 | resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.6.1.tgz#f84ef1696269d6223ca48f6e1eeede3f7e81f395" |
@@ -7718,7 +7635,7 @@ tar-stream@^1.1.2: | |||
7718 | to-buffer "^1.1.0" | 7635 | to-buffer "^1.1.0" |
7719 | xtend "^4.0.0" | 7636 | xtend "^4.0.0" |
7720 | 7637 | ||
7721 | tar@^2.0.0, tar@^2.2.1: | 7638 | tar@^2.0.0: |
7722 | version "2.2.1" | 7639 | version "2.2.1" |
7723 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" | 7640 | resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" |
7724 | dependencies: | 7641 | dependencies: |
@@ -8054,10 +7971,6 @@ uglify-to-browserify@~1.0.0: | |||
8054 | version "1.0.2" | 7971 | version "1.0.2" |
8055 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" | 7972 | resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" |
8056 | 7973 | ||
8057 | uid-number@^0.0.6: | ||
8058 | version "0.0.6" | ||
8059 | resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" | ||
8060 | |||
8061 | uint64be@^1.0.1: | 7974 | uint64be@^1.0.1: |
8062 | version "1.0.1" | 7975 | version "1.0.1" |
8063 | resolved "https://registry.yarnpkg.com/uint64be/-/uint64be-1.0.1.tgz#1f7154202f2a1b8af353871dda651bf34ce93e95" | 7976 | resolved "https://registry.yarnpkg.com/uint64be/-/uint64be-1.0.1.tgz#1f7154202f2a1b8af353871dda651bf34ce93e95" |