aboutsummaryrefslogtreecommitdiffhomepage
path: root/client
diff options
context:
space:
mode:
Diffstat (limited to 'client')
-rw-r--r--client/package.json2
-rw-r--r--client/src/app/+accounts/accounts.component.ts1
-rw-r--r--client/src/app/+video-channels/video-channel-playlists/video-channel-playlists.component.html2
-rw-r--r--client/src/app/shared/forms/form-reactive.ts2
-rw-r--r--client/src/app/shared/misc/utils.ts4
-rw-r--r--client/src/app/shared/renderer/markdown.service.ts2
-rw-r--r--client/src/app/shared/video-playlist/video-playlist-element-miniature.component.html4
-rw-r--r--client/src/app/shared/video-playlist/video-playlist-miniature.component.html2
-rw-r--r--client/src/app/videos/+video-watch/video-watch.component.html2
-rw-r--r--client/src/assets/player/p2p-media-loader/segment-url-builder.ts4
-rw-r--r--client/src/assets/player/utils.ts4
-rw-r--r--client/src/assets/player/videojs-components/resolution-menu-button.ts2
-rw-r--r--client/src/assets/player/videojs-components/settings-menu-button.ts18
-rw-r--r--client/src/assets/player/videojs-components/settings-menu-item.ts10
-rw-r--r--client/src/assets/player/webtorrent/peertube-chunk-store.ts6
-rw-r--r--client/src/assets/player/webtorrent/video-renderer.ts2
-rw-r--r--client/src/assets/player/webtorrent/webtorrent-plugin.ts2
-rw-r--r--client/src/polyfills.ts1
-rw-r--r--client/src/standalone/player/definitions.ts4
-rw-r--r--client/src/standalone/player/events.ts4
-rw-r--r--client/src/standalone/videos/embed.ts12
-rw-r--r--client/src/standalone/videos/test-embed.ts24
-rw-r--r--client/tsconfig.json1
-rw-r--r--client/tslint.json30
-rw-r--r--client/yarn.lock56
25 files changed, 81 insertions, 120 deletions
diff --git a/client/package.json b/client/package.json
index edcddcfee..c1532ee62 100644
--- a/client/package.json
+++ b/client/package.json
@@ -73,7 +73,6 @@
73 "bootstrap": "^4.1.3", 73 "bootstrap": "^4.1.3",
74 "buffer": "^5.1.0", 74 "buffer": "^5.1.0",
75 "cache-chunk-store": "^3.0.0", 75 "cache-chunk-store": "^3.0.0",
76 "codelyzer": "^5.0.0",
77 "core-js": "^3.0.0", 76 "core-js": "^3.0.0",
78 "css-loader": "^2.1.1", 77 "css-loader": "^2.1.1",
79 "dexie": "^2.0.4", 78 "dexie": "^2.0.4",
@@ -118,6 +117,7 @@
118 "stream-http": "^3.0.0", 117 "stream-http": "^3.0.0",
119 "terser-webpack-plugin": "^1.1.0", 118 "terser-webpack-plugin": "^1.1.0",
120 "tslint": "^5.7.0", 119 "tslint": "^5.7.0",
120 "tslint-angular": "^1.1.2",
121 "tslint-config-standard": "^8.0.1", 121 "tslint-config-standard": "^8.0.1",
122 "typescript": "3.2", 122 "typescript": "3.2",
123 "video.js": "^7", 123 "video.js": "^7",
diff --git a/client/src/app/+accounts/accounts.component.ts b/client/src/app/+accounts/accounts.component.ts
index e8339b78b..d9786fb5c 100644
--- a/client/src/app/+accounts/accounts.component.ts
+++ b/client/src/app/+accounts/accounts.component.ts
@@ -7,7 +7,6 @@ import { catchError, distinctUntilChanged, map, switchMap, tap } from 'rxjs/oper
7import { Subscription } from 'rxjs' 7import { Subscription } from 'rxjs'
8import { AuthService, Notifier, RedirectService } from '@app/core' 8import { AuthService, Notifier, RedirectService } from '@app/core'
9import { User, UserRight } from '../../../../shared' 9import { User, UserRight } from '../../../../shared'
10import { I18n } from '@ngx-translate/i18n-polyfill'
11 10
12@Component({ 11@Component({
13 templateUrl: './accounts.component.html', 12 templateUrl: './accounts.component.html',
diff --git a/client/src/app/+video-channels/video-channel-playlists/video-channel-playlists.component.html b/client/src/app/+video-channels/video-channel-playlists/video-channel-playlists.component.html
index 0d9fba375..befc7143c 100644
--- a/client/src/app/+video-channels/video-channel-playlists/video-channel-playlists.component.html
+++ b/client/src/app/+video-channels/video-channel-playlists/video-channel-playlists.component.html
@@ -1,5 +1,5 @@
1<div i18n class="title-page title-page-single"> 1<div i18n class="title-page title-page-single">
2 Created {{pagination.totalItems}} playlists 2 Created {{ pagination.totalItems }} playlists
3</div> 3</div>
4 4
5<div i18n class="no-results" *ngIf="pagination.totalItems === 0">This channel does not have playlists.</div> 5<div i18n class="no-results" *ngIf="pagination.totalItems === 0">This channel does not have playlists.</div>
diff --git a/client/src/app/shared/forms/form-reactive.ts b/client/src/app/shared/forms/form-reactive.ts
index b9873af2c..0d40b6f4a 100644
--- a/client/src/app/shared/forms/form-reactive.ts
+++ b/client/src/app/shared/forms/form-reactive.ts
@@ -59,7 +59,7 @@ export abstract class FormReactive {
59 const isDirty = control.dirty || forceCheck === true 59 const isDirty = control.dirty || forceCheck === true
60 if (control && isDirty && !control.valid) { 60 if (control && isDirty && !control.valid) {
61 const messages = validationMessages[ field ] 61 const messages = validationMessages[ field ]
62 for (const key in control.errors) { 62 for (const key of Object.keys(control.errors)) {
63 formErrors[ field ] += messages[ key ] + ' ' 63 formErrors[ field ] += messages[ key ] + ' '
64 } 64 }
65 } 65 }
diff --git a/client/src/app/shared/misc/utils.ts b/client/src/app/shared/misc/utils.ts
index 8a1d342c9..85fc1c3a0 100644
--- a/client/src/app/shared/misc/utils.ts
+++ b/client/src/app/shared/misc/utils.ts
@@ -78,10 +78,10 @@ function objectToUrlEncoded (obj: any) {
78 78
79// Thanks: https://gist.github.com/ghinda/8442a57f22099bdb2e34 79// Thanks: https://gist.github.com/ghinda/8442a57f22099bdb2e34
80function objectToFormData (obj: any, form?: FormData, namespace?: string) { 80function objectToFormData (obj: any, form?: FormData, namespace?: string) {
81 let fd = form || new FormData() 81 const fd = form || new FormData()
82 let formKey 82 let formKey
83 83
84 for (let key of Object.keys(obj)) { 84 for (const key of Object.keys(obj)) {
85 if (namespace) formKey = `${namespace}[${key}]` 85 if (namespace) formKey = `${namespace}[${key}]`
86 else formKey = key 86 else formKey = key
87 87
diff --git a/client/src/app/shared/renderer/markdown.service.ts b/client/src/app/shared/renderer/markdown.service.ts
index 69dc60aaf..9a9066351 100644
--- a/client/src/app/shared/renderer/markdown.service.ts
+++ b/client/src/app/shared/renderer/markdown.service.ts
@@ -45,7 +45,7 @@ export class MarkdownService {
45 45
46 const markdownIt = new MarkdownItClass('zero', { linkify: true, breaks: true }) 46 const markdownIt = new MarkdownItClass('zero', { linkify: true, breaks: true })
47 47
48 for (let rule of rules) { 48 for (const rule of rules) {
49 markdownIt.enable(rule) 49 markdownIt.enable(rule)
50 } 50 }
51 51
diff --git a/client/src/app/shared/video-playlist/video-playlist-element-miniature.component.html b/client/src/app/shared/video-playlist/video-playlist-element-miniature.component.html
index 4764fc0e1..ab5a78928 100644
--- a/client/src/app/shared/video-playlist/video-playlist-element-miniature.component.html
+++ b/client/src/app/shared/video-playlist/video-playlist-element-miniature.component.html
@@ -19,7 +19,7 @@
19 <a *ngIf="accountLink" tabindex="-1" class="video-info-account" [routerLink]="[ '/accounts', video.byAccount ]">{{ video.byAccount }}</a> 19 <a *ngIf="accountLink" tabindex="-1" class="video-info-account" [routerLink]="[ '/accounts', video.byAccount ]">{{ video.byAccount }}</a>
20 <span *ngIf="!accountLink" tabindex="-1" class="video-info-account">{{ video.byAccount }}</span> 20 <span *ngIf="!accountLink" tabindex="-1" class="video-info-account">{{ video.byAccount }}</span>
21 21
22 <span tabindex="-1" class="video-info-timestamp">{{ formatTimestamp(video)}}</span> 22 <span tabindex="-1" class="video-info-timestamp">{{ formatTimestamp(video) }}</span>
23 </div> 23 </div>
24 </a> 24 </a>
25 25
@@ -66,7 +66,7 @@
66 </div> 66 </div>
67 67
68 <span class="dropdown-item" (click)="removeFromPlaylist(video)"> 68 <span class="dropdown-item" (click)="removeFromPlaylist(video)">
69 <my-global-icon iconName="delete"></my-global-icon> <ng-container i18n>Delete from {{playlist?.displayName}}</ng-container> 69 <my-global-icon iconName="delete"></my-global-icon> <ng-container i18n>Delete from {{ playlist?.displayName }}</ng-container>
70 </span> 70 </span>
71 </div> 71 </div>
72 </div> 72 </div>
diff --git a/client/src/app/shared/video-playlist/video-playlist-miniature.component.html b/client/src/app/shared/video-playlist/video-playlist-miniature.component.html
index c01c73012..faf906c59 100644
--- a/client/src/app/shared/video-playlist/video-playlist-miniature.component.html
+++ b/client/src/app/shared/video-playlist/video-playlist-miniature.component.html
@@ -6,7 +6,7 @@
6 <img alt="" [attr.aria-labelledby]="playlist.displayName" [attr.src]="playlist.thumbnailUrl" /> 6 <img alt="" [attr.aria-labelledby]="playlist.displayName" [attr.src]="playlist.thumbnailUrl" />
7 7
8 <div class="miniature-playlist-info-overlay"> 8 <div class="miniature-playlist-info-overlay">
9 <ng-container i18n>{playlist.videosLength, plural, =0 {No videos} =1 {1 video} other {{{playlist.videosLength}} videos}}</ng-container> 9 <ng-container i18n>{playlist.videosLength, plural, =0 {No videos} =1 {1 video} other {{{ playlist.videosLength }} videos}}</ng-container>
10 </div> 10 </div>
11 11
12 <div class="play-overlay"> 12 <div class="play-overlay">
diff --git a/client/src/app/videos/+video-watch/video-watch.component.html b/client/src/app/videos/+video-watch/video-watch.component.html
index 91f77cbf3..ad1d04b70 100644
--- a/client/src/app/videos/+video-watch/video-watch.component.html
+++ b/client/src/app/videos/+video-watch/video-watch.component.html
@@ -22,7 +22,7 @@
22 <div class="playlist-by-index"> 22 <div class="playlist-by-index">
23 <div class="playlist-by">{{ playlist.ownerBy }}</div> 23 <div class="playlist-by">{{ playlist.ownerBy }}</div>
24 <div class="playlist-index"> 24 <div class="playlist-index">
25 <span>{{currentPlaylistPosition}}</span><span>{{playlistPagination.totalItems}}</span> 25 <span>{{ currentPlaylistPosition }}</span><span>{{ playlistPagination.totalItems }}</span>
26 </div> 26 </div>
27 </div> 27 </div>
28 </div> 28 </div>
diff --git a/client/src/assets/player/p2p-media-loader/segment-url-builder.ts b/client/src/assets/player/p2p-media-loader/segment-url-builder.ts
index 32e7ce4f2..fb990a19d 100644
--- a/client/src/assets/player/p2p-media-loader/segment-url-builder.ts
+++ b/client/src/assets/player/p2p-media-loader/segment-url-builder.ts
@@ -8,8 +8,8 @@ function segmentUrlBuilderFactory (baseUrls: string[]) {
8 8
9 if (i === max - 1) return segment.url 9 if (i === max - 1) return segment.url
10 10
11 let newBaseUrl = baseUrls[i] 11 const newBaseUrl = baseUrls[i]
12 let middlePart = newBaseUrl.endsWith('/') ? '' : '/' 12 const middlePart = newBaseUrl.endsWith('/') ? '' : '/'
13 13
14 return newBaseUrl + middlePart + basename(segment.url) 14 return newBaseUrl + middlePart + basename(segment.url)
15 } 15 }
diff --git a/client/src/assets/player/utils.ts b/client/src/assets/player/utils.ts
index 54f131310..0966027ac 100644
--- a/client/src/assets/player/utils.ts
+++ b/client/src/assets/player/utils.ts
@@ -61,12 +61,12 @@ function secondsToTime (seconds: number, full = false, symbol?: string) {
61 const minuteSymbol = (symbol || 'm') 61 const minuteSymbol = (symbol || 'm')
62 const secondsSymbol = full ? '' : 's' 62 const secondsSymbol = full ? '' : 's'
63 63
64 let hours = Math.floor(seconds / 3600) 64 const hours = Math.floor(seconds / 3600)
65 if (hours >= 1) time = hours + hourSymbol 65 if (hours >= 1) time = hours + hourSymbol
66 else if (full) time = '0' + hourSymbol 66 else if (full) time = '0' + hourSymbol
67 67
68 seconds %= 3600 68 seconds %= 3600
69 let minutes = Math.floor(seconds / 60) 69 const minutes = Math.floor(seconds / 60)
70 if (minutes >= 1 && minutes < 10 && full) time += '0' + minutes + minuteSymbol 70 if (minutes >= 1 && minutes < 10 && full) time += '0' + minutes + minuteSymbol
71 else if (minutes >= 1) time += minutes + minuteSymbol 71 else if (minutes >= 1) time += minutes + minuteSymbol
72 else if (full) time += '00' + minuteSymbol 72 else if (full) time += '00' + minuteSymbol
diff --git a/client/src/assets/player/videojs-components/resolution-menu-button.ts b/client/src/assets/player/videojs-components/resolution-menu-button.ts
index abcc16411..cff44de72 100644
--- a/client/src/assets/player/videojs-components/resolution-menu-button.ts
+++ b/client/src/assets/player/videojs-components/resolution-menu-button.ts
@@ -49,7 +49,7 @@ class ResolutionMenuButton extends MenuButton {
49 49
50 private addClickListener (component: any) { 50 private addClickListener (component: any) {
51 component.on('click', () => { 51 component.on('click', () => {
52 let children = this.menu.children() 52 const children = this.menu.children()
53 53
54 for (const child of children) { 54 for (const child of children) {
55 if (component !== child) { 55 if (component !== child) {
diff --git a/client/src/assets/player/videojs-components/settings-menu-button.ts b/client/src/assets/player/videojs-components/settings-menu-button.ts
index 14cb8ba43..5e09032b4 100644
--- a/client/src/assets/player/videojs-components/settings-menu-button.ts
+++ b/client/src/assets/player/videojs-components/settings-menu-button.ts
@@ -53,7 +53,7 @@ class SettingsButton extends Button {
53 53
54 onDisposeSettingsItem (event: any, name: string) { 54 onDisposeSettingsItem (event: any, name: string) {
55 if (name === undefined) { 55 if (name === undefined) {
56 let children = this.menu.children() 56 const children = this.menu.children()
57 57
58 while (children.length > 0) { 58 while (children.length > 0) {
59 children[0].dispose() 59 children[0].dispose()
@@ -62,7 +62,7 @@ class SettingsButton extends Button {
62 62
63 this.addClass('vjs-hidden') 63 this.addClass('vjs-hidden')
64 } else { 64 } else {
65 let item = this.menu.getChild(name) 65 const item = this.menu.getChild(name)
66 66
67 if (item) { 67 if (item) {
68 item.dispose() 68 item.dispose()
@@ -148,8 +148,8 @@ class SettingsButton extends Button {
148 return 148 return
149 } 149 }
150 150
151 let offset = this.options_.setup.maxHeightOffset 151 const offset = this.options_.setup.maxHeightOffset
152 let maxHeight = this.playerComponent.el_.offsetHeight - offset 152 const maxHeight = this.playerComponent.el_.offsetHeight - offset
153 153
154 if (height > maxHeight) { 154 if (height > maxHeight) {
155 height = maxHeight 155 height = maxHeight
@@ -166,7 +166,7 @@ class SettingsButton extends Button {
166 buildMenu () { 166 buildMenu () {
167 this.menu = new Menu(this.player()) 167 this.menu = new Menu(this.player())
168 this.menu.addClass('vjs-main-menu') 168 this.menu.addClass('vjs-main-menu')
169 let entries = this.options_.entries 169 const entries = this.options_.entries
170 170
171 if (entries.length === 0) { 171 if (entries.length === 0) {
172 this.addClass('vjs-hidden') 172 this.addClass('vjs-hidden')
@@ -174,7 +174,7 @@ class SettingsButton extends Button {
174 return 174 return
175 } 175 }
176 176
177 for (let entry of entries) { 177 for (const entry of entries) {
178 this.addMenuItem(entry, this.options_) 178 this.addMenuItem(entry, this.options_)
179 } 179 }
180 180
@@ -191,7 +191,7 @@ class SettingsButton extends Button {
191 } 191 }
192 192
193 options.name = toTitleCase(entry) 193 options.name = toTitleCase(entry)
194 let settingsMenuItem = new SettingsMenuItem(this.player(), options, entry, this as any) 194 const settingsMenuItem = new SettingsMenuItem(this.player(), options, entry, this as any)
195 195
196 this.menu.addChild(settingsMenuItem) 196 this.menu.addChild(settingsMenuItem)
197 197
@@ -204,7 +204,7 @@ class SettingsButton extends Button {
204 } 204 }
205 205
206 resetChildren () { 206 resetChildren () {
207 for (let menuChild of this.menu.children()) { 207 for (const menuChild of this.menu.children()) {
208 menuChild.reset() 208 menuChild.reset()
209 } 209 }
210 } 210 }
@@ -213,7 +213,7 @@ class SettingsButton extends Button {
213 * Hide all the sub menus 213 * Hide all the sub menus
214 */ 214 */
215 hideChildren () { 215 hideChildren () {
216 for (let menuChild of this.menu.children()) { 216 for (const menuChild of this.menu.children()) {
217 menuChild.hideSubMenu() 217 menuChild.hideSubMenu()
218 } 218 }
219 } 219 }
diff --git a/client/src/assets/player/videojs-components/settings-menu-item.ts b/client/src/assets/player/videojs-components/settings-menu-item.ts
index f14959f9c..78879a2ec 100644
--- a/client/src/assets/player/videojs-components/settings-menu-item.ts
+++ b/client/src/assets/player/videojs-components/settings-menu-item.ts
@@ -167,7 +167,7 @@ class SettingsMenuItem extends MenuItem {
167 * @method PrefixedEvent 167 * @method PrefixedEvent
168 */ 168 */
169 PrefixedEvent (element: any, type: any, callback: any, action = 'addEvent') { 169 PrefixedEvent (element: any, type: any, callback: any, action = 'addEvent') {
170 let prefix = ['webkit', 'moz', 'MS', 'o', ''] 170 const prefix = ['webkit', 'moz', 'MS', 'o', '']
171 171
172 for (let p = 0; p < prefix.length; p++) { 172 for (let p = 0; p < prefix.length; p++) {
173 if (!prefix[p]) { 173 if (!prefix[p]) {
@@ -249,7 +249,7 @@ class SettingsMenuItem extends MenuItem {
249 249
250 update (event?: any) { 250 update (event?: any) {
251 let target: HTMLElement = null 251 let target: HTMLElement = null
252 let subMenu = this.subMenu.name() 252 const subMenu = this.subMenu.name()
253 253
254 if (event && event.type === 'tap') { 254 if (event && event.type === 'tap') {
255 target = event.target 255 target = event.target
@@ -264,7 +264,7 @@ class SettingsMenuItem extends MenuItem {
264 setTimeout(() => this.settingsSubMenuValueEl_.innerHTML = this.subMenu.labelEl_.innerHTML, 250) 264 setTimeout(() => this.settingsSubMenuValueEl_.innerHTML = this.subMenu.labelEl_.innerHTML, 250)
265 } else { 265 } else {
266 // Loop trough the submenu items to find the selected child 266 // Loop trough the submenu items to find the selected child
267 for (let subMenuItem of this.subMenu.menu.children_) { 267 for (const subMenuItem of this.subMenu.menu.children_) {
268 if (!(subMenuItem instanceof component)) { 268 if (!(subMenuItem instanceof component)) {
269 continue 269 continue
270 } 270 }
@@ -287,7 +287,7 @@ class SettingsMenuItem extends MenuItem {
287 } 287 }
288 288
289 bindClickEvents () { 289 bindClickEvents () {
290 for (let item of this.subMenu.menu.children()) { 290 for (const item of this.subMenu.menu.children()) {
291 if (!(item instanceof component)) { 291 if (!(item instanceof component)) {
292 continue 292 continue
293 } 293 }
@@ -307,7 +307,7 @@ class SettingsMenuItem extends MenuItem {
307 } 307 }
308 308
309 setMargin () { 309 setMargin () {
310 let [width] = this.size 310 const [ width ] = this.size
311 311
312 this.settingsSubMenuEl_.style.marginRight = `-${width}px` 312 this.settingsSubMenuEl_.style.marginRight = `-${width}px`
313 } 313 }
diff --git a/client/src/assets/player/webtorrent/peertube-chunk-store.ts b/client/src/assets/player/webtorrent/peertube-chunk-store.ts
index 54cc0ea64..66762bef8 100644
--- a/client/src/assets/player/webtorrent/peertube-chunk-store.ts
+++ b/client/src/assets/player/webtorrent/peertube-chunk-store.ts
@@ -131,7 +131,7 @@ export class PeertubeChunkStore extends EventEmitter {
131 // Chunk in store 131 // Chunk in store
132 this.db.transaction('r', this.db.chunks, async () => { 132 this.db.transaction('r', this.db.chunks, async () => {
133 const result = await this.db.chunks.get({ id: index }) 133 const result = await this.db.chunks.get({ id: index })
134 if (result === undefined) return cb(null, new Buffer(0)) 134 if (result === undefined) return cb(null, Buffer.alloc(0))
135 135
136 const buf = result.buf 136 const buf = result.buf
137 if (!opts) return this.nextTick(cb, null, buf) 137 if (!opts) return this.nextTick(cb, null, buf)
@@ -162,13 +162,13 @@ export class PeertubeChunkStore extends EventEmitter {
162 } 162 }
163 163
164 if (this.db) { 164 if (this.db) {
165 await this.db.close() 165 this.db.close()
166 166
167 await this.dropDatabase(this.databaseName) 167 await this.dropDatabase(this.databaseName)
168 } 168 }
169 169
170 if (this.expirationDB) { 170 if (this.expirationDB) {
171 await this.expirationDB.close() 171 this.expirationDB.close()
172 this.expirationDB = null 172 this.expirationDB = null
173 } 173 }
174 174
diff --git a/client/src/assets/player/webtorrent/video-renderer.ts b/client/src/assets/player/webtorrent/video-renderer.ts
index a3415937b..4dce87112 100644
--- a/client/src/assets/player/webtorrent/video-renderer.ts
+++ b/client/src/assets/player/webtorrent/video-renderer.ts
@@ -29,7 +29,7 @@ function renderVideo (
29 29
30function renderMedia (file: any, elem: HTMLVideoElement, opts: RenderMediaOptions, callback: (err: Error, renderer?: any) => void) { 30function renderMedia (file: any, elem: HTMLVideoElement, opts: RenderMediaOptions, callback: (err: Error, renderer?: any) => void) {
31 const extension = extname(file.name).toLowerCase() 31 const extension = extname(file.name).toLowerCase()
32 let preparedElem: any = undefined 32 let preparedElem: any
33 let currentTime = 0 33 let currentTime = 0
34 let renderer: any 34 let renderer: any
35 35
diff --git a/client/src/assets/player/webtorrent/webtorrent-plugin.ts b/client/src/assets/player/webtorrent/webtorrent-plugin.ts
index c7182acc9..eee3d4db9 100644
--- a/client/src/assets/player/webtorrent/webtorrent-plugin.ts
+++ b/client/src/assets/player/webtorrent/webtorrent-plugin.ts
@@ -347,7 +347,7 @@ class WebTorrentPlugin extends Plugin {
347 if (!averageDownloadSpeed) averageDownloadSpeed = this.getAndSaveActualDownloadSpeed() 347 if (!averageDownloadSpeed) averageDownloadSpeed = this.getAndSaveActualDownloadSpeed()
348 348
349 // Limit resolution according to player height 349 // Limit resolution according to player height
350 const playerHeight = this.playerElement.offsetHeight as number 350 const playerHeight = this.playerElement.offsetHeight
351 351
352 // We take the first resolution just above the player height 352 // We take the first resolution just above the player height
353 // Example: player height is 530px, we want the 720p file instead of 480p 353 // Example: player height is 530px, we want the 720p file instead of 480p
diff --git a/client/src/polyfills.ts b/client/src/polyfills.ts
index 368908432..b68c07fdb 100644
--- a/client/src/polyfills.ts
+++ b/client/src/polyfills.ts
@@ -76,6 +76,7 @@ import 'core-js/es7/object'
76/*************************************************************************************************** 76/***************************************************************************************************
77 * Zone JS is required by default for Angular itself. 77 * Zone JS is required by default for Angular itself.
78 */ 78 */
79// tslint:disable
79import 'zone.js/dist/zone' // Included with Angular CLI. 80import 'zone.js/dist/zone' // Included with Angular CLI.
80 81
81/*************************************************************************************************** 82/***************************************************************************************************
diff --git a/client/src/standalone/player/definitions.ts b/client/src/standalone/player/definitions.ts
index 7f9ef9b6f..afd10541b 100644
--- a/client/src/standalone/player/definitions.ts
+++ b/client/src/standalone/player/definitions.ts
@@ -1,6 +1,4 @@
1export interface EventHandler<T> { 1export type EventHandler<T> = (ev: T) => void
2 (ev: T): void
3}
4 2
5export type PlayerEventType = 3export type PlayerEventType =
6 'pause' | 'play' | 4 'pause' | 'play' |
diff --git a/client/src/standalone/player/events.ts b/client/src/standalone/player/events.ts
index f1639ef19..28a13c727 100644
--- a/client/src/standalone/player/events.ts
+++ b/client/src/standalone/player/events.ts
@@ -13,13 +13,13 @@ export class EventRegistrar {
13 private eventRegistrations: PlayerEventRegistrationMap = {} 13 private eventRegistrations: PlayerEventRegistrationMap = {}
14 14
15 public bindToChannel (channel: Channel.MessagingChannel) { 15 public bindToChannel (channel: Channel.MessagingChannel) {
16 for (let name of Object.keys(this.eventRegistrations)) { 16 for (const name of Object.keys(this.eventRegistrations)) {
17 channel.bind(name, (txn, params) => this.fire(name, params)) 17 channel.bind(name, (txn, params) => this.fire(name, params))
18 } 18 }
19 } 19 }
20 20
21 public registerTypes (names: string[]) { 21 public registerTypes (names: string[]) {
22 for (let name of names) { 22 for (const name of names) {
23 this.eventRegistrations[ name ] = { registrations: [] } 23 this.eventRegistrations[ name ] = { registrations: [] }
24 } 24 }
25 } 25 }
diff --git a/client/src/standalone/videos/embed.ts b/client/src/standalone/videos/embed.ts
index b55b4bace..626d55a7c 100644
--- a/client/src/standalone/videos/embed.ts
+++ b/client/src/standalone/videos/embed.ts
@@ -40,7 +40,7 @@ class PeerTubeEmbedApi {
40 } 40 }
41 41
42 private constructChannel () { 42 private constructChannel () {
43 let channel = Channel.build({ window: window.parent, origin: '*', scope: this.embed.scope }) 43 const channel = Channel.build({ window: window.parent, origin: '*', scope: this.embed.scope })
44 44
45 channel.bind('play', (txn, params) => this.embed.player.play()) 45 channel.bind('play', (txn, params) => this.embed.player.play())
46 channel.bind('pause', (txn, params) => this.embed.player.pause()) 46 channel.bind('pause', (txn, params) => this.embed.player.pause())
@@ -82,8 +82,8 @@ class PeerTubeEmbedApi {
82 let currentState: 'playing' | 'paused' | 'unstarted' = 'unstarted' 82 let currentState: 'playing' | 'paused' | 'unstarted' = 'unstarted'
83 83
84 setInterval(() => { 84 setInterval(() => {
85 let position = this.element.currentTime 85 const position = this.element.currentTime
86 let volume = this.element.volume 86 const volume = this.element.volume
87 87
88 this.channel.notify({ 88 this.channel.notify({
89 method: 'playbackStatusUpdate', 89 method: 'playbackStatusUpdate',
@@ -114,8 +114,8 @@ class PeerTubeEmbedApi {
114 } 114 }
115 115
116 private loadWebTorrentResolutions () { 116 private loadWebTorrentResolutions () {
117 let resolutions = [] 117 const resolutions = []
118 let currentResolutionId = this.embed.player.webtorrent().getCurrentResolutionId() 118 const currentResolutionId = this.embed.player.webtorrent().getCurrentResolutionId()
119 119
120 for (const videoFile of this.embed.player.webtorrent().videoFiles) { 120 for (const videoFile of this.embed.player.webtorrent().videoFiles) {
121 let label = videoFile.resolution.label 121 let label = videoFile.resolution.label
@@ -235,7 +235,7 @@ class PeerTubeEmbed {
235 235
236 private loadParams () { 236 private loadParams () {
237 try { 237 try {
238 let params = new URL(window.location.toString()).searchParams 238 const params = new URL(window.location.toString()).searchParams
239 239
240 this.autoplay = this.getParamToggle(params, 'autoplay') 240 this.autoplay = this.getParamToggle(params, 'autoplay')
241 this.controls = this.getParamToggle(params, 'controls') 241 this.controls = this.getParamToggle(params, 'controls')
diff --git a/client/src/standalone/videos/test-embed.ts b/client/src/standalone/videos/test-embed.ts
index 30a298573..8e83d92a9 100644
--- a/client/src/standalone/videos/test-embed.ts
+++ b/client/src/standalone/videos/test-embed.ts
@@ -7,13 +7,13 @@ window.addEventListener('load', async () => {
7 const lastPart = urlParts[ urlParts.length - 1 ] 7 const lastPart = urlParts[ urlParts.length - 1 ]
8 const videoId = lastPart.indexOf('?') === -1 ? lastPart : lastPart.split('?')[ 0 ] 8 const videoId = lastPart.indexOf('?') === -1 ? lastPart : lastPart.split('?')[ 0 ]
9 9
10 let iframe = document.createElement('iframe') 10 const iframe = document.createElement('iframe')
11 iframe.src = `/videos/embed/${videoId}?autoplay=1&controls=0&api=1` 11 iframe.src = `/videos/embed/${videoId}?autoplay=1&controls=0&api=1`
12 let mainElement = document.querySelector('#host') 12 const mainElement = document.querySelector('#host')
13 mainElement.appendChild(iframe) 13 mainElement.appendChild(iframe)
14 14
15 console.log(`Document finished loading.`) 15 console.log(`Document finished loading.`)
16 let player = new PeerTubePlayer(document.querySelector('iframe')) 16 const player = new PeerTubePlayer(document.querySelector('iframe'))
17 17
18 window[ 'player' ] = player 18 window[ 'player' ] = player
19 19
@@ -21,7 +21,7 @@ window.addEventListener('load', async () => {
21 await player.ready 21 await player.ready
22 console.log(`Player is ready.`) 22 console.log(`Player is ready.`)
23 23
24 let monitoredEvents = [ 24 const monitoredEvents = [
25 'pause', 25 'pause',
26 'play', 26 'play',
27 'playbackStatusUpdate', 27 'playbackStatusUpdate',
@@ -36,18 +36,18 @@ window.addEventListener('load', async () => {
36 let playbackRates: number[] = [] 36 let playbackRates: number[] = []
37 let currentRate = await player.getPlaybackRate() 37 let currentRate = await player.getPlaybackRate()
38 38
39 let updateRates = async () => { 39 const updateRates = async () => {
40 let rateListEl = document.querySelector('#rate-list') 40 const rateListEl = document.querySelector('#rate-list')
41 rateListEl.innerHTML = '' 41 rateListEl.innerHTML = ''
42 42
43 playbackRates.forEach(rate => { 43 playbackRates.forEach(rate => {
44 if (currentRate === rate) { 44 if (currentRate === rate) {
45 let itemEl = document.createElement('strong') 45 const itemEl = document.createElement('strong')
46 itemEl.innerText = `${rate} (active)` 46 itemEl.innerText = `${rate} (active)`
47 itemEl.style.display = 'block' 47 itemEl.style.display = 'block'
48 rateListEl.appendChild(itemEl) 48 rateListEl.appendChild(itemEl)
49 } else { 49 } else {
50 let itemEl = document.createElement('a') 50 const itemEl = document.createElement('a')
51 itemEl.href = 'javascript:;' 51 itemEl.href = 'javascript:;'
52 itemEl.innerText = rate.toString() 52 itemEl.innerText = rate.toString()
53 itemEl.addEventListener('click', () => { 53 itemEl.addEventListener('click', () => {
@@ -66,18 +66,18 @@ window.addEventListener('load', async () => {
66 updateRates() 66 updateRates()
67 }) 67 })
68 68
69 let updateResolutions = ((resolutions: PeerTubeResolution[]) => { 69 const updateResolutions = ((resolutions: PeerTubeResolution[]) => {
70 let resolutionListEl = document.querySelector('#resolution-list') 70 const resolutionListEl = document.querySelector('#resolution-list')
71 resolutionListEl.innerHTML = '' 71 resolutionListEl.innerHTML = ''
72 72
73 resolutions.forEach(resolution => { 73 resolutions.forEach(resolution => {
74 if (resolution.active) { 74 if (resolution.active) {
75 let itemEl = document.createElement('strong') 75 const itemEl = document.createElement('strong')
76 itemEl.innerText = `${resolution.label} (active)` 76 itemEl.innerText = `${resolution.label} (active)`
77 itemEl.style.display = 'block' 77 itemEl.style.display = 'block'
78 resolutionListEl.appendChild(itemEl) 78 resolutionListEl.appendChild(itemEl)
79 } else { 79 } else {
80 let itemEl = document.createElement('a') 80 const itemEl = document.createElement('a')
81 itemEl.href = 'javascript:;' 81 itemEl.href = 'javascript:;'
82 itemEl.innerText = resolution.label 82 itemEl.innerText = resolution.label
83 itemEl.addEventListener('click', () => { 83 itemEl.addEventListener('click', () => {
diff --git a/client/tsconfig.json b/client/tsconfig.json
index a0fbc27c6..e46528d1c 100644
--- a/client/tsconfig.json
+++ b/client/tsconfig.json
@@ -43,6 +43,7 @@
43 "fullTemplateTypeCheck": true 43 "fullTemplateTypeCheck": true
44 }, 44 },
45 "include": [ 45 "include": [
46 "./src",
46 "../../shared" 47 "../../shared"
47 ], 48 ],
48 "exclude": [ 49 "exclude": [
diff --git a/client/tslint.json b/client/tslint.json
index fcc866ee3..f45b1d576 100644
--- a/client/tslint.json
+++ b/client/tslint.json
@@ -1,12 +1,12 @@
1{ 1{
2 "extends": "tslint-config-standard", 2 "extends": [ "tslint-angular", "tslint-config-standard" ],
3 "rulesDirectory": ["./node_modules/codelyzer"],
4 "rules": { 3 "rules": {
5 "no-inferrable-types": true, 4 "no-inferrable-types": true,
6 "eofline": true, 5 "eofline": true,
7 "max-line-length": [true, 140], 6 "max-line-length": [true, 140],
8 "no-floating-promises": false, 7 "no-floating-promises": false,
9 "no-unused-variable": false, // Memory issues 8 "no-unused-variable": false, // Memory issues
9 "await-promise": [true, "PromiseLike"],
10 "member-ordering": [true, { 10 "member-ordering": [true, {
11 "order": [ 11 "order": [
12 "public-static-field", 12 "public-static-field",
@@ -21,27 +21,9 @@
21 ]} 21 ]}
22 ], 22 ],
23 23
24 "angular-whitespace": [true, "check-interpolation", "check-semicolon"], 24 "no-shadowed-variable": false,
25 "banana-in-box": true, 25 "no-bitwise": false,
26 "templates-no-negated-async": true, 26 "max-classes-per-file": false,
27 "directive-selector": [true, "attribute", "my", "camelCase"], 27 "interface-over-type-literal": false
28 "component-selector": [true, "element", "my", "kebab-case"],
29 "use-input-property-decorator": true,
30 "use-output-property-decorator": true,
31 "use-host-property-decorator": true,
32 "use-view-encapsulation": true,
33 "no-attribute-parameter-decorator": true,
34 "no-input-rename": true,
35 "no-output-rename": true,
36 "no-output-on-prefix": true,
37 "no-forward-ref": false,
38 "use-life-cycle-interface": true,
39 "contextual-life-cycle": true,
40 "trackBy-function": false,
41 "use-pipe-transform-interface": true,
42 "pipe-prefix": [true, "my"],
43 "component-class-suffix": true,
44 "directive-class-suffix": true,
45 "pipe-impure": true
46 } 28 }
47} 29}
diff --git a/client/yarn.lock b/client/yarn.lock
index 361aa1e19..5be2cf642 100644
--- a/client/yarn.lock
+++ b/client/yarn.lock
@@ -961,14 +961,6 @@ argparse@^1.0.7:
961 dependencies: 961 dependencies:
962 sprintf-js "~1.0.2" 962 sprintf-js "~1.0.2"
963 963
964aria-query@^3.0.0:
965 version "3.0.0"
966 resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-3.0.0.tgz#65b3fcc1ca1155a8c9ae64d6eee297f15d5133cc"
967 integrity sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=
968 dependencies:
969 ast-types-flow "0.0.7"
970 commander "^2.11.0"
971
972arr-diff@^4.0.0: 964arr-diff@^4.0.0:
973 version "4.0.0" 965 version "4.0.0"
974 resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" 966 resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520"
@@ -1064,11 +1056,6 @@ assign-symbols@^1.0.0:
1064 resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" 1056 resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367"
1065 integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= 1057 integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=
1066 1058
1067ast-types-flow@0.0.7:
1068 version "0.0.7"
1069 resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
1070 integrity sha1-9wtzXGvKGlycItmCw+Oef+ujva0=
1071
1072ast-types@0.9.6: 1059ast-types@0.9.6:
1073 version "0.9.6" 1060 version "0.9.6"
1074 resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" 1061 resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9"
@@ -1147,13 +1134,6 @@ aws4@^1.8.0:
1147 resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" 1134 resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f"
1148 integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== 1135 integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==
1149 1136
1150axobject-query@^2.0.2:
1151 version "2.0.2"
1152 resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.0.2.tgz#ea187abe5b9002b377f925d8bf7d1c561adf38f9"
1153 integrity sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==
1154 dependencies:
1155 ast-types-flow "0.0.7"
1156
1157babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: 1137babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
1158 version "6.26.0" 1138 version "6.26.0"
1159 resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 1139 resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
@@ -1969,20 +1949,17 @@ code-point-at@^1.0.0:
1969 resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 1949 resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
1970 integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= 1950 integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
1971 1951
1972codelyzer@^5.0.0: 1952codelyzer@^4.0.2:
1973 version "5.0.0" 1953 version "4.5.0"
1974 resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-5.0.0.tgz#e4032efb23a7c5d4bcfe7321fc1789490c679837" 1954 resolved "https://registry.yarnpkg.com/codelyzer/-/codelyzer-4.5.0.tgz#a65ddeeeca2894653253a89bfa229118ff9f59b1"
1975 integrity sha512-Bif70XYt8NFf/Q9GPTxmC86OsBRfQZq1dBjdruJ5kZhJ8/jKhJL6MvCLKnYtSOG6Rhiv/44DU0cHk6GYthjy8Q== 1955 integrity sha512-oO6vCkjqsVrEsmh58oNlnJkRXuA30hF8cdNAQV9DytEalDwyOFRvHMnlKFzmOStNerOmPGZU9GAHnBo4tGvtiQ==
1976 dependencies: 1956 dependencies:
1977 app-root-path "^2.1.0" 1957 app-root-path "^2.1.0"
1978 aria-query "^3.0.0" 1958 css-selector-tokenizer "^0.7.0"
1979 axobject-query "^2.0.2"
1980 css-selector-tokenizer "^0.7.1"
1981 cssauron "^1.4.0" 1959 cssauron "^1.4.0"
1982 damerau-levenshtein "^1.0.4"
1983 semver-dsl "^1.0.1" 1960 semver-dsl "^1.0.1"
1984 source-map "^0.5.7" 1961 source-map "^0.5.7"
1985 sprintf-js "^1.1.2" 1962 sprintf-js "^1.1.1"
1986 1963
1987collection-visit@^1.0.0: 1964collection-visit@^1.0.0:
1988 version "1.0.0" 1965 version "1.0.0"
@@ -2026,7 +2003,7 @@ commander@2.17.x:
2026 resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf" 2003 resolved "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz#bd77ab7de6de94205ceacc72f1716d29f20a77bf"
2027 integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg== 2004 integrity sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==
2028 2005
2029commander@^2.11.0, commander@^2.12.1, commander@^2.18.0, commander@^2.19.0, commander@^2.9.0, commander@~2.19.0: 2006commander@^2.12.1, commander@^2.18.0, commander@^2.19.0, commander@^2.9.0, commander@~2.19.0:
2030 version "2.19.0" 2007 version "2.19.0"
2031 resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" 2008 resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
2032 integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== 2009 integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
@@ -2345,7 +2322,7 @@ css-select@^1.1.0:
2345 domutils "1.5.1" 2322 domutils "1.5.1"
2346 nth-check "~1.0.1" 2323 nth-check "~1.0.1"
2347 2324
2348css-selector-tokenizer@^0.7.1: 2325css-selector-tokenizer@^0.7.0:
2349 version "0.7.1" 2326 version "0.7.1"
2350 resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" 2327 resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d"
2351 integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA== 2328 integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA==
@@ -2415,11 +2392,6 @@ d@1:
2415 dependencies: 2392 dependencies:
2416 es5-ext "^0.10.9" 2393 es5-ext "^0.10.9"
2417 2394
2418damerau-levenshtein@^1.0.4:
2419 version "1.0.4"
2420 resolved "https://registry.yarnpkg.com/damerau-levenshtein/-/damerau-levenshtein-1.0.4.tgz#03191c432cb6eea168bb77f3a55ffdccb8978514"
2421 integrity sha1-AxkcQyy27qFou3fzpV/9zLiXhRQ=
2422
2423dashdash@^1.12.0: 2395dashdash@^1.12.0:
2424 version "1.14.1" 2396 version "1.14.1"
2425 resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" 2397 resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@@ -8065,7 +8037,7 @@ split@^1.0.0:
8065 dependencies: 8037 dependencies:
8066 through "2" 8038 through "2"
8067 8039
8068sprintf-js@^1.1.2: 8040sprintf-js@^1.1.1:
8069 version "1.1.2" 8041 version "1.1.2"
8070 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" 8042 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
8071 integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== 8043 integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
@@ -8592,6 +8564,14 @@ tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@~1.9.0:
8592 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 8564 resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
8593 integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== 8565 integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
8594 8566
8567tslint-angular@^1.1.2:
8568 version "1.1.2"
8569 resolved "https://registry.yarnpkg.com/tslint-angular/-/tslint-angular-1.1.2.tgz#5ce7020968e3b9dc7a40b6d15dadd6da34787309"
8570 integrity sha512-YDLdgQXBSFcVdDZH3mThx21fKzRctIgmCWpuwmppFLc7QHV3tdWDaFnD5lwUmgvLH8W0o+KsXhSzZ2uIsFJ+YA==
8571 dependencies:
8572 codelyzer "^4.0.2"
8573 tslint "^5.8.0"
8574
8595tslint-config-standard@^8.0.1: 8575tslint-config-standard@^8.0.1:
8596 version "8.0.1" 8576 version "8.0.1"
8597 resolved "https://registry.yarnpkg.com/tslint-config-standard/-/tslint-config-standard-8.0.1.tgz#e4dd3128e84b0e34b51990b68715a641f2b417e4" 8577 resolved "https://registry.yarnpkg.com/tslint-config-standard/-/tslint-config-standard-8.0.1.tgz#e4dd3128e84b0e34b51990b68715a641f2b417e4"
@@ -8608,7 +8588,7 @@ tslint-eslint-rules@^5.3.1:
8608 tslib "1.9.0" 8588 tslib "1.9.0"
8609 tsutils "^3.0.0" 8589 tsutils "^3.0.0"
8610 8590
8611tslint@^5.7.0: 8591tslint@^5.7.0, tslint@^5.8.0:
8612 version "5.15.0" 8592 version "5.15.0"
8613 resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.15.0.tgz#6ffb180986d63afa1e531feb2a134dbf961e27d3" 8593 resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.15.0.tgz#6ffb180986d63afa1e531feb2a134dbf961e27d3"
8614 integrity sha512-6bIEujKR21/3nyeoX2uBnE8s+tMXCQXhqMmaIPJpHmXJoBJPTLcI7/VHRtUwMhnLVdwLqqY3zmd8Dxqa5CVdJA== 8594 integrity sha512-6bIEujKR21/3nyeoX2uBnE8s+tMXCQXhqMmaIPJpHmXJoBJPTLcI7/VHRtUwMhnLVdwLqqY3zmd8Dxqa5CVdJA==