From 9639bd175726b73f8fe664b5ced12a72407b1f0b Mon Sep 17 00:00:00 2001 From: buoyantair Date: Mon, 29 Oct 2018 22:18:31 +0530 Subject: Move utils to /shared Move utils used by /server/tools/* & /server/tests/**/* into /shared folder. Issue: #1336 --- server/tests/activitypub.ts | 9 +- server/tests/api/check-params/accounts.ts | 10 +- server/tests/api/check-params/blocklist.ts | 8 +- server/tests/api/check-params/config.ts | 2 +- server/tests/api/check-params/follows.ts | 8 +- server/tests/api/check-params/jobs.ts | 18 +- server/tests/api/check-params/redundancy.ts | 2 +- server/tests/api/check-params/search.ts | 8 +- server/tests/api/check-params/services.ts | 10 +- .../tests/api/check-params/user-subscriptions.ts | 8 +- server/tests/api/check-params/users.ts | 12 +- server/tests/api/check-params/video-abuses.ts | 8 +- server/tests/api/check-params/video-blacklist.ts | 8 +- server/tests/api/check-params/video-captions.ts | 4 +- server/tests/api/check-params/video-channels.ts | 8 +- server/tests/api/check-params/video-comments.ts | 10 +- server/tests/api/check-params/video-imports.ts | 10 +- server/tests/api/check-params/videos-filter.ts | 2 +- server/tests/api/check-params/videos-history.ts | 2 +- server/tests/api/check-params/videos.ts | 10 +- server/tests/api/redundancy/redundancy.ts | 8 +- .../search/search-activitypub-video-channels.ts | 6 +- .../tests/api/search/search-activitypub-videos.ts | 4 +- server/tests/api/search/search-videos.ts | 2 +- server/tests/api/server/config.ts | 7 +- server/tests/api/server/email.ts | 13 +- server/tests/api/server/follows.ts | 27 +- server/tests/api/server/handle-down.ts | 15 +- server/tests/api/server/jobs.ts | 12 +- server/tests/api/server/redundancy.ts | 8 +- server/tests/api/server/reverse-proxy.ts | 4 +- server/tests/api/server/stats.ts | 10 +- server/tests/api/server/tracker.ts | 4 +- server/tests/api/users/blocklist.ts | 12 +- server/tests/api/users/user-subscriptions.ts | 19 +- server/tests/api/users/users-multiple-servers.ts | 10 +- server/tests/api/users/users-verification.ts | 8 +- server/tests/api/users/users.ts | 8 +- server/tests/api/videos/multiple-servers.ts | 6 +- server/tests/api/videos/services.ts | 12 +- server/tests/api/videos/single-server.ts | 2 +- server/tests/api/videos/video-abuse.ts | 6 +- .../tests/api/videos/video-blacklist-management.ts | 6 +- server/tests/api/videos/video-blacklist.ts | 6 +- server/tests/api/videos/video-captions.ts | 15 +- server/tests/api/videos/video-change-ownership.ts | 4 +- server/tests/api/videos/video-channels.ts | 6 +- server/tests/api/videos/video-comments.ts | 6 +- server/tests/api/videos/video-description.ts | 6 +- server/tests/api/videos/video-imports.ts | 6 +- server/tests/api/videos/video-nsfw.ts | 17 +- server/tests/api/videos/video-privacy.ts | 12 +- server/tests/api/videos/video-schedule-update.ts | 4 +- server/tests/api/videos/video-transcoder.ts | 4 +- server/tests/api/videos/videos-filter.ts | 2 +- server/tests/api/videos/videos-history.ts | 4 +- server/tests/api/videos/videos-overview.ts | 4 +- server/tests/cli/create-import-video-file-job.ts | 4 +- server/tests/cli/create-transcoding-job.ts | 4 +- server/tests/cli/optimize-old-videos.ts | 4 +- server/tests/cli/peertube.ts | 2 +- server/tests/cli/reset-password.ts | 2 +- server/tests/cli/update-host.ts | 8 +- server/tests/client.ts | 2 +- server/tests/feeds/feeds.ts | 6 +- server/tests/misc-endpoints.ts | 2 +- server/tests/real-world/populate-database.ts | 2 +- server/tests/real-world/real-world.ts | 4 +- server/tests/utils/cli/cli.ts | 24 - server/tests/utils/feeds/feeds.ts | 32 -- server/tests/utils/index.ts | 18 - server/tests/utils/miscs/email.ts | 25 - server/tests/utils/miscs/miscs.ts | 101 ---- server/tests/utils/overviews/overviews.ts | 18 - server/tests/utils/requests/check-api-params.ts | 40 -- server/tests/utils/requests/requests.ts | 168 ------ server/tests/utils/search/video-channels.ts | 22 - server/tests/utils/search/videos.ts | 77 --- server/tests/utils/server/activitypub.ts | 15 - server/tests/utils/server/clients.ts | 19 - server/tests/utils/server/config.ts | 135 ----- server/tests/utils/server/follows.ts | 79 --- server/tests/utils/server/jobs.ts | 77 --- server/tests/utils/server/redundancy.ts | 17 - server/tests/utils/server/servers.ts | 185 ------- server/tests/utils/server/stats.ts | 22 - server/tests/utils/users/accounts.ts | 63 --- server/tests/utils/users/blocklist.ts | 198 ------- server/tests/utils/users/login.ts | 62 --- server/tests/utils/users/user-subscriptions.ts | 82 --- server/tests/utils/users/users.ts | 296 ----------- server/tests/utils/videos/services.ts | 23 - server/tests/utils/videos/video-abuses.ts | 65 --- server/tests/utils/videos/video-blacklist.ts | 67 --- server/tests/utils/videos/video-captions.ts | 71 --- .../tests/utils/videos/video-change-ownership.ts | 54 -- server/tests/utils/videos/video-channels.ts | 118 ----- server/tests/utils/videos/video-comments.ts | 87 ---- server/tests/utils/videos/video-history.ts | 14 - server/tests/utils/videos/video-imports.ts | 51 -- server/tests/utils/videos/videos.ts | 576 --------------------- server/tools/peertube-get-access-token.ts | 2 +- server/tools/peertube-import-videos.ts | 2 +- server/tools/peertube-upload.ts | 4 +- shared/utils/cli/cli.ts | 24 + shared/utils/feeds/feeds.ts | 32 ++ shared/utils/index.ts | 18 + shared/utils/miscs/email.ts | 25 + shared/utils/miscs/miscs.ts | 101 ++++ shared/utils/overviews/overviews.ts | 18 + shared/utils/requests/check-api-params.ts | 40 ++ shared/utils/requests/requests.ts | 168 ++++++ shared/utils/search/video-channels.ts | 22 + shared/utils/search/videos.ts | 77 +++ shared/utils/server/activitypub.ts | 15 + shared/utils/server/clients.ts | 19 + shared/utils/server/config.ts | 135 +++++ shared/utils/server/follows.ts | 79 +++ shared/utils/server/jobs.ts | 77 +++ shared/utils/server/redundancy.ts | 17 + shared/utils/server/servers.ts | 185 +++++++ shared/utils/server/stats.ts | 22 + shared/utils/users/accounts.ts | 63 +++ shared/utils/users/blocklist.ts | 198 +++++++ shared/utils/users/login.ts | 62 +++ shared/utils/users/user-subscriptions.ts | 82 +++ shared/utils/users/users.ts | 296 +++++++++++ shared/utils/videos/services.ts | 23 + shared/utils/videos/video-abuses.ts | 65 +++ shared/utils/videos/video-blacklist.ts | 67 +++ shared/utils/videos/video-captions.ts | 71 +++ shared/utils/videos/video-change-ownership.ts | 54 ++ shared/utils/videos/video-channels.ts | 118 +++++ shared/utils/videos/video-comments.ts | 87 ++++ shared/utils/videos/video-history.ts | 14 + shared/utils/videos/video-imports.ts | 51 ++ shared/utils/videos/videos.ts | 576 +++++++++++++++++++++ 137 files changed, 3217 insertions(+), 3095 deletions(-) delete mode 100644 server/tests/utils/cli/cli.ts delete mode 100644 server/tests/utils/feeds/feeds.ts delete mode 100644 server/tests/utils/index.ts delete mode 100644 server/tests/utils/miscs/email.ts delete mode 100644 server/tests/utils/miscs/miscs.ts delete mode 100644 server/tests/utils/overviews/overviews.ts delete mode 100644 server/tests/utils/requests/check-api-params.ts delete mode 100644 server/tests/utils/requests/requests.ts delete mode 100644 server/tests/utils/search/video-channels.ts delete mode 100644 server/tests/utils/search/videos.ts delete mode 100644 server/tests/utils/server/activitypub.ts delete mode 100644 server/tests/utils/server/clients.ts delete mode 100644 server/tests/utils/server/config.ts delete mode 100644 server/tests/utils/server/follows.ts delete mode 100644 server/tests/utils/server/jobs.ts delete mode 100644 server/tests/utils/server/redundancy.ts delete mode 100644 server/tests/utils/server/servers.ts delete mode 100644 server/tests/utils/server/stats.ts delete mode 100644 server/tests/utils/users/accounts.ts delete mode 100644 server/tests/utils/users/blocklist.ts delete mode 100644 server/tests/utils/users/login.ts delete mode 100644 server/tests/utils/users/user-subscriptions.ts delete mode 100644 server/tests/utils/users/users.ts delete mode 100644 server/tests/utils/videos/services.ts delete mode 100644 server/tests/utils/videos/video-abuses.ts delete mode 100644 server/tests/utils/videos/video-blacklist.ts delete mode 100644 server/tests/utils/videos/video-captions.ts delete mode 100644 server/tests/utils/videos/video-change-ownership.ts delete mode 100644 server/tests/utils/videos/video-channels.ts delete mode 100644 server/tests/utils/videos/video-comments.ts delete mode 100644 server/tests/utils/videos/video-history.ts delete mode 100644 server/tests/utils/videos/video-imports.ts delete mode 100644 server/tests/utils/videos/videos.ts create mode 100644 shared/utils/cli/cli.ts create mode 100644 shared/utils/feeds/feeds.ts create mode 100644 shared/utils/index.ts create mode 100644 shared/utils/miscs/email.ts create mode 100644 shared/utils/miscs/miscs.ts create mode 100644 shared/utils/overviews/overviews.ts create mode 100644 shared/utils/requests/check-api-params.ts create mode 100644 shared/utils/requests/requests.ts create mode 100644 shared/utils/search/video-channels.ts create mode 100644 shared/utils/search/videos.ts create mode 100644 shared/utils/server/activitypub.ts create mode 100644 shared/utils/server/clients.ts create mode 100644 shared/utils/server/config.ts create mode 100644 shared/utils/server/follows.ts create mode 100644 shared/utils/server/jobs.ts create mode 100644 shared/utils/server/redundancy.ts create mode 100644 shared/utils/server/servers.ts create mode 100644 shared/utils/server/stats.ts create mode 100644 shared/utils/users/accounts.ts create mode 100644 shared/utils/users/blocklist.ts create mode 100644 shared/utils/users/login.ts create mode 100644 shared/utils/users/user-subscriptions.ts create mode 100644 shared/utils/users/users.ts create mode 100644 shared/utils/videos/services.ts create mode 100644 shared/utils/videos/video-abuses.ts create mode 100644 shared/utils/videos/video-blacklist.ts create mode 100644 shared/utils/videos/video-captions.ts create mode 100644 shared/utils/videos/video-change-ownership.ts create mode 100644 shared/utils/videos/video-channels.ts create mode 100644 shared/utils/videos/video-comments.ts create mode 100644 shared/utils/videos/video-history.ts create mode 100644 shared/utils/videos/video-imports.ts create mode 100644 shared/utils/videos/videos.ts diff --git a/server/tests/activitypub.ts b/server/tests/activitypub.ts index 53a04d363..0905c5dec 100644 --- a/server/tests/activitypub.ts +++ b/server/tests/activitypub.ts @@ -2,7 +2,14 @@ import * as chai from 'chai' import 'mocha' -import { flushTests, killallServers, makeActivityPubGetRequest, runServer, ServerInfo, setAccessTokensToServers } from './utils' +import { + flushTests, + killallServers, + makeActivityPubGetRequest, + runServer, + ServerInfo, + setAccessTokensToServers +} from '../../shared/utils' const expect = chai.expect diff --git a/server/tests/api/check-params/accounts.ts b/server/tests/api/check-params/accounts.ts index 9e0b1e35c..567fd072c 100644 --- a/server/tests/api/check-params/accounts.ts +++ b/server/tests/api/check-params/accounts.ts @@ -2,9 +2,13 @@ import 'mocha' -import { flushTests, killallServers, runServer, ServerInfo } from '../../utils' -import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' -import { getAccount } from '../../utils/users/accounts' +import { flushTests, killallServers, runServer, ServerInfo } from '../../../../shared/utils' +import { + checkBadCountPagination, + checkBadSortPagination, + checkBadStartPagination +} from '../../../../shared/utils/requests/check-api-params' +import { getAccount } from '../../../../shared/utils/users/accounts' describe('Test users API validators', function () { const path = '/api/v1/accounts/' diff --git a/server/tests/api/check-params/blocklist.ts b/server/tests/api/check-params/blocklist.ts index c745ac975..c20453c16 100644 --- a/server/tests/api/check-params/blocklist.ts +++ b/server/tests/api/check-params/blocklist.ts @@ -13,8 +13,12 @@ import { makePostBodyRequest, ServerInfo, setAccessTokensToServers, userLogin -} from '../../utils' -import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' +} from '../../../../shared/utils' +import { + checkBadCountPagination, + checkBadSortPagination, + checkBadStartPagination +} from '../../../../shared/utils/requests/check-api-params' describe('Test blocklist API validators', function () { let servers: ServerInfo[] diff --git a/server/tests/api/check-params/config.ts b/server/tests/api/check-params/config.ts index d807f910b..ffae380c1 100644 --- a/server/tests/api/check-params/config.ts +++ b/server/tests/api/check-params/config.ts @@ -7,7 +7,7 @@ import { CustomConfig } from '../../../../shared/models/server/custom-config.mod import { createUser, flushTests, killallServers, makeDeleteRequest, makeGetRequest, makePutBodyRequest, runServer, ServerInfo, setAccessTokensToServers, userLogin, immutableAssign -} from '../../utils' +} from '../../../../shared/utils' describe('Test config API validators', function () { const path = '/api/v1/config/custom' diff --git a/server/tests/api/check-params/follows.ts b/server/tests/api/check-params/follows.ts index cdc95c81a..2ad1575a3 100644 --- a/server/tests/api/check-params/follows.ts +++ b/server/tests/api/check-params/follows.ts @@ -5,8 +5,12 @@ import 'mocha' import { createUser, flushTests, killallServers, makeDeleteRequest, makePostBodyRequest, runServer, ServerInfo, setAccessTokensToServers, userLogin -} from '../../utils' -import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' +} from '../../../../shared/utils' +import { + checkBadCountPagination, + checkBadSortPagination, + checkBadStartPagination +} from '../../../../shared/utils/requests/check-api-params' describe('Test server follows API validators', function () { let server: ServerInfo diff --git a/server/tests/api/check-params/jobs.ts b/server/tests/api/check-params/jobs.ts index ce3ac8809..89760ff98 100644 --- a/server/tests/api/check-params/jobs.ts +++ b/server/tests/api/check-params/jobs.ts @@ -2,9 +2,21 @@ import 'mocha' -import { createUser, flushTests, killallServers, runServer, ServerInfo, setAccessTokensToServers, userLogin } from '../../utils' -import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' -import { makeGetRequest } from '../../utils/requests/requests' +import { + createUser, + flushTests, + killallServers, + runServer, + ServerInfo, + setAccessTokensToServers, + userLogin +} from '../../../../shared/utils' +import { + checkBadCountPagination, + checkBadSortPagination, + checkBadStartPagination +} from '../../../../shared/utils/requests/check-api-params' +import { makeGetRequest } from '../../../../shared/utils/requests/requests' describe('Test jobs API validators', function () { const path = '/api/v1/jobs/failed' diff --git a/server/tests/api/check-params/redundancy.ts b/server/tests/api/check-params/redundancy.ts index aa588e3dd..ff4726ceb 100644 --- a/server/tests/api/check-params/redundancy.ts +++ b/server/tests/api/check-params/redundancy.ts @@ -12,7 +12,7 @@ import { ServerInfo, setAccessTokensToServers, userLogin -} from '../../utils' +} from '../../../../shared/utils' describe('Test server redundancy API validators', function () { let servers: ServerInfo[] diff --git a/server/tests/api/check-params/search.ts b/server/tests/api/check-params/search.ts index eabf602ac..aa81965f3 100644 --- a/server/tests/api/check-params/search.ts +++ b/server/tests/api/check-params/search.ts @@ -2,8 +2,12 @@ import 'mocha' -import { flushTests, immutableAssign, killallServers, makeGetRequest, runServer, ServerInfo } from '../../utils' -import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' +import { flushTests, immutableAssign, killallServers, makeGetRequest, runServer, ServerInfo } from '../../../../shared/utils' +import { + checkBadCountPagination, + checkBadSortPagination, + checkBadStartPagination +} from '../../../../shared/utils/requests/check-api-params' describe('Test videos API validator', function () { let server: ServerInfo diff --git a/server/tests/api/check-params/services.ts b/server/tests/api/check-params/services.ts index fcde7e179..28591af9d 100644 --- a/server/tests/api/check-params/services.ts +++ b/server/tests/api/check-params/services.ts @@ -2,7 +2,15 @@ import 'mocha' -import { flushTests, killallServers, makeGetRequest, runServer, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../utils' +import { + flushTests, + killallServers, + makeGetRequest, + runServer, + ServerInfo, + setAccessTokensToServers, + uploadVideo +} from '../../../../shared/utils' describe('Test services API validators', function () { let server: ServerInfo diff --git a/server/tests/api/check-params/user-subscriptions.ts b/server/tests/api/check-params/user-subscriptions.ts index 9fba99ac8..2cf5a2415 100644 --- a/server/tests/api/check-params/user-subscriptions.ts +++ b/server/tests/api/check-params/user-subscriptions.ts @@ -13,8 +13,12 @@ import { ServerInfo, setAccessTokensToServers, userLogin -} from '../../utils' -import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' +} from '../../../../shared/utils' +import { + checkBadCountPagination, + checkBadSortPagination, + checkBadStartPagination +} from '../../../../shared/utils/requests/check-api-params' describe('Test user subscriptions API validators', function () { const path = '/api/v1/users/me/subscriptions' diff --git a/server/tests/api/check-params/users.ts b/server/tests/api/check-params/users.ts index ec46609a4..f4c177621 100644 --- a/server/tests/api/check-params/users.ts +++ b/server/tests/api/check-params/users.ts @@ -9,11 +9,15 @@ import { createUser, flushTests, getMyUserInformation, getMyUserVideoRating, getUsersList, immutableAssign, killallServers, makeGetRequest, makePostBodyRequest, makeUploadRequest, makePutBodyRequest, registerUser, removeUser, runServer, ServerInfo, setAccessTokensToServers, updateUser, uploadVideo, userLogin, deleteMe, unblockUser, blockUser -} from '../../utils' -import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' -import { getMagnetURI, getMyVideoImports, getYoutubeVideoUrl, importVideo } from '../../utils/videos/video-imports' +} from '../../../../shared/utils' +import { + checkBadCountPagination, + checkBadSortPagination, + checkBadStartPagination +} from '../../../../shared/utils/requests/check-api-params' +import { getMagnetURI, getMyVideoImports, getYoutubeVideoUrl, importVideo } from '../../../../shared/utils/videos/video-imports' import { VideoPrivacy } from '../../../../shared/models/videos' -import { waitJobs } from '../../utils/server/jobs' +import { waitJobs } from '../../../../shared/utils/server/jobs' import { expect } from 'chai' describe('Test users API validators', function () { diff --git a/server/tests/api/check-params/video-abuses.ts b/server/tests/api/check-params/video-abuses.ts index d2bed6a2a..a79ab4201 100644 --- a/server/tests/api/check-params/video-abuses.ts +++ b/server/tests/api/check-params/video-abuses.ts @@ -15,8 +15,12 @@ import { updateVideoAbuse, uploadVideo, userLogin -} from '../../utils' -import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' +} from '../../../../shared/utils' +import { + checkBadCountPagination, + checkBadSortPagination, + checkBadStartPagination +} from '../../../../shared/utils/requests/check-api-params' import { VideoAbuseState } from '../../../../shared/models/videos' describe('Test video abuses API validators', function () { diff --git a/server/tests/api/check-params/video-blacklist.ts b/server/tests/api/check-params/video-blacklist.ts index 473216236..8e1206db3 100644 --- a/server/tests/api/check-params/video-blacklist.ts +++ b/server/tests/api/check-params/video-blacklist.ts @@ -15,8 +15,12 @@ import { setAccessTokensToServers, uploadVideo, userLogin -} from '../../utils' -import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' +} from '../../../../shared/utils' +import { + checkBadCountPagination, + checkBadSortPagination, + checkBadStartPagination +} from '../../../../shared/utils/requests/check-api-params' import { VideoDetails } from '../../../../shared/models/videos' import { expect } from 'chai' diff --git a/server/tests/api/check-params/video-captions.ts b/server/tests/api/check-params/video-captions.ts index 8d46971a1..e4d36fd4f 100644 --- a/server/tests/api/check-params/video-captions.ts +++ b/server/tests/api/check-params/video-captions.ts @@ -13,9 +13,9 @@ import { setAccessTokensToServers, uploadVideo, userLogin -} from '../../utils' +} from '../../../../shared/utils' import { join } from 'path' -import { createVideoCaption } from '../../utils/videos/video-captions' +import { createVideoCaption } from '../../../../shared/utils/videos/video-captions' describe('Test video captions API validator', function () { const path = '/api/v1/videos/' diff --git a/server/tests/api/check-params/video-channels.ts b/server/tests/api/check-params/video-channels.ts index e5696224d..14e4deaf7 100644 --- a/server/tests/api/check-params/video-channels.ts +++ b/server/tests/api/check-params/video-channels.ts @@ -20,8 +20,12 @@ import { ServerInfo, setAccessTokensToServers, userLogin -} from '../../utils' -import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' +} from '../../../../shared/utils' +import { + checkBadCountPagination, + checkBadSortPagination, + checkBadStartPagination +} from '../../../../shared/utils/requests/check-api-params' import { User } from '../../../../shared/models/users' import { join } from 'path' diff --git a/server/tests/api/check-params/video-comments.ts b/server/tests/api/check-params/video-comments.ts index 5241832fe..5981780ed 100644 --- a/server/tests/api/check-params/video-comments.ts +++ b/server/tests/api/check-params/video-comments.ts @@ -6,9 +6,13 @@ import { createUser, flushTests, killallServers, makeDeleteRequest, makeGetRequest, makePostBodyRequest, runServer, ServerInfo, setAccessTokensToServers, uploadVideo, userLogin -} from '../../utils' -import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' -import { addVideoCommentThread } from '../../utils/videos/video-comments' +} from '../../../../shared/utils' +import { + checkBadCountPagination, + checkBadSortPagination, + checkBadStartPagination +} from '../../../../shared/utils/requests/check-api-params' +import { addVideoCommentThread } from '../../../../shared/utils/videos/video-comments' const expect = chai.expect diff --git a/server/tests/api/check-params/video-imports.ts b/server/tests/api/check-params/video-imports.ts index b51f3d2cd..7bf187007 100644 --- a/server/tests/api/check-params/video-imports.ts +++ b/server/tests/api/check-params/video-imports.ts @@ -18,9 +18,13 @@ import { setAccessTokensToServers, updateCustomSubConfig, userLogin -} from '../../utils' -import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' -import { getMagnetURI, getYoutubeVideoUrl } from '../../utils/videos/video-imports' +} from '../../../../shared/utils' +import { + checkBadCountPagination, + checkBadSortPagination, + checkBadStartPagination +} from '../../../../shared/utils/requests/check-api-params' +import { getMagnetURI, getYoutubeVideoUrl } from '../../../../shared/utils/videos/video-imports' describe('Test video imports API validator', function () { const path = '/api/v1/videos/imports' diff --git a/server/tests/api/check-params/videos-filter.ts b/server/tests/api/check-params/videos-filter.ts index 784cd8ba1..e998c8a3d 100644 --- a/server/tests/api/check-params/videos-filter.ts +++ b/server/tests/api/check-params/videos-filter.ts @@ -11,7 +11,7 @@ import { ServerInfo, setAccessTokensToServers, userLogin -} from '../../utils' +} from '../../../../shared/utils' import { UserRole } from '../../../../shared/models/users' const expect = chai.expect diff --git a/server/tests/api/check-params/videos-history.ts b/server/tests/api/check-params/videos-history.ts index 808c3b616..09c6f7861 100644 --- a/server/tests/api/check-params/videos-history.ts +++ b/server/tests/api/check-params/videos-history.ts @@ -11,7 +11,7 @@ import { ServerInfo, setAccessTokensToServers, uploadVideo -} from '../../utils' +} from '../../../../shared/utils' const expect = chai.expect diff --git a/server/tests/api/check-params/videos.ts b/server/tests/api/check-params/videos.ts index 699f135c7..d94eccf8e 100644 --- a/server/tests/api/check-params/videos.ts +++ b/server/tests/api/check-params/videos.ts @@ -8,9 +8,13 @@ import { VideoPrivacy } from '../../../../shared/models/videos/video-privacy.enu import { createUser, flushTests, getMyUserInformation, getVideo, getVideosList, immutableAssign, killallServers, makeDeleteRequest, makeGetRequest, makeUploadRequest, makePutBodyRequest, removeVideo, runServer, ServerInfo, setAccessTokensToServers, userLogin -} from '../../utils' -import { checkBadCountPagination, checkBadSortPagination, checkBadStartPagination } from '../../utils/requests/check-api-params' -import { getAccountsList } from '../../utils/users/accounts' +} from '../../../../shared/utils' +import { + checkBadCountPagination, + checkBadSortPagination, + checkBadStartPagination +} from '../../../../shared/utils/requests/check-api-params' +import { getAccountsList } from '../../../../shared/utils/users/accounts' const expect = chai.expect diff --git a/server/tests/api/redundancy/redundancy.ts b/server/tests/api/redundancy/redundancy.ts index 1960854b6..0af52023c 100644 --- a/server/tests/api/redundancy/redundancy.ts +++ b/server/tests/api/redundancy/redundancy.ts @@ -18,15 +18,15 @@ import { wait, waitUntilLog, checkVideoFilesWereRemoved, removeVideo -} from '../../utils' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils' +import { waitJobs } from '../../../../shared/utils/server/jobs' import * as magnetUtil from 'magnet-uri' -import { updateRedundancy } from '../../utils/server/redundancy' +import { updateRedundancy } from '../../../../shared/utils/server/redundancy' import { ActorFollow } from '../../../../shared/models/actors' import { readdir } from 'fs-extra' import { join } from 'path' import { VideoRedundancyStrategy } from '../../../../shared/models/redundancy' -import { getStats } from '../../utils/server/stats' +import { getStats } from '../../../../shared/utils/server/stats' import { ServerStats } from '../../../../shared/models/server/server-stats.model' const expect = chai.expect diff --git a/server/tests/api/search/search-activitypub-video-channels.ts b/server/tests/api/search/search-activitypub-video-channels.ts index a287c5bdf..a411e973b 100644 --- a/server/tests/api/search/search-activitypub-video-channels.ts +++ b/server/tests/api/search/search-activitypub-video-channels.ts @@ -17,10 +17,10 @@ import { uploadVideo, userLogin, wait -} from '../../utils' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils' +import { waitJobs } from '../../../../shared/utils/server/jobs' import { VideoChannel } from '../../../../shared/models/videos' -import { searchVideoChannel } from '../../utils/search/video-channels' +import { searchVideoChannel } from '../../../../shared/utils/search/video-channels' const expect = chai.expect diff --git a/server/tests/api/search/search-activitypub-videos.ts b/server/tests/api/search/search-activitypub-videos.ts index 28f4fac50..f881917e7 100644 --- a/server/tests/api/search/search-activitypub-videos.ts +++ b/server/tests/api/search/search-activitypub-videos.ts @@ -16,8 +16,8 @@ import { uploadVideo, wait, searchVideo -} from '../../utils' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils' +import { waitJobs } from '../../../../shared/utils/server/jobs' import { Video, VideoPrivacy } from '../../../../shared/models/videos' const expect = chai.expect diff --git a/server/tests/api/search/search-videos.ts b/server/tests/api/search/search-videos.ts index f1392ffea..50da837da 100644 --- a/server/tests/api/search/search-videos.ts +++ b/server/tests/api/search/search-videos.ts @@ -13,7 +13,7 @@ import { uploadVideo, wait, immutableAssign -} from '../../utils' +} from '../../../../shared/utils' const expect = chai.expect diff --git a/server/tests/api/server/config.ts b/server/tests/api/server/config.ts index facd1688d..c5c360a17 100644 --- a/server/tests/api/server/config.ts +++ b/server/tests/api/server/config.ts @@ -4,8 +4,11 @@ import 'mocha' import * as chai from 'chai' import { About } from '../../../../shared/models/server/about.model' import { CustomConfig } from '../../../../shared/models/server/custom-config.model' -import { deleteCustomConfig, getAbout, killallServers, reRunServer } from '../../utils' import { + deleteCustomConfig, + getAbout, + killallServers, + reRunServer, flushTests, getConfig, getCustomConfig, @@ -13,7 +16,7 @@ import { runServer, setAccessTokensToServers, updateCustomConfig -} from '../../utils/index' +} from '../../../../shared/utils' const expect = chai.expect diff --git a/server/tests/api/server/email.ts b/server/tests/api/server/email.ts index 713a27143..13df772c6 100644 --- a/server/tests/api/server/email.ts +++ b/server/tests/api/server/email.ts @@ -14,11 +14,14 @@ import { unblockUser, uploadVideo, userLogin, - verifyEmail -} from '../../utils' -import { flushTests, killallServers, ServerInfo, setAccessTokensToServers } from '../../utils/index' -import { mockSmtpServer } from '../../utils/miscs/email' -import { waitJobs } from '../../utils/server/jobs' + verifyEmail, + flushTests, + killallServers, + ServerInfo, + setAccessTokensToServers +} from '../../../../shared/utils' +import { mockSmtpServer } from '../../../../shared/utils/miscs/email' +import { waitJobs } from '../../../../shared/utils/server/jobs' const expect = chai.expect diff --git a/server/tests/api/server/follows.ts b/server/tests/api/server/follows.ts index e80e93e7f..b0fc5d293 100644 --- a/server/tests/api/server/follows.ts +++ b/server/tests/api/server/follows.ts @@ -4,7 +4,7 @@ import * as chai from 'chai' import 'mocha' import { Video, VideoPrivacy } from '../../../../shared/models/videos' import { VideoComment, VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model' -import { completeVideoCheck } from '../../utils' +import { completeVideoCheck } from '../../../../shared/utils' import { flushAndRunMultipleServers, getVideosList, @@ -12,21 +12,26 @@ import { ServerInfo, setAccessTokensToServers, uploadVideo -} from '../../utils/index' -import { dateIsValid } from '../../utils/miscs/miscs' -import { follow, getFollowersListPaginationAndSort, getFollowingListPaginationAndSort, unfollow } from '../../utils/server/follows' -import { expectAccountFollows } from '../../utils/users/accounts' -import { userLogin } from '../../utils/users/login' -import { createUser } from '../../utils/users/users' +} from '../../../../shared/utils/index' +import { dateIsValid } from '../../../../shared/utils/miscs/miscs' +import { + follow, + getFollowersListPaginationAndSort, + getFollowingListPaginationAndSort, + unfollow +} from '../../../../shared/utils/server/follows' +import { expectAccountFollows } from '../../../../shared/utils/users/accounts' +import { userLogin } from '../../../../shared/utils/users/login' +import { createUser } from '../../../../shared/utils/users/users' import { addVideoCommentReply, addVideoCommentThread, getVideoCommentThreads, getVideoThreadComments -} from '../../utils/videos/video-comments' -import { rateVideo } from '../../utils/videos/videos' -import { waitJobs } from '../../utils/server/jobs' -import { createVideoCaption, listVideoCaptions, testCaptionFile } from '../../utils/videos/video-captions' +} from '../../../../shared/utils/videos/video-comments' +import { rateVideo } from '../../../../shared/utils/videos/videos' +import { waitJobs } from '../../../../shared/utils/server/jobs' +import { createVideoCaption, listVideoCaptions, testCaptionFile } from '../../../../shared/utils/videos/video-captions' import { VideoCaption } from '../../../../shared/models/videos/caption/video-caption.model' const expect = chai.expect diff --git a/server/tests/api/server/handle-down.ts b/server/tests/api/server/handle-down.ts index ed15c8090..e6e0d6c7a 100644 --- a/server/tests/api/server/handle-down.ts +++ b/server/tests/api/server/handle-down.ts @@ -5,8 +5,13 @@ import 'mocha' import { JobState, Video } from '../../../../shared/models' import { VideoPrivacy } from '../../../../shared/models/videos' import { VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model' -import { completeVideoCheck, getVideo, immutableAssign, reRunServer, unfollow, viewVideo } from '../../utils' import { + completeVideoCheck, + getVideo, + immutableAssign, + reRunServer, + unfollow, + viewVideo, flushAndRunMultipleServers, getVideosList, killallServers, @@ -14,15 +19,15 @@ import { setAccessTokensToServers, uploadVideo, wait -} from '../../utils/index' -import { follow, getFollowersListPaginationAndSort } from '../../utils/server/follows' -import { getJobsListPaginationAndSort, waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils' +import { follow, getFollowersListPaginationAndSort } from '../../../../shared/utils/server/follows' +import { getJobsListPaginationAndSort, waitJobs } from '../../../../shared/utils/server/jobs' import { addVideoCommentReply, addVideoCommentThread, getVideoCommentThreads, getVideoThreadComments -} from '../../utils/videos/video-comments' +} from '../../../../shared/utils/videos/video-comments' const expect = chai.expect diff --git a/server/tests/api/server/jobs.ts b/server/tests/api/server/jobs.ts index cd59d9a1b..52948b1d6 100644 --- a/server/tests/api/server/jobs.ts +++ b/server/tests/api/server/jobs.ts @@ -2,12 +2,12 @@ import * as chai from 'chai' import 'mocha' -import { killallServers, ServerInfo, setAccessTokensToServers } from '../../utils/index' -import { doubleFollow } from '../../utils/server/follows' -import { getJobsList, getJobsListPaginationAndSort, waitJobs } from '../../utils/server/jobs' -import { flushAndRunMultipleServers } from '../../utils/server/servers' -import { uploadVideo } from '../../utils/videos/videos' -import { dateIsValid } from '../../utils/miscs/miscs' +import { killallServers, ServerInfo, setAccessTokensToServers } from '../../../../shared/utils/index' +import { doubleFollow } from '../../../../shared/utils/server/follows' +import { getJobsList, getJobsListPaginationAndSort, waitJobs } from '../../../../shared/utils/server/jobs' +import { flushAndRunMultipleServers } from '../../../../shared/utils/server/servers' +import { uploadVideo } from '../../../../shared/utils/videos/videos' +import { dateIsValid } from '../../../../shared/utils/miscs/miscs' const expect = chai.expect diff --git a/server/tests/api/server/redundancy.ts b/server/tests/api/server/redundancy.ts index f50d6e3cf..8053d0491 100644 --- a/server/tests/api/server/redundancy.ts +++ b/server/tests/api/server/redundancy.ts @@ -18,15 +18,15 @@ import { wait, waitUntilLog, checkVideoFilesWereRemoved, removeVideo -} from '../../utils' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils' +import { waitJobs } from '../../../../shared/utils/server/jobs' import * as magnetUtil from 'magnet-uri' -import { updateRedundancy } from '../../utils/server/redundancy' +import { updateRedundancy } from '../../../../shared/utils/server/redundancy' import { ActorFollow } from '../../../../shared/models/actors' import { readdir } from 'fs-extra' import { join } from 'path' import { VideoRedundancyStrategy } from '../../../../shared/models/redundancy' -import { getStats } from '../../utils/server/stats' +import { getStats } from '../../../../shared/utils/server/stats' import { ServerStats } from '../../../../shared/models/server/server-stats.model' const expect = chai.expect diff --git a/server/tests/api/server/reverse-proxy.ts b/server/tests/api/server/reverse-proxy.ts index e2c2a293e..d4c08c346 100644 --- a/server/tests/api/server/reverse-proxy.ts +++ b/server/tests/api/server/reverse-proxy.ts @@ -15,7 +15,7 @@ import { userLogin, viewVideo, wait -} from '../../utils' +} from '../../../../shared/utils' const expect = chai.expect import { @@ -23,7 +23,7 @@ import { flushTests, runServer, registerUser, getCustomConfig, setAccessTokensToServers, updateCustomConfig -} from '../../utils/index' +} from '../../../../shared/utils/index' describe('Test application behind a reverse proxy', function () { let server = null diff --git a/server/tests/api/server/stats.ts b/server/tests/api/server/stats.ts index cb229e876..517b4e542 100644 --- a/server/tests/api/server/stats.ts +++ b/server/tests/api/server/stats.ts @@ -13,11 +13,11 @@ import { uploadVideo, viewVideo, wait -} from '../../utils' -import { flushTests, setAccessTokensToServers } from '../../utils/index' -import { getStats } from '../../utils/server/stats' -import { addVideoCommentThread } from '../../utils/videos/video-comments' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils' +import { flushTests, setAccessTokensToServers } from '../../../../shared/utils/index' +import { getStats } from '../../../../shared/utils/server/stats' +import { addVideoCommentThread } from '../../../../shared/utils/videos/video-comments' +import { waitJobs } from '../../../../shared/utils/server/jobs' const expect = chai.expect diff --git a/server/tests/api/server/tracker.ts b/server/tests/api/server/tracker.ts index 856f2f4d1..25ca00029 100644 --- a/server/tests/api/server/tracker.ts +++ b/server/tests/api/server/tracker.ts @@ -2,8 +2,8 @@ import * as magnetUtil from 'magnet-uri' import 'mocha' -import { getVideo, killallServers, runServer, ServerInfo, uploadVideo } from '../../utils' -import { flushTests, setAccessTokensToServers } from '../../utils/index' +import { getVideo, killallServers, runServer, ServerInfo, uploadVideo } from '../../../../shared/utils' +import { flushTests, setAccessTokensToServers } from '../../../../shared/utils/index' import { VideoDetails } from '../../../../shared/models/videos' import * as WebTorrent from 'webtorrent' diff --git a/server/tests/api/users/blocklist.ts b/server/tests/api/users/blocklist.ts index eed4b9f3e..4bca27a94 100644 --- a/server/tests/api/users/blocklist.ts +++ b/server/tests/api/users/blocklist.ts @@ -12,16 +12,16 @@ import { ServerInfo, uploadVideo, userLogin -} from '../../utils/index' -import { setAccessTokensToServers } from '../../utils/users/login' -import { getVideosListWithToken, getVideosList } from '../../utils/videos/videos' +} from '../../../../shared/utils/index' +import { setAccessTokensToServers } from '../../../../shared/utils/users/login' +import { getVideosListWithToken, getVideosList } from '../../../../shared/utils/videos/videos' import { addVideoCommentReply, addVideoCommentThread, getVideoCommentThreads, getVideoThreadComments -} from '../../utils/videos/video-comments' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils/videos/video-comments' +import { waitJobs } from '../../../../shared/utils/server/jobs' import { VideoComment, VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model' import { addAccountToAccountBlocklist, @@ -36,7 +36,7 @@ import { removeAccountFromServerBlocklist, removeServerFromAccountBlocklist, removeServerFromServerBlocklist -} from '../../utils/users/blocklist' +} from '../../../../shared/utils/users/blocklist' const expect = chai.expect diff --git a/server/tests/api/users/user-subscriptions.ts b/server/tests/api/users/user-subscriptions.ts index 65b80540c..88a7187d6 100644 --- a/server/tests/api/users/user-subscriptions.ts +++ b/server/tests/api/users/user-subscriptions.ts @@ -2,18 +2,27 @@ import * as chai from 'chai' import 'mocha' -import { createUser, doubleFollow, flushAndRunMultipleServers, follow, getVideosList, unfollow, updateVideo, userLogin } from '../../utils' -import { killallServers, ServerInfo, uploadVideo } from '../../utils/index' -import { setAccessTokensToServers } from '../../utils/users/login' +import { + createUser, + doubleFollow, + flushAndRunMultipleServers, + follow, + getVideosList, + unfollow, + updateVideo, + userLogin +} from '../../../../shared/utils' +import { killallServers, ServerInfo, uploadVideo } from '../../../../shared/utils/index' +import { setAccessTokensToServers } from '../../../../shared/utils/users/login' import { Video, VideoChannel } from '../../../../shared/models/videos' -import { waitJobs } from '../../utils/server/jobs' +import { waitJobs } from '../../../../shared/utils/server/jobs' import { addUserSubscription, listUserSubscriptions, listUserSubscriptionVideos, removeUserSubscription, getUserSubscription, areSubscriptionsExist -} from '../../utils/users/user-subscriptions' +} from '../../../../shared/utils/users/user-subscriptions' const expect = chai.expect diff --git a/server/tests/api/users/users-multiple-servers.ts b/server/tests/api/users/users-multiple-servers.ts index d8699db17..006d6cdf0 100644 --- a/server/tests/api/users/users-multiple-servers.ts +++ b/server/tests/api/users/users-multiple-servers.ts @@ -13,13 +13,13 @@ import { removeUser, updateMyUser, userLogin -} from '../../utils' -import { getMyUserInformation, killallServers, ServerInfo, testImage, updateMyAvatar, uploadVideo } from '../../utils/index' -import { checkActorFilesWereRemoved, getAccount, getAccountsList } from '../../utils/users/accounts' -import { setAccessTokensToServers } from '../../utils/users/login' +} from '../../../../shared/utils' +import { getMyUserInformation, killallServers, ServerInfo, testImage, updateMyAvatar, uploadVideo } from '../../../../shared/utils/index' +import { checkActorFilesWereRemoved, getAccount, getAccountsList } from '../../../../shared/utils/users/accounts' +import { setAccessTokensToServers } from '../../../../shared/utils/users/login' import { User } from '../../../../shared/models/users' import { VideoChannel } from '../../../../shared/models/videos' -import { waitJobs } from '../../utils/server/jobs' +import { waitJobs } from '../../../../shared/utils/server/jobs' const expect = chai.expect diff --git a/server/tests/api/users/users-verification.ts b/server/tests/api/users/users-verification.ts index fa5f5e371..b1733e45e 100644 --- a/server/tests/api/users/users-verification.ts +++ b/server/tests/api/users/users-verification.ts @@ -5,10 +5,10 @@ import 'mocha' import { registerUser, flushTests, getUserInformation, getMyUserInformation, killallServers, userLogin, login, runServer, ServerInfo, verifyEmail, updateCustomSubConfig -} from '../../utils' -import { setAccessTokensToServers } from '../../utils/users/login' -import { mockSmtpServer } from '../../utils/miscs/email' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils' +import { setAccessTokensToServers } from '../../../../shared/utils/users/login' +import { mockSmtpServer } from '../../../../shared/utils/miscs/email' +import { waitJobs } from '../../../../shared/utils/server/jobs' const expect = chai.expect diff --git a/server/tests/api/users/users.ts b/server/tests/api/users/users.ts index 513bca8a0..7dffbb0b1 100644 --- a/server/tests/api/users/users.ts +++ b/server/tests/api/users/users.ts @@ -32,10 +32,10 @@ import { updateUser, uploadVideo, userLogin -} from '../../utils/index' -import { follow } from '../../utils/server/follows' -import { setAccessTokensToServers } from '../../utils/users/login' -import { getMyVideos } from '../../utils/videos/videos' +} from '../../../../shared/utils/index' +import { follow } from '../../../../shared/utils/server/follows' +import { setAccessTokensToServers } from '../../../../shared/utils/users/login' +import { getMyVideos } from '../../../../shared/utils/videos/videos' const expect = chai.expect diff --git a/server/tests/api/videos/multiple-servers.ts b/server/tests/api/videos/multiple-servers.ts index b9ace2885..aa38b6b33 100644 --- a/server/tests/api/videos/multiple-servers.ts +++ b/server/tests/api/videos/multiple-servers.ts @@ -31,15 +31,15 @@ import { viewVideo, wait, webtorrentAdd -} from '../../utils' +} from '../../../../shared/utils' import { addVideoCommentReply, addVideoCommentThread, deleteVideoComment, getVideoCommentThreads, getVideoThreadComments -} from '../../utils/videos/video-comments' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils/videos/video-comments' +import { waitJobs } from '../../../../shared/utils/server/jobs' const expect = chai.expect diff --git a/server/tests/api/videos/services.ts b/server/tests/api/videos/services.ts index 2f1424292..2da86964f 100644 --- a/server/tests/api/videos/services.ts +++ b/server/tests/api/videos/services.ts @@ -2,8 +2,16 @@ import * as chai from 'chai' import 'mocha' -import { flushTests, getOEmbed, getVideosList, killallServers, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../utils/index' -import { runServer } from '../../utils/server/servers' +import { + flushTests, + getOEmbed, + getVideosList, + killallServers, + ServerInfo, + setAccessTokensToServers, + uploadVideo +} from '../../../../shared/utils/index' +import { runServer } from '../../../../shared/utils/server/servers' const expect = chai.expect diff --git a/server/tests/api/videos/single-server.ts b/server/tests/api/videos/single-server.ts index 089c3df25..069dec67c 100644 --- a/server/tests/api/videos/single-server.ts +++ b/server/tests/api/videos/single-server.ts @@ -28,7 +28,7 @@ import { uploadVideo, viewVideo, wait -} from '../../utils' +} from '../../../../shared/utils' const expect = chai.expect diff --git a/server/tests/api/videos/video-abuse.ts b/server/tests/api/videos/video-abuse.ts index a17f3c8de..3a7b623da 100644 --- a/server/tests/api/videos/video-abuse.ts +++ b/server/tests/api/videos/video-abuse.ts @@ -14,9 +14,9 @@ import { setAccessTokensToServers, updateVideoAbuse, uploadVideo -} from '../../utils/index' -import { doubleFollow } from '../../utils/server/follows' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils/index' +import { doubleFollow } from '../../../../shared/utils/server/follows' +import { waitJobs } from '../../../../shared/utils/server/jobs' const expect = chai.expect diff --git a/server/tests/api/videos/video-blacklist-management.ts b/server/tests/api/videos/video-blacklist-management.ts index 7bf39dc99..06d80a270 100644 --- a/server/tests/api/videos/video-blacklist-management.ts +++ b/server/tests/api/videos/video-blacklist-management.ts @@ -16,9 +16,9 @@ import { setAccessTokensToServers, updateVideoBlacklist, uploadVideo -} from '../../utils/index' -import { doubleFollow } from '../../utils/server/follows' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils/index' +import { doubleFollow } from '../../../../shared/utils/server/follows' +import { waitJobs } from '../../../../shared/utils/server/jobs' import { VideoAbuse } from '../../../../shared/models/videos' const expect = chai.expect diff --git a/server/tests/api/videos/video-blacklist.ts b/server/tests/api/videos/video-blacklist.ts index de4c68f1d..1cce82d2a 100644 --- a/server/tests/api/videos/video-blacklist.ts +++ b/server/tests/api/videos/video-blacklist.ts @@ -11,9 +11,9 @@ import { ServerInfo, setAccessTokensToServers, uploadVideo -} from '../../utils/index' -import { doubleFollow } from '../../utils/server/follows' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils/index' +import { doubleFollow } from '../../../../shared/utils/server/follows' +import { waitJobs } from '../../../../shared/utils/server/jobs' const expect = chai.expect diff --git a/server/tests/api/videos/video-captions.ts b/server/tests/api/videos/video-captions.ts index 6e441410d..57bee713f 100644 --- a/server/tests/api/videos/video-captions.ts +++ b/server/tests/api/videos/video-captions.ts @@ -2,10 +2,17 @@ import * as chai from 'chai' import 'mocha' -import { checkVideoFilesWereRemoved, doubleFollow, flushAndRunMultipleServers, removeVideo, uploadVideo, wait } from '../../utils' -import { flushTests, killallServers, ServerInfo, setAccessTokensToServers } from '../../utils/index' -import { waitJobs } from '../../utils/server/jobs' -import { createVideoCaption, deleteVideoCaption, listVideoCaptions, testCaptionFile } from '../../utils/videos/video-captions' +import { + checkVideoFilesWereRemoved, + doubleFollow, + flushAndRunMultipleServers, + removeVideo, + uploadVideo, + wait +} from '../../../../shared/utils' +import { flushTests, killallServers, ServerInfo, setAccessTokensToServers } from '../../../../shared/utils/index' +import { waitJobs } from '../../../../shared/utils/server/jobs' +import { createVideoCaption, deleteVideoCaption, listVideoCaptions, testCaptionFile } from '../../../../shared/utils/videos/video-captions' import { VideoCaption } from '../../../../shared/models/videos/caption/video-caption.model' const expect = chai.expect diff --git a/server/tests/api/videos/video-change-ownership.ts b/server/tests/api/videos/video-change-ownership.ts index 1578a471d..25675a966 100644 --- a/server/tests/api/videos/video-change-ownership.ts +++ b/server/tests/api/videos/video-change-ownership.ts @@ -18,8 +18,8 @@ import { uploadVideo, userLogin, getVideo -} from '../../utils' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils' +import { waitJobs } from '../../../../shared/utils/server/jobs' import { User } from '../../../../shared/models/users' import { VideoDetails } from '../../../../shared/models/videos' diff --git a/server/tests/api/videos/video-channels.ts b/server/tests/api/videos/video-channels.ts index 8138c65d6..5bffffc66 100644 --- a/server/tests/api/videos/video-channels.ts +++ b/server/tests/api/videos/video-channels.ts @@ -11,7 +11,7 @@ import { updateVideo, updateVideoChannelAvatar, uploadVideo, wait, userLogin -} from '../../utils' +} from '../../../../shared/utils' import { addVideoChannel, deleteVideoChannel, @@ -24,8 +24,8 @@ import { ServerInfo, setAccessTokensToServers, updateVideoChannel -} from '../../utils/index' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils/index' +import { waitJobs } from '../../../../shared/utils/server/jobs' const expect = chai.expect diff --git a/server/tests/api/videos/video-comments.ts b/server/tests/api/videos/video-comments.ts index d6e07c5b3..ce1b17e35 100644 --- a/server/tests/api/videos/video-comments.ts +++ b/server/tests/api/videos/video-comments.ts @@ -3,7 +3,7 @@ import * as chai from 'chai' import 'mocha' import { VideoComment, VideoCommentThreadTree } from '../../../../shared/models/videos/video-comment.model' -import { testImage } from '../../utils' +import { testImage } from '../../../../shared/utils' import { dateIsValid, flushTests, @@ -13,14 +13,14 @@ import { setAccessTokensToServers, updateMyAvatar, uploadVideo -} from '../../utils/index' +} from '../../../../shared/utils/index' import { addVideoCommentReply, addVideoCommentThread, deleteVideoComment, getVideoCommentThreads, getVideoThreadComments -} from '../../utils/videos/video-comments' +} from '../../../../shared/utils/videos/video-comments' const expect = chai.expect diff --git a/server/tests/api/videos/video-description.ts b/server/tests/api/videos/video-description.ts index dd5cd78c0..cbda0b9a6 100644 --- a/server/tests/api/videos/video-description.ts +++ b/server/tests/api/videos/video-description.ts @@ -12,9 +12,9 @@ import { setAccessTokensToServers, updateVideo, uploadVideo -} from '../../utils/index' -import { doubleFollow } from '../../utils/server/follows' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils/index' +import { doubleFollow } from '../../../../shared/utils/server/follows' +import { waitJobs } from '../../../../shared/utils/server/jobs' const expect = chai.expect diff --git a/server/tests/api/videos/video-imports.ts b/server/tests/api/videos/video-imports.ts index aaee79a4a..cd4988553 100644 --- a/server/tests/api/videos/video-imports.ts +++ b/server/tests/api/videos/video-imports.ts @@ -14,9 +14,9 @@ import { killallServers, ServerInfo, setAccessTokensToServers -} from '../../utils' -import { waitJobs } from '../../utils/server/jobs' -import { getMagnetURI, getYoutubeVideoUrl, importVideo, getMyVideoImports } from '../../utils/videos/video-imports' +} from '../../../../shared/utils' +import { waitJobs } from '../../../../shared/utils/server/jobs' +import { getMagnetURI, getYoutubeVideoUrl, importVideo, getMyVideoImports } from '../../../../shared/utils/videos/video-imports' const expect = chai.expect diff --git a/server/tests/api/videos/video-nsfw.ts b/server/tests/api/videos/video-nsfw.ts index eab7a6991..df1ee2eb9 100644 --- a/server/tests/api/videos/video-nsfw.ts +++ b/server/tests/api/videos/video-nsfw.ts @@ -2,10 +2,17 @@ import * as chai from 'chai' import 'mocha' -import { flushTests, getVideosList, killallServers, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../utils/index' -import { userLogin } from '../../utils/users/login' -import { createUser } from '../../utils/users/users' -import { getMyVideos } from '../../utils/videos/videos' +import { + flushTests, + getVideosList, + killallServers, + ServerInfo, + setAccessTokensToServers, + uploadVideo +} from '../../../../shared/utils/index' +import { userLogin } from '../../../../shared/utils/users/login' +import { createUser } from '../../../../shared/utils/users/users' +import { getMyVideos } from '../../../../shared/utils/videos/videos' import { getAccountVideos, getConfig, @@ -18,7 +25,7 @@ import { searchVideoWithToken, updateCustomConfig, updateMyUser -} from '../../utils' +} from '../../../../shared/utils' import { ServerConfig } from '../../../../shared/models' import { CustomConfig } from '../../../../shared/models/server/custom-config.model' import { User } from '../../../../shared/models/users' diff --git a/server/tests/api/videos/video-privacy.ts b/server/tests/api/videos/video-privacy.ts index 9fefca7e3..0b4e66369 100644 --- a/server/tests/api/videos/video-privacy.ts +++ b/server/tests/api/videos/video-privacy.ts @@ -10,12 +10,12 @@ import { ServerInfo, setAccessTokensToServers, uploadVideo -} from '../../utils/index' -import { doubleFollow } from '../../utils/server/follows' -import { userLogin } from '../../utils/users/login' -import { createUser } from '../../utils/users/users' -import { getMyVideos, getVideo, getVideoWithToken, updateVideo } from '../../utils/videos/videos' -import { waitJobs } from '../../utils/server/jobs' +} from '../../../../shared/utils/index' +import { doubleFollow } from '../../../../shared/utils/server/follows' +import { userLogin } from '../../../../shared/utils/users/login' +import { createUser } from '../../../../shared/utils/users/users' +import { getMyVideos, getVideo, getVideoWithToken, updateVideo } from '../../../../shared/utils/videos/videos' +import { waitJobs } from '../../../../shared/utils/server/jobs' const expect = chai.expect diff --git a/server/tests/api/videos/video-schedule-update.ts b/server/tests/api/videos/video-schedule-update.ts index a260fa4da..ecfc5e034 100644 --- a/server/tests/api/videos/video-schedule-update.ts +++ b/server/tests/api/videos/video-schedule-update.ts @@ -15,9 +15,9 @@ import { updateVideo, uploadVideo, wait -} from '../../utils' +} from '../../../../shared/utils' import { join } from 'path' -import { waitJobs } from '../../utils/server/jobs' +import { waitJobs } from '../../../../shared/utils/server/jobs' const expect = chai.expect diff --git a/server/tests/api/videos/video-transcoder.ts b/server/tests/api/videos/video-transcoder.ts index 85795d2ed..f9458f0ec 100644 --- a/server/tests/api/videos/video-transcoder.ts +++ b/server/tests/api/videos/video-transcoder.ts @@ -20,9 +20,9 @@ import { uploadVideo, webtorrentAdd, generateHighBitrateVideo -} from '../../utils' +} from '../../../../shared/utils' import { join } from 'path' -import { waitJobs } from '../../utils/server/jobs' +import { waitJobs } from '../../../../shared/utils/server/jobs' import { pathExists } from 'fs-extra' import { VIDEO_TRANSCODING_FPS } from '../../../../server/initializers/constants' diff --git a/server/tests/api/videos/videos-filter.ts b/server/tests/api/videos/videos-filter.ts index a7588129f..59e37ad86 100644 --- a/server/tests/api/videos/videos-filter.ts +++ b/server/tests/api/videos/videos-filter.ts @@ -13,7 +13,7 @@ import { setAccessTokensToServers, uploadVideo, userLogin -} from '../../utils' +} from '../../../../shared/utils' import { Video, VideoPrivacy } from '../../../../shared/models/videos' import { UserRole } from '../../../../shared/models/users' diff --git a/server/tests/api/videos/videos-history.ts b/server/tests/api/videos/videos-history.ts index 6d289b288..40ae94f79 100644 --- a/server/tests/api/videos/videos-history.ts +++ b/server/tests/api/videos/videos-history.ts @@ -11,9 +11,9 @@ import { ServerInfo, setAccessTokensToServers, uploadVideo -} from '../../utils' +} from '../../../../shared/utils' import { Video, VideoDetails } from '../../../../shared/models/videos' -import { userWatchVideo } from '../../utils/videos/video-history' +import { userWatchVideo } from '../../../../shared/utils/videos/video-history' const expect = chai.expect diff --git a/server/tests/api/videos/videos-overview.ts b/server/tests/api/videos/videos-overview.ts index 7d1f29c92..7221bcae6 100644 --- a/server/tests/api/videos/videos-overview.ts +++ b/server/tests/api/videos/videos-overview.ts @@ -2,8 +2,8 @@ import * as chai from 'chai' import 'mocha' -import { flushTests, killallServers, runServer, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../utils' -import { getVideosOverview } from '../../utils/overviews/overviews' +import { flushTests, killallServers, runServer, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../../../shared/utils' +import { getVideosOverview } from '../../../../shared/utils/overviews/overviews' import { VideosOverview } from '../../../../shared/models/overviews' const expect = chai.expect diff --git a/server/tests/cli/create-import-video-file-job.ts b/server/tests/cli/create-import-video-file-job.ts index 13bcfd209..4acda47b1 100644 --- a/server/tests/cli/create-import-video-file-job.ts +++ b/server/tests/cli/create-import-video-file-job.ts @@ -15,8 +15,8 @@ import { ServerInfo, setAccessTokensToServers, uploadVideo -} from '../utils' -import { waitJobs } from '../utils/server/jobs' +} from '../../../shared/utils' +import { waitJobs } from '../../../shared/utils/server/jobs' const expect = chai.expect diff --git a/server/tests/cli/create-transcoding-job.ts b/server/tests/cli/create-transcoding-job.ts index c2e3840c5..50be5fa19 100644 --- a/server/tests/cli/create-transcoding-job.ts +++ b/server/tests/cli/create-transcoding-job.ts @@ -15,8 +15,8 @@ import { ServerInfo, setAccessTokensToServers, uploadVideo, wait -} from '../utils' -import { waitJobs } from '../utils/server/jobs' +} from '../../../shared/utils' +import { waitJobs } from '../../../shared/utils/server/jobs' const expect = chai.expect diff --git a/server/tests/cli/optimize-old-videos.ts b/server/tests/cli/optimize-old-videos.ts index 66dd39cce..6f6bc25a6 100644 --- a/server/tests/cli/optimize-old-videos.ts +++ b/server/tests/cli/optimize-old-videos.ts @@ -15,8 +15,8 @@ import { ServerInfo, setAccessTokensToServers, uploadVideo, viewVideo, wait -} from '../utils' -import { waitJobs } from '../utils/server/jobs' +} from '../../../shared/utils' +import { waitJobs } from '../../../shared/utils/server/jobs' import { getVideoFileBitrate, getVideoFileFPS, getVideoFileResolution } from '../../helpers/ffmpeg-utils' import { VIDEO_TRANSCODING_FPS } from '../../initializers' import { join } from 'path' diff --git a/server/tests/cli/peertube.ts b/server/tests/cli/peertube.ts index 65cb05a1a..e5038838e 100644 --- a/server/tests/cli/peertube.ts +++ b/server/tests/cli/peertube.ts @@ -11,7 +11,7 @@ import { runServer, ServerInfo, setAccessTokensToServers -} from '../utils' +} from '../../../shared/utils' describe('Test CLI wrapper', function () { let server: ServerInfo diff --git a/server/tests/cli/reset-password.ts b/server/tests/cli/reset-password.ts index bf937d1c0..1b65f7e39 100644 --- a/server/tests/cli/reset-password.ts +++ b/server/tests/cli/reset-password.ts @@ -10,7 +10,7 @@ import { runServer, ServerInfo, setAccessTokensToServers -} from '../utils' +} from '../../../shared/utils' describe('Test reset password scripts', function () { let server: ServerInfo diff --git a/server/tests/cli/update-host.ts b/server/tests/cli/update-host.ts index b89e72ab7..811ea6a9f 100644 --- a/server/tests/cli/update-host.ts +++ b/server/tests/cli/update-host.ts @@ -3,8 +3,8 @@ import 'mocha' import * as chai from 'chai' import { VideoDetails } from '../../../shared/models/videos' -import { waitJobs } from '../utils/server/jobs' -import { addVideoCommentThread } from '../utils/videos/video-comments' +import { waitJobs } from '../../../shared/utils/server/jobs' +import { addVideoCommentThread } from '../../../shared/utils/videos/video-comments' import { addVideoChannel, createUser, @@ -21,8 +21,8 @@ import { ServerInfo, setAccessTokensToServers, uploadVideo -} from '../utils' -import { getAccountsList } from '../utils/users/accounts' +} from '../../../shared/utils' +import { getAccountsList } from '../../../shared/utils/users/accounts' const expect = chai.expect diff --git a/server/tests/client.ts b/server/tests/client.ts index b33a653b1..06b4a9c5a 100644 --- a/server/tests/client.ts +++ b/server/tests/client.ts @@ -15,7 +15,7 @@ import { updateCustomConfig, updateCustomSubConfig, uploadVideo -} from './utils' +} from '../../shared/utils' const expect = chai.expect diff --git a/server/tests/feeds/feeds.ts b/server/tests/feeds/feeds.ts index 28fe3493b..a771474bc 100644 --- a/server/tests/feeds/feeds.ts +++ b/server/tests/feeds/feeds.ts @@ -13,10 +13,10 @@ import { ServerInfo, setAccessTokensToServers, uploadVideo, userLogin -} from '../utils' +} from '../../../shared/utils' import * as libxmljs from 'libxmljs' -import { addVideoCommentThread } from '../utils/videos/video-comments' -import { waitJobs } from '../utils/server/jobs' +import { addVideoCommentThread } from '../../../shared/utils/videos/video-comments' +import { waitJobs } from '../../../shared/utils/server/jobs' import { User } from '../../../shared/models/users' chai.use(require('chai-xml')) diff --git a/server/tests/misc-endpoints.ts b/server/tests/misc-endpoints.ts index 8fab20971..f948fdfd0 100644 --- a/server/tests/misc-endpoints.ts +++ b/server/tests/misc-endpoints.ts @@ -2,7 +2,7 @@ import 'mocha' import * as chai from 'chai' -import { flushTests, killallServers, makeGetRequest, runServer, ServerInfo } from './utils' +import { flushTests, killallServers, makeGetRequest, runServer, ServerInfo } from '../../shared/utils' const expect = chai.expect diff --git a/server/tests/real-world/populate-database.ts b/server/tests/real-world/populate-database.ts index a7fdbd1dc..016503498 100644 --- a/server/tests/real-world/populate-database.ts +++ b/server/tests/real-world/populate-database.ts @@ -10,7 +10,7 @@ import { ServerInfo, setAccessTokensToServers, uploadVideo -} from '../utils' +} from '../../../shared/utils' import * as Bluebird from 'bluebird' start() diff --git a/server/tests/real-world/real-world.ts b/server/tests/real-world/real-world.ts index a96469b11..ac3baaf9a 100644 --- a/server/tests/real-world/real-world.ts +++ b/server/tests/real-world/real-world.ts @@ -16,8 +16,8 @@ import { updateVideo, uploadVideo, viewVideo, wait -} from '../utils' -import { getJobsListPaginationAndSort } from '../utils/server/jobs' +} from '../../../shared/utils' +import { getJobsListPaginationAndSort } from '../../../shared/utils/server/jobs' interface ServerInfo extends DefaultServerInfo { requestsNumber: number diff --git a/server/tests/utils/cli/cli.ts b/server/tests/utils/cli/cli.ts deleted file mode 100644 index 54d05e9c6..000000000 --- a/server/tests/utils/cli/cli.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { exec } from 'child_process' - -import { ServerInfo } from '../server/servers' - -function getEnvCli (server?: ServerInfo) { - return `NODE_ENV=test NODE_APP_INSTANCE=${server.serverNumber}` -} - -async function execCLI (command: string) { - return new Promise((res, rej) => { - exec(command, (err, stdout, stderr) => { - if (err) return rej(err) - - return res(stdout) - }) - }) -} - -// --------------------------------------------------------------------------- - -export { - execCLI, - getEnvCli -} diff --git a/server/tests/utils/feeds/feeds.ts b/server/tests/utils/feeds/feeds.ts deleted file mode 100644 index af6df2b20..000000000 --- a/server/tests/utils/feeds/feeds.ts +++ /dev/null @@ -1,32 +0,0 @@ -import * as request from 'supertest' - -type FeedType = 'videos' | 'video-comments' - -function getXMLfeed (url: string, feed: FeedType, format?: string) { - const path = '/feeds/' + feed + '.xml' - - return request(url) - .get(path) - .query((format) ? { format: format } : {}) - .set('Accept', 'application/xml') - .expect(200) - .expect('Content-Type', /xml/) -} - -function getJSONfeed (url: string, feed: FeedType, query: any = {}) { - const path = '/feeds/' + feed + '.json' - - return request(url) - .get(path) - .query(query) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -// --------------------------------------------------------------------------- - -export { - getXMLfeed, - getJSONfeed -} diff --git a/server/tests/utils/index.ts b/server/tests/utils/index.ts deleted file mode 100644 index 897389824..000000000 --- a/server/tests/utils/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -export * from './server/activitypub' -export * from './cli/cli' -export * from './server/clients' -export * from './server/config' -export * from './users/login' -export * from './miscs/miscs' -export * from './server/follows' -export * from './requests/requests' -export * from './server/servers' -export * from './videos/services' -export * from './users/users' -export * from './videos/video-abuses' -export * from './videos/video-blacklist' -export * from './videos/video-channels' -export * from './videos/videos' -export * from './videos/video-change-ownership' -export * from './feeds/feeds' -export * from './search/videos' diff --git a/server/tests/utils/miscs/email.ts b/server/tests/utils/miscs/email.ts deleted file mode 100644 index 21accd09d..000000000 --- a/server/tests/utils/miscs/email.ts +++ /dev/null @@ -1,25 +0,0 @@ -import * as MailDev from 'maildev' - -function mockSmtpServer (emailsCollection: object[]) { - const maildev = new MailDev({ - ip: '127.0.0.1', - smtp: 1025, - disableWeb: true, - silent: true - }) - maildev.on('new', email => emailsCollection.push(email)) - - return new Promise((res, rej) => { - maildev.listen(err => { - if (err) return rej(err) - - return res() - }) - }) -} - -// --------------------------------------------------------------------------- - -export { - mockSmtpServer -} diff --git a/server/tests/utils/miscs/miscs.ts b/server/tests/utils/miscs/miscs.ts deleted file mode 100644 index 589daa420..000000000 --- a/server/tests/utils/miscs/miscs.ts +++ /dev/null @@ -1,101 +0,0 @@ -/* tslint:disable:no-unused-expression */ - -import * as chai from 'chai' -import { isAbsolute, join } from 'path' -import * as request from 'supertest' -import * as WebTorrent from 'webtorrent' -import { pathExists, readFile } from 'fs-extra' -import * as ffmpeg from 'fluent-ffmpeg' - -const expect = chai.expect -let webtorrent = new WebTorrent() - -function immutableAssign (target: T, source: U) { - return Object.assign<{}, T, U>({}, target, source) -} - - // Default interval -> 5 minutes -function dateIsValid (dateString: string, interval = 300000) { - const dateToCheck = new Date(dateString) - const now = new Date() - - return Math.abs(now.getTime() - dateToCheck.getTime()) <= interval -} - -function wait (milliseconds: number) { - return new Promise(resolve => setTimeout(resolve, milliseconds)) -} - -function webtorrentAdd (torrent: string, refreshWebTorrent = false) { - if (refreshWebTorrent === true) webtorrent = new WebTorrent() - - return new Promise(res => webtorrent.add(torrent, res)) -} - -function root () { - // We are in server/tests/utils/miscs - return join(__dirname, '..', '..', '..', '..') -} - -async function testImage (url: string, imageName: string, imagePath: string, extension = '.jpg') { - const res = await request(url) - .get(imagePath) - .expect(200) - - const body = res.body - - const data = await readFile(join(__dirname, '..', '..', 'fixtures', imageName + extension)) - const minLength = body.length - ((20 * body.length) / 100) - const maxLength = body.length + ((20 * body.length) / 100) - - expect(data.length).to.be.above(minLength) - expect(data.length).to.be.below(maxLength) -} - -function buildAbsoluteFixturePath (path: string, customTravisPath = false) { - if (isAbsolute(path)) { - return path - } - - if (customTravisPath && process.env.TRAVIS) return join(process.env.HOME, 'fixtures', path) - - return join(__dirname, '..', '..', 'fixtures', path) -} - -async function generateHighBitrateVideo () { - const tempFixturePath = buildAbsoluteFixturePath('video_high_bitrate_1080p.mp4', true) - - const exists = await pathExists(tempFixturePath) - if (!exists) { - - // Generate a random, high bitrate video on the fly, so we don't have to include - // a large file in the repo. The video needs to have a certain minimum length so - // that FFmpeg properly applies bitrate limits. - // https://stackoverflow.com/a/15795112 - return new Promise(async (res, rej) => { - ffmpeg() - .outputOptions([ '-f rawvideo', '-video_size 1920x1080', '-i /dev/urandom' ]) - .outputOptions([ '-ac 2', '-f s16le', '-i /dev/urandom', '-t 10' ]) - .outputOptions([ '-maxrate 10M', '-bufsize 10M' ]) - .output(tempFixturePath) - .on('error', rej) - .on('end', () => res(tempFixturePath)) - .run() - }) - } - - return tempFixturePath -} - -// --------------------------------------------------------------------------- - -export { - dateIsValid, - wait, - webtorrentAdd, - immutableAssign, - testImage, - buildAbsoluteFixturePath, - root, - generateHighBitrateVideo -} diff --git a/server/tests/utils/overviews/overviews.ts b/server/tests/utils/overviews/overviews.ts deleted file mode 100644 index 23e3ceb1e..000000000 --- a/server/tests/utils/overviews/overviews.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { makeGetRequest } from '../requests/requests' - -function getVideosOverview (url: string, useCache = false) { - const path = '/api/v1/overviews/videos' - - const query = { - t: useCache ? undefined : new Date().getTime() - } - - return makeGetRequest({ - url, - path, - query, - statusCodeExpected: 200 - }) -} - -export { getVideosOverview } diff --git a/server/tests/utils/requests/check-api-params.ts b/server/tests/utils/requests/check-api-params.ts deleted file mode 100644 index edb47e0e9..000000000 --- a/server/tests/utils/requests/check-api-params.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { makeGetRequest } from './requests' -import { immutableAssign } from '..' - -function checkBadStartPagination (url: string, path: string, token?: string, query = {}) { - return makeGetRequest({ - url, - path, - token, - query: immutableAssign(query, { start: 'hello' }), - statusCodeExpected: 400 - }) -} - -function checkBadCountPagination (url: string, path: string, token?: string, query = {}) { - return makeGetRequest({ - url, - path, - token, - query: immutableAssign(query, { count: 'hello' }), - statusCodeExpected: 400 - }) -} - -function checkBadSortPagination (url: string, path: string, token?: string, query = {}) { - return makeGetRequest({ - url, - path, - token, - query: immutableAssign(query, { sort: 'hello' }), - statusCodeExpected: 400 - }) -} - -// --------------------------------------------------------------------------- - -export { - checkBadStartPagination, - checkBadCountPagination, - checkBadSortPagination -} diff --git a/server/tests/utils/requests/requests.ts b/server/tests/utils/requests/requests.ts deleted file mode 100644 index 5796540f7..000000000 --- a/server/tests/utils/requests/requests.ts +++ /dev/null @@ -1,168 +0,0 @@ -import * as request from 'supertest' -import { buildAbsoluteFixturePath } from '../miscs/miscs' -import { isAbsolute, join } from 'path' - -function makeGetRequest (options: { - url: string, - path: string, - query?: any, - token?: string, - statusCodeExpected?: number, - contentType?: string -}) { - if (!options.statusCodeExpected) options.statusCodeExpected = 400 - if (options.contentType === undefined) options.contentType = 'application/json' - - const req = request(options.url) - .get(options.path) - - if (options.contentType) req.set('Accept', options.contentType) - if (options.token) req.set('Authorization', 'Bearer ' + options.token) - if (options.query) req.query(options.query) - - return req.expect(options.statusCodeExpected) -} - -function makeDeleteRequest (options: { - url: string, - path: string, - token?: string, - statusCodeExpected?: number -}) { - if (!options.statusCodeExpected) options.statusCodeExpected = 400 - - const req = request(options.url) - .delete(options.path) - .set('Accept', 'application/json') - - if (options.token) req.set('Authorization', 'Bearer ' + options.token) - - return req.expect(options.statusCodeExpected) -} - -function makeUploadRequest (options: { - url: string, - method?: 'POST' | 'PUT', - path: string, - token?: string, - fields: { [ fieldName: string ]: any }, - attaches: { [ attachName: string ]: any | any[] }, - statusCodeExpected?: number -}) { - if (!options.statusCodeExpected) options.statusCodeExpected = 400 - - let req: request.Test - if (options.method === 'PUT') { - req = request(options.url).put(options.path) - } else { - req = request(options.url).post(options.path) - } - - req.set('Accept', 'application/json') - - if (options.token) req.set('Authorization', 'Bearer ' + options.token) - - Object.keys(options.fields).forEach(field => { - const value = options.fields[field] - - if (Array.isArray(value)) { - for (let i = 0; i < value.length; i++) { - req.field(field + '[' + i + ']', value[i]) - } - } else { - req.field(field, value) - } - }) - - Object.keys(options.attaches).forEach(attach => { - const value = options.attaches[attach] - if (Array.isArray(value)) { - req.attach(attach, buildAbsoluteFixturePath(value[0]), value[1]) - } else { - req.attach(attach, buildAbsoluteFixturePath(value)) - } - }) - - return req.expect(options.statusCodeExpected) -} - -function makePostBodyRequest (options: { - url: string, - path: string, - token?: string, - fields?: { [ fieldName: string ]: any }, - statusCodeExpected?: number -}) { - if (!options.fields) options.fields = {} - if (!options.statusCodeExpected) options.statusCodeExpected = 400 - - const req = request(options.url) - .post(options.path) - .set('Accept', 'application/json') - - if (options.token) req.set('Authorization', 'Bearer ' + options.token) - - return req.send(options.fields) - .expect(options.statusCodeExpected) -} - -function makePutBodyRequest (options: { - url: string, - path: string, - token?: string, - fields: { [ fieldName: string ]: any }, - statusCodeExpected?: number -}) { - if (!options.statusCodeExpected) options.statusCodeExpected = 400 - - const req = request(options.url) - .put(options.path) - .set('Accept', 'application/json') - - if (options.token) req.set('Authorization', 'Bearer ' + options.token) - - return req.send(options.fields) - .expect(options.statusCodeExpected) -} - -function makeHTMLRequest (url: string, path: string) { - return request(url) - .get(path) - .set('Accept', 'text/html') - .expect(200) -} - -function updateAvatarRequest (options: { - url: string, - path: string, - accessToken: string, - fixture: string -}) { - let filePath = '' - if (isAbsolute(options.fixture)) { - filePath = options.fixture - } else { - filePath = join(__dirname, '..', '..', 'fixtures', options.fixture) - } - - return makeUploadRequest({ - url: options.url, - path: options.path, - token: options.accessToken, - fields: {}, - attaches: { avatarfile: filePath }, - statusCodeExpected: 200 - }) -} - -// --------------------------------------------------------------------------- - -export { - makeHTMLRequest, - makeGetRequest, - makeUploadRequest, - makePostBodyRequest, - makePutBodyRequest, - makeDeleteRequest, - updateAvatarRequest -} diff --git a/server/tests/utils/search/video-channels.ts b/server/tests/utils/search/video-channels.ts deleted file mode 100644 index 0532134ae..000000000 --- a/server/tests/utils/search/video-channels.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { makeGetRequest } from '../requests/requests' - -function searchVideoChannel (url: string, search: string, token?: string, statusCodeExpected = 200) { - const path = '/api/v1/search/video-channels' - - return makeGetRequest({ - url, - path, - query: { - sort: '-createdAt', - search - }, - token, - statusCodeExpected - }) -} - -// --------------------------------------------------------------------------- - -export { - searchVideoChannel -} diff --git a/server/tests/utils/search/videos.ts b/server/tests/utils/search/videos.ts deleted file mode 100644 index 3a0c10e42..000000000 --- a/server/tests/utils/search/videos.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* tslint:disable:no-unused-expression */ - -import * as request from 'supertest' -import { VideosSearchQuery } from '../../../../shared/models/search' -import { immutableAssign } from '..' - -function searchVideo (url: string, search: string) { - const path = '/api/v1/search/videos' - const req = request(url) - .get(path) - .query({ sort: '-publishedAt', search }) - .set('Accept', 'application/json') - - return req.expect(200) - .expect('Content-Type', /json/) -} - -function searchVideoWithToken (url: string, search: string, token: string, query: { nsfw?: boolean } = {}) { - const path = '/api/v1/search/videos' - const req = request(url) - .get(path) - .set('Authorization', 'Bearer ' + token) - .query(immutableAssign(query, { sort: '-publishedAt', search })) - .set('Accept', 'application/json') - - return req.expect(200) - .expect('Content-Type', /json/) -} - -function searchVideoWithPagination (url: string, search: string, start: number, count: number, sort?: string) { - const path = '/api/v1/search/videos' - - const req = request(url) - .get(path) - .query({ start }) - .query({ search }) - .query({ count }) - - if (sort) req.query({ sort }) - - return req.set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -function searchVideoWithSort (url: string, search: string, sort: string) { - const path = '/api/v1/search/videos' - - return request(url) - .get(path) - .query({ search }) - .query({ sort }) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -function advancedVideosSearch (url: string, options: VideosSearchQuery) { - const path = '/api/v1/search/videos' - - return request(url) - .get(path) - .query(options) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -// --------------------------------------------------------------------------- - -export { - searchVideo, - advancedVideosSearch, - searchVideoWithToken, - searchVideoWithPagination, - searchVideoWithSort -} diff --git a/server/tests/utils/server/activitypub.ts b/server/tests/utils/server/activitypub.ts deleted file mode 100644 index cf3c1c3b3..000000000 --- a/server/tests/utils/server/activitypub.ts +++ /dev/null @@ -1,15 +0,0 @@ -import * as request from 'supertest' - -function makeActivityPubGetRequest (url: string, path: string) { - return request(url) - .get(path) - .set('Accept', 'application/activity+json,text/html;q=0.9,\\*/\\*;q=0.8') - .expect(200) - .expect('Content-Type', /json/) -} - -// --------------------------------------------------------------------------- - -export { - makeActivityPubGetRequest -} diff --git a/server/tests/utils/server/clients.ts b/server/tests/utils/server/clients.ts deleted file mode 100644 index 273aac747..000000000 --- a/server/tests/utils/server/clients.ts +++ /dev/null @@ -1,19 +0,0 @@ -import * as request from 'supertest' -import * as urlUtil from 'url' - -function getClient (url: string) { - const path = '/api/v1/oauth-clients/local' - - return request(url) - .get(path) - .set('Host', urlUtil.parse(url).host) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -// --------------------------------------------------------------------------- - -export { - getClient -} diff --git a/server/tests/utils/server/config.ts b/server/tests/utils/server/config.ts deleted file mode 100644 index b85e02ab7..000000000 --- a/server/tests/utils/server/config.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { makeDeleteRequest, makeGetRequest, makePutBodyRequest } from '../' -import { CustomConfig } from '../../../../shared/models/server/custom-config.model' - -function getConfig (url: string) { - const path = '/api/v1/config' - - return makeGetRequest({ - url, - path, - statusCodeExpected: 200 - }) -} - -function getAbout (url: string) { - const path = '/api/v1/config/about' - - return makeGetRequest({ - url, - path, - statusCodeExpected: 200 - }) -} - -function getCustomConfig (url: string, token: string, statusCodeExpected = 200) { - const path = '/api/v1/config/custom' - - return makeGetRequest({ - url, - token, - path, - statusCodeExpected - }) -} - -function updateCustomConfig (url: string, token: string, newCustomConfig: CustomConfig, statusCodeExpected = 200) { - const path = '/api/v1/config/custom' - - return makePutBodyRequest({ - url, - token, - path, - fields: newCustomConfig, - statusCodeExpected - }) -} - -function updateCustomSubConfig (url: string, token: string, newConfig: any) { - const updateParams: CustomConfig = { - instance: { - name: 'PeerTube updated', - shortDescription: 'my short description', - description: 'my super description', - terms: 'my super terms', - defaultClientRoute: '/videos/recently-added', - defaultNSFWPolicy: 'blur', - customizations: { - javascript: 'alert("coucou")', - css: 'body { background-color: red; }' - } - }, - services: { - twitter: { - username: '@MySuperUsername', - whitelisted: true - } - }, - cache: { - previews: { - size: 2 - }, - captions: { - size: 3 - } - }, - signup: { - enabled: false, - limit: 5, - requiresEmailVerification: false - }, - admin: { - email: 'superadmin1@example.com' - }, - user: { - videoQuota: 5242881, - videoQuotaDaily: 318742 - }, - transcoding: { - enabled: true, - threads: 1, - resolutions: { - '240p': false, - '360p': true, - '480p': true, - '720p': false, - '1080p': false - } - }, - import: { - videos: { - http: { - enabled: false - }, - torrent: { - enabled: false - } - } - } - } - - Object.assign(updateParams, newConfig) - - return updateCustomConfig(url, token, updateParams) -} - -function deleteCustomConfig (url: string, token: string, statusCodeExpected = 200) { - const path = '/api/v1/config/custom' - - return makeDeleteRequest({ - url, - token, - path, - statusCodeExpected - }) -} - -// --------------------------------------------------------------------------- - -export { - getConfig, - getCustomConfig, - updateCustomConfig, - getAbout, - deleteCustomConfig, - updateCustomSubConfig -} diff --git a/server/tests/utils/server/follows.ts b/server/tests/utils/server/follows.ts deleted file mode 100644 index 7741757a6..000000000 --- a/server/tests/utils/server/follows.ts +++ /dev/null @@ -1,79 +0,0 @@ -import * as request from 'supertest' -import { ServerInfo } from './servers' -import { waitJobs } from './jobs' - -function getFollowersListPaginationAndSort (url: string, start: number, count: number, sort: string, search?: string) { - const path = '/api/v1/server/followers' - - return request(url) - .get(path) - .query({ start }) - .query({ count }) - .query({ sort }) - .query({ search }) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -function getFollowingListPaginationAndSort (url: string, start: number, count: number, sort: string, search?: string) { - const path = '/api/v1/server/following' - - return request(url) - .get(path) - .query({ start }) - .query({ count }) - .query({ sort }) - .query({ search }) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -async function follow (follower: string, following: string[], accessToken: string, expectedStatus = 204) { - const path = '/api/v1/server/following' - - const followingHosts = following.map(f => f.replace(/^http:\/\//, '')) - const res = await request(follower) - .post(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .send({ 'hosts': followingHosts }) - .expect(expectedStatus) - - return res -} - -async function unfollow (url: string, accessToken: string, target: ServerInfo, expectedStatus = 204) { - const path = '/api/v1/server/following/' + target.host - - const res = await request(url) - .delete(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(expectedStatus) - - return res -} - -async function doubleFollow (server1: ServerInfo, server2: ServerInfo) { - await Promise.all([ - follow(server1.url, [ server2.url ], server1.accessToken), - follow(server2.url, [ server1.url ], server2.accessToken) - ]) - - // Wait request propagation - await waitJobs([ server1, server2 ]) - - return true -} - -// --------------------------------------------------------------------------- - -export { - getFollowersListPaginationAndSort, - getFollowingListPaginationAndSort, - unfollow, - follow, - doubleFollow -} diff --git a/server/tests/utils/server/jobs.ts b/server/tests/utils/server/jobs.ts deleted file mode 100644 index 4c02cace5..000000000 --- a/server/tests/utils/server/jobs.ts +++ /dev/null @@ -1,77 +0,0 @@ -import * as request from 'supertest' -import { Job, JobState } from '../../../../shared/models' -import { ServerInfo, wait } from '../index' - -function getJobsList (url: string, accessToken: string, state: JobState) { - const path = '/api/v1/jobs/' + state - - return request(url) - .get(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(200) - .expect('Content-Type', /json/) -} - -function getJobsListPaginationAndSort (url: string, accessToken: string, state: JobState, start: number, count: number, sort: string) { - const path = '/api/v1/jobs/' + state - - return request(url) - .get(path) - .query({ start }) - .query({ count }) - .query({ sort }) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(200) - .expect('Content-Type', /json/) -} - -async function waitJobs (serversArg: ServerInfo[] | ServerInfo) { - let servers: ServerInfo[] - - if (Array.isArray(serversArg) === false) servers = [ serversArg as ServerInfo ] - else servers = serversArg as ServerInfo[] - - const states: JobState[] = [ 'waiting', 'active', 'delayed' ] - const tasks: Promise[] = [] - let pendingRequests: boolean - - do { - pendingRequests = false - - // Check if each server has pending request - for (const server of servers) { - for (const state of states) { - const p = getJobsListPaginationAndSort(server.url, server.accessToken, state, 0, 10, '-createdAt') - .then(res => res.body.data) - .then((jobs: Job[]) => jobs.filter(j => j.type !== 'videos-views')) - .then(jobs => { - if (jobs.length !== 0) pendingRequests = true - }) - tasks.push(p) - } - } - - await Promise.all(tasks) - - // Retry, in case of new jobs were created - if (pendingRequests === false) { - await wait(1000) - - await Promise.all(tasks) - } - - if (pendingRequests) { - await wait(1000) - } - } while (pendingRequests) -} - -// --------------------------------------------------------------------------- - -export { - getJobsList, - waitJobs, - getJobsListPaginationAndSort -} diff --git a/server/tests/utils/server/redundancy.ts b/server/tests/utils/server/redundancy.ts deleted file mode 100644 index c39ff2c8b..000000000 --- a/server/tests/utils/server/redundancy.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { makePutBodyRequest } from '../requests/requests' - -async function updateRedundancy (url: string, accessToken: string, host: string, redundancyAllowed: boolean, expectedStatus = 204) { - const path = '/api/v1/server/redundancy/' + host - - return makePutBodyRequest({ - url, - path, - token: accessToken, - fields: { redundancyAllowed }, - statusCodeExpected: expectedStatus - }) -} - -export { - updateRedundancy -} diff --git a/server/tests/utils/server/servers.ts b/server/tests/utils/server/servers.ts deleted file mode 100644 index 3c946db27..000000000 --- a/server/tests/utils/server/servers.ts +++ /dev/null @@ -1,185 +0,0 @@ -import { ChildProcess, exec, fork } from 'child_process' -import { join } from 'path' -import { root, wait } from '../miscs/miscs' -import { readFile } from 'fs-extra' - -interface ServerInfo { - app: ChildProcess, - url: string - host: string - serverNumber: number - - client: { - id: string, - secret: string - } - - user: { - username: string, - password: string, - email?: string - } - - accessToken?: string - - video?: { - id: number - uuid: string - name: string - account: { - name: string - } - } - - remoteVideo?: { - id: number - uuid: string - } -} - -function flushAndRunMultipleServers (totalServers: number, configOverride?: Object) { - let apps = [] - let i = 0 - - return new Promise(res => { - function anotherServerDone (serverNumber, app) { - apps[serverNumber - 1] = app - i++ - if (i === totalServers) { - return res(apps) - } - } - - flushTests() - .then(() => { - for (let j = 1; j <= totalServers; j++) { - runServer(j, configOverride).then(app => anotherServerDone(j, app)) - } - }) - }) -} - -function flushTests () { - return new Promise((res, rej) => { - return exec('npm run clean:server:test', err => { - if (err) return rej(err) - - return res() - }) - }) -} - -function runServer (serverNumber: number, configOverride?: Object) { - const server: ServerInfo = { - app: null, - serverNumber: serverNumber, - url: `http://localhost:${9000 + serverNumber}`, - host: `localhost:${9000 + serverNumber}`, - client: { - id: null, - secret: null - }, - user: { - username: null, - password: null - } - } - - // These actions are async so we need to be sure that they have both been done - const serverRunString = { - 'Server listening': false - } - const key = 'Database peertube_test' + serverNumber + ' is ready' - serverRunString[key] = false - - const regexps = { - client_id: 'Client id: (.+)', - client_secret: 'Client secret: (.+)', - user_username: 'Username: (.+)', - user_password: 'User password: (.+)' - } - - // Share the environment - const env = Object.create(process.env) - env['NODE_ENV'] = 'test' - env['NODE_APP_INSTANCE'] = serverNumber.toString() - - if (configOverride !== undefined) { - env['NODE_CONFIG'] = JSON.stringify(configOverride) - } - - const options = { - silent: true, - env: env, - detached: true - } - - return new Promise(res => { - server.app = fork(join(__dirname, '..', '..', '..', '..', 'dist', 'server.js'), [], options) - server.app.stdout.on('data', function onStdout (data) { - let dontContinue = false - - // Capture things if we want to - for (const key of Object.keys(regexps)) { - const regexp = regexps[key] - const matches = data.toString().match(regexp) - if (matches !== null) { - if (key === 'client_id') server.client.id = matches[1] - else if (key === 'client_secret') server.client.secret = matches[1] - else if (key === 'user_username') server.user.username = matches[1] - else if (key === 'user_password') server.user.password = matches[1] - } - } - - // Check if all required sentences are here - for (const key of Object.keys(serverRunString)) { - if (data.toString().indexOf(key) !== -1) serverRunString[key] = true - if (serverRunString[key] === false) dontContinue = true - } - - // If no, there is maybe one thing not already initialized (client/user credentials generation...) - if (dontContinue === true) return - - server.app.stdout.removeListener('data', onStdout) - res(server) - }) - }) -} - -async function reRunServer (server: ServerInfo, configOverride?: any) { - const newServer = await runServer(server.serverNumber, configOverride) - server.app = newServer.app - - return server -} - -function killallServers (servers: ServerInfo[]) { - for (const server of servers) { - process.kill(-server.app.pid) - } -} - -async function waitUntilLog (server: ServerInfo, str: string, count = 1) { - const logfile = join(root(), 'test' + server.serverNumber, 'logs/peertube.log') - - while (true) { - const buf = await readFile(logfile) - - const matches = buf.toString().match(new RegExp(str, 'g')) - if (matches && matches.length === count) return - - await wait(1000) - } -} - -// --------------------------------------------------------------------------- - -export { - ServerInfo, - flushAndRunMultipleServers, - flushTests, - runServer, - killallServers, - reRunServer, - waitUntilLog -} diff --git a/server/tests/utils/server/stats.ts b/server/tests/utils/server/stats.ts deleted file mode 100644 index 01989d952..000000000 --- a/server/tests/utils/server/stats.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { makeGetRequest } from '../' - -function getStats (url: string, useCache = false) { - const path = '/api/v1/server/stats' - - const query = { - t: useCache ? undefined : new Date().getTime() - } - - return makeGetRequest({ - url, - path, - query, - statusCodeExpected: 200 - }) -} - -// --------------------------------------------------------------------------- - -export { - getStats -} diff --git a/server/tests/utils/users/accounts.ts b/server/tests/utils/users/accounts.ts deleted file mode 100644 index f82b8d906..000000000 --- a/server/tests/utils/users/accounts.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* tslint:disable:no-unused-expression */ - -import { expect } from 'chai' -import { existsSync, readdir } from 'fs-extra' -import { join } from 'path' -import { Account } from '../../../../shared/models/actors' -import { root } from '../index' -import { makeGetRequest } from '../requests/requests' - -function getAccountsList (url: string, sort = '-createdAt', statusCodeExpected = 200) { - const path = '/api/v1/accounts' - - return makeGetRequest({ - url, - query: { sort }, - path, - statusCodeExpected - }) -} - -function getAccount (url: string, accountName: string, statusCodeExpected = 200) { - const path = '/api/v1/accounts/' + accountName - - return makeGetRequest({ - url, - path, - statusCodeExpected - }) -} - -async function expectAccountFollows (url: string, nameWithDomain: string, followersCount: number, followingCount: number) { - const res = await getAccountsList(url) - const account = res.body.data.find((a: Account) => a.name + '@' + a.host === nameWithDomain) - - const message = `${nameWithDomain} on ${url}` - expect(account.followersCount).to.equal(followersCount, message) - expect(account.followingCount).to.equal(followingCount, message) -} - -async function checkActorFilesWereRemoved (actorUUID: string, serverNumber: number) { - const testDirectory = 'test' + serverNumber - - for (const directory of [ 'avatars' ]) { - const directoryPath = join(root(), testDirectory, directory) - - const directoryExists = existsSync(directoryPath) - expect(directoryExists).to.be.true - - const files = await readdir(directoryPath) - for (const file of files) { - expect(file).to.not.contain(actorUUID) - } - } -} - -// --------------------------------------------------------------------------- - -export { - getAccount, - expectAccountFollows, - getAccountsList, - checkActorFilesWereRemoved -} diff --git a/server/tests/utils/users/blocklist.ts b/server/tests/utils/users/blocklist.ts deleted file mode 100644 index 35b537571..000000000 --- a/server/tests/utils/users/blocklist.ts +++ /dev/null @@ -1,198 +0,0 @@ -/* tslint:disable:no-unused-expression */ - -import { makeDeleteRequest, makePostBodyRequest } from '../index' -import { makeGetRequest } from '../requests/requests' - -function getAccountBlocklistByAccount ( - url: string, - token: string, - start: number, - count: number, - sort = '-createdAt', - statusCodeExpected = 200 -) { - const path = '/api/v1/users/me/blocklist/accounts' - - return makeGetRequest({ - url, - token, - query: { start, count, sort }, - path, - statusCodeExpected - }) -} - -function addAccountToAccountBlocklist (url: string, token: string, accountToBlock: string, statusCodeExpected = 204) { - const path = '/api/v1/users/me/blocklist/accounts' - - return makePostBodyRequest({ - url, - path, - token, - fields: { - accountName: accountToBlock - }, - statusCodeExpected - }) -} - -function removeAccountFromAccountBlocklist (url: string, token: string, accountToUnblock: string, statusCodeExpected = 204) { - const path = '/api/v1/users/me/blocklist/accounts/' + accountToUnblock - - return makeDeleteRequest({ - url, - path, - token, - statusCodeExpected - }) -} - -function getServerBlocklistByAccount ( - url: string, - token: string, - start: number, - count: number, - sort = '-createdAt', - statusCodeExpected = 200 -) { - const path = '/api/v1/users/me/blocklist/servers' - - return makeGetRequest({ - url, - token, - query: { start, count, sort }, - path, - statusCodeExpected - }) -} - -function addServerToAccountBlocklist (url: string, token: string, serverToBlock: string, statusCodeExpected = 204) { - const path = '/api/v1/users/me/blocklist/servers' - - return makePostBodyRequest({ - url, - path, - token, - fields: { - host: serverToBlock - }, - statusCodeExpected - }) -} - -function removeServerFromAccountBlocklist (url: string, token: string, serverToBlock: string, statusCodeExpected = 204) { - const path = '/api/v1/users/me/blocklist/servers/' + serverToBlock - - return makeDeleteRequest({ - url, - path, - token, - statusCodeExpected - }) -} - -function getAccountBlocklistByServer ( - url: string, - token: string, - start: number, - count: number, - sort = '-createdAt', - statusCodeExpected = 200 -) { - const path = '/api/v1/server/blocklist/accounts' - - return makeGetRequest({ - url, - token, - query: { start, count, sort }, - path, - statusCodeExpected - }) -} - -function addAccountToServerBlocklist (url: string, token: string, accountToBlock: string, statusCodeExpected = 204) { - const path = '/api/v1/server/blocklist/accounts' - - return makePostBodyRequest({ - url, - path, - token, - fields: { - accountName: accountToBlock - }, - statusCodeExpected - }) -} - -function removeAccountFromServerBlocklist (url: string, token: string, accountToUnblock: string, statusCodeExpected = 204) { - const path = '/api/v1/server/blocklist/accounts/' + accountToUnblock - - return makeDeleteRequest({ - url, - path, - token, - statusCodeExpected - }) -} - -function getServerBlocklistByServer ( - url: string, - token: string, - start: number, - count: number, - sort = '-createdAt', - statusCodeExpected = 200 -) { - const path = '/api/v1/server/blocklist/servers' - - return makeGetRequest({ - url, - token, - query: { start, count, sort }, - path, - statusCodeExpected - }) -} - -function addServerToServerBlocklist (url: string, token: string, serverToBlock: string, statusCodeExpected = 204) { - const path = '/api/v1/server/blocklist/servers' - - return makePostBodyRequest({ - url, - path, - token, - fields: { - host: serverToBlock - }, - statusCodeExpected - }) -} - -function removeServerFromServerBlocklist (url: string, token: string, serverToBlock: string, statusCodeExpected = 204) { - const path = '/api/v1/server/blocklist/servers/' + serverToBlock - - return makeDeleteRequest({ - url, - path, - token, - statusCodeExpected - }) -} - -// --------------------------------------------------------------------------- - -export { - getAccountBlocklistByAccount, - addAccountToAccountBlocklist, - removeAccountFromAccountBlocklist, - getServerBlocklistByAccount, - addServerToAccountBlocklist, - removeServerFromAccountBlocklist, - - getAccountBlocklistByServer, - addAccountToServerBlocklist, - removeAccountFromServerBlocklist, - getServerBlocklistByServer, - addServerToServerBlocklist, - removeServerFromServerBlocklist -} diff --git a/server/tests/utils/users/login.ts b/server/tests/utils/users/login.ts deleted file mode 100644 index ddeb9df2a..000000000 --- a/server/tests/utils/users/login.ts +++ /dev/null @@ -1,62 +0,0 @@ -import * as request from 'supertest' - -import { ServerInfo } from '../server/servers' - -type Client = { id: string, secret: string } -type User = { username: string, password: string } -type Server = { url: string, client: Client, user: User } - -function login (url: string, client: Client, user: User, expectedStatus = 200) { - const path = '/api/v1/users/token' - - const body = { - client_id: client.id, - client_secret: client.secret, - username: user.username, - password: user.password, - response_type: 'code', - grant_type: 'password', - scope: 'upload' - } - - return request(url) - .post(path) - .type('form') - .send(body) - .expect(expectedStatus) -} - -async function serverLogin (server: Server) { - const res = await login(server.url, server.client, server.user, 200) - - return res.body.access_token as string -} - -async function userLogin (server: Server, user: User, expectedStatus = 200) { - const res = await login(server.url, server.client, user, expectedStatus) - - return res.body.access_token as string -} - -function setAccessTokensToServers (servers: ServerInfo[]) { - const tasks: Promise[] = [] - - for (const server of servers) { - const p = serverLogin(server).then(t => server.accessToken = t) - tasks.push(p) - } - - return Promise.all(tasks) -} - -// --------------------------------------------------------------------------- - -export { - login, - serverLogin, - userLogin, - setAccessTokensToServers, - Server, - Client, - User -} diff --git a/server/tests/utils/users/user-subscriptions.ts b/server/tests/utils/users/user-subscriptions.ts deleted file mode 100644 index b0e7da7cc..000000000 --- a/server/tests/utils/users/user-subscriptions.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { makeDeleteRequest, makeGetRequest, makePostBodyRequest } from '../' - -function addUserSubscription (url: string, token: string, targetUri: string, statusCodeExpected = 204) { - const path = '/api/v1/users/me/subscriptions' - - return makePostBodyRequest({ - url, - path, - token, - statusCodeExpected, - fields: { uri: targetUri } - }) -} - -function listUserSubscriptions (url: string, token: string, sort = '-createdAt', statusCodeExpected = 200) { - const path = '/api/v1/users/me/subscriptions' - - return makeGetRequest({ - url, - path, - token, - statusCodeExpected, - query: { sort } - }) -} - -function listUserSubscriptionVideos (url: string, token: string, sort = '-createdAt', statusCodeExpected = 200) { - const path = '/api/v1/users/me/subscriptions/videos' - - return makeGetRequest({ - url, - path, - token, - statusCodeExpected, - query: { sort } - }) -} - -function getUserSubscription (url: string, token: string, uri: string, statusCodeExpected = 200) { - const path = '/api/v1/users/me/subscriptions/' + uri - - return makeGetRequest({ - url, - path, - token, - statusCodeExpected - }) -} - -function removeUserSubscription (url: string, token: string, uri: string, statusCodeExpected = 204) { - const path = '/api/v1/users/me/subscriptions/' + uri - - return makeDeleteRequest({ - url, - path, - token, - statusCodeExpected - }) -} - -function areSubscriptionsExist (url: string, token: string, uris: string[], statusCodeExpected = 200) { - const path = '/api/v1/users/me/subscriptions/exist' - - return makeGetRequest({ - url, - path, - query: { 'uris[]': uris }, - token, - statusCodeExpected - }) -} - -// --------------------------------------------------------------------------- - -export { - areSubscriptionsExist, - addUserSubscription, - listUserSubscriptions, - getUserSubscription, - listUserSubscriptionVideos, - removeUserSubscription -} diff --git a/server/tests/utils/users/users.ts b/server/tests/utils/users/users.ts deleted file mode 100644 index d77233d62..000000000 --- a/server/tests/utils/users/users.ts +++ /dev/null @@ -1,296 +0,0 @@ -import * as request from 'supertest' -import { makePostBodyRequest, makePutBodyRequest, updateAvatarRequest } from '../' - -import { UserRole } from '../../../../shared/index' -import { NSFWPolicyType } from '../../../../shared/models/videos/nsfw-policy.type' - -function createUser ( - url: string, - accessToken: string, - username: string, - password: string, - videoQuota = 1000000, - videoQuotaDaily = -1, - role: UserRole = UserRole.USER, - specialStatus = 200 -) { - const path = '/api/v1/users' - const body = { - username, - password, - role, - email: username + '@example.com', - videoQuota, - videoQuotaDaily - } - - return request(url) - .post(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .send(body) - .expect(specialStatus) -} - -function registerUser (url: string, username: string, password: string, specialStatus = 204) { - const path = '/api/v1/users/register' - const body = { - username, - password, - email: username + '@example.com' - } - - return request(url) - .post(path) - .set('Accept', 'application/json') - .send(body) - .expect(specialStatus) -} - -function getMyUserInformation (url: string, accessToken: string, specialStatus = 200) { - const path = '/api/v1/users/me' - - return request(url) - .get(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(specialStatus) - .expect('Content-Type', /json/) -} - -function deleteMe (url: string, accessToken: string, specialStatus = 204) { - const path = '/api/v1/users/me' - - return request(url) - .delete(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(specialStatus) -} - -function getMyUserVideoQuotaUsed (url: string, accessToken: string, specialStatus = 200) { - const path = '/api/v1/users/me/video-quota-used' - - return request(url) - .get(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(specialStatus) - .expect('Content-Type', /json/) -} - -function getUserInformation (url: string, accessToken: string, userId: number) { - const path = '/api/v1/users/' + userId - - return request(url) - .get(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(200) - .expect('Content-Type', /json/) -} - -function getMyUserVideoRating (url: string, accessToken: string, videoId: number | string, specialStatus = 200) { - const path = '/api/v1/users/me/videos/' + videoId + '/rating' - - return request(url) - .get(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(specialStatus) - .expect('Content-Type', /json/) -} - -function getUsersList (url: string, accessToken: string) { - const path = '/api/v1/users' - - return request(url) - .get(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(200) - .expect('Content-Type', /json/) -} - -function getUsersListPaginationAndSort (url: string, accessToken: string, start: number, count: number, sort: string, search?: string) { - const path = '/api/v1/users' - - return request(url) - .get(path) - .query({ start }) - .query({ count }) - .query({ sort }) - .query({ search }) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(200) - .expect('Content-Type', /json/) -} - -function removeUser (url: string, userId: number | string, accessToken: string, expectedStatus = 204) { - const path = '/api/v1/users' - - return request(url) - .delete(path + '/' + userId) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(expectedStatus) -} - -function blockUser (url: string, userId: number | string, accessToken: string, expectedStatus = 204, reason?: string) { - const path = '/api/v1/users' - let body: any - if (reason) body = { reason } - - return request(url) - .post(path + '/' + userId + '/block') - .send(body) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(expectedStatus) -} - -function unblockUser (url: string, userId: number | string, accessToken: string, expectedStatus = 204) { - const path = '/api/v1/users' - - return request(url) - .post(path + '/' + userId + '/unblock') - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(expectedStatus) -} - -function updateMyUser (options: { - url: string - accessToken: string, - currentPassword?: string, - newPassword?: string, - nsfwPolicy?: NSFWPolicyType, - email?: string, - autoPlayVideo?: boolean - displayName?: string, - description?: string -}) { - const path = '/api/v1/users/me' - - const toSend = {} - if (options.currentPassword !== undefined && options.currentPassword !== null) toSend['currentPassword'] = options.currentPassword - if (options.newPassword !== undefined && options.newPassword !== null) toSend['password'] = options.newPassword - if (options.nsfwPolicy !== undefined && options.nsfwPolicy !== null) toSend['nsfwPolicy'] = options.nsfwPolicy - if (options.autoPlayVideo !== undefined && options.autoPlayVideo !== null) toSend['autoPlayVideo'] = options.autoPlayVideo - if (options.email !== undefined && options.email !== null) toSend['email'] = options.email - if (options.description !== undefined && options.description !== null) toSend['description'] = options.description - if (options.displayName !== undefined && options.displayName !== null) toSend['displayName'] = options.displayName - - return makePutBodyRequest({ - url: options.url, - path, - token: options.accessToken, - fields: toSend, - statusCodeExpected: 204 - }) -} - -function updateMyAvatar (options: { - url: string, - accessToken: string, - fixture: string -}) { - const path = '/api/v1/users/me/avatar/pick' - - return updateAvatarRequest(Object.assign(options, { path })) -} - -function updateUser (options: { - url: string - userId: number, - accessToken: string, - email?: string, - videoQuota?: number, - videoQuotaDaily?: number, - role?: UserRole -}) { - const path = '/api/v1/users/' + options.userId - - const toSend = {} - if (options.email !== undefined && options.email !== null) toSend['email'] = options.email - if (options.videoQuota !== undefined && options.videoQuota !== null) toSend['videoQuota'] = options.videoQuota - if (options.videoQuotaDaily !== undefined && options.videoQuotaDaily !== null) toSend['videoQuotaDaily'] = options.videoQuotaDaily - if (options.role !== undefined && options.role !== null) toSend['role'] = options.role - - return makePutBodyRequest({ - url: options.url, - path, - token: options.accessToken, - fields: toSend, - statusCodeExpected: 204 - }) -} - -function askResetPassword (url: string, email: string) { - const path = '/api/v1/users/ask-reset-password' - - return makePostBodyRequest({ - url, - path, - fields: { email }, - statusCodeExpected: 204 - }) -} - -function resetPassword (url: string, userId: number, verificationString: string, password: string, statusCodeExpected = 204) { - const path = '/api/v1/users/' + userId + '/reset-password' - - return makePostBodyRequest({ - url, - path, - fields: { password, verificationString }, - statusCodeExpected - }) -} - -function askSendVerifyEmail (url: string, email: string) { - const path = '/api/v1/users/ask-send-verify-email' - - return makePostBodyRequest({ - url, - path, - fields: { email }, - statusCodeExpected: 204 - }) -} - -function verifyEmail (url: string, userId: number, verificationString: string, statusCodeExpected = 204) { - const path = '/api/v1/users/' + userId + '/verify-email' - - return makePostBodyRequest({ - url, - path, - fields: { verificationString }, - statusCodeExpected - }) -} - -// --------------------------------------------------------------------------- - -export { - createUser, - registerUser, - getMyUserInformation, - getMyUserVideoRating, - deleteMe, - getMyUserVideoQuotaUsed, - getUsersList, - getUsersListPaginationAndSort, - removeUser, - updateUser, - updateMyUser, - getUserInformation, - blockUser, - unblockUser, - askResetPassword, - resetPassword, - updateMyAvatar, - askSendVerifyEmail, - verifyEmail -} diff --git a/server/tests/utils/videos/services.ts b/server/tests/utils/videos/services.ts deleted file mode 100644 index 1a53dd4cf..000000000 --- a/server/tests/utils/videos/services.ts +++ /dev/null @@ -1,23 +0,0 @@ -import * as request from 'supertest' - -function getOEmbed (url: string, oembedUrl: string, format?: string, maxHeight?: number, maxWidth?: number) { - const path = '/services/oembed' - const query = { - url: oembedUrl, - format, - maxheight: maxHeight, - maxwidth: maxWidth - } - - return request(url) - .get(path) - .query(query) - .set('Accept', 'application/json') - .expect(200) -} - -// --------------------------------------------------------------------------- - -export { - getOEmbed -} diff --git a/server/tests/utils/videos/video-abuses.ts b/server/tests/utils/videos/video-abuses.ts deleted file mode 100644 index 14907e6a0..000000000 --- a/server/tests/utils/videos/video-abuses.ts +++ /dev/null @@ -1,65 +0,0 @@ -import * as request from 'supertest' -import { VideoAbuseUpdate } from '../../../../shared/models/videos/abuse/video-abuse-update.model' -import { makeDeleteRequest, makePutBodyRequest } from '..' - -function reportVideoAbuse (url: string, token: string, videoId: number | string, reason: string, specialStatus = 200) { - const path = '/api/v1/videos/' + videoId + '/abuse' - - return request(url) - .post(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .send({ reason }) - .expect(specialStatus) -} - -function getVideoAbusesList (url: string, token: string) { - const path = '/api/v1/videos/abuse' - - return request(url) - .get(path) - .query({ sort: 'createdAt' }) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .expect(200) - .expect('Content-Type', /json/) -} - -function updateVideoAbuse ( - url: string, - token: string, - videoId: string | number, - videoAbuseId: number, - body: VideoAbuseUpdate, - statusCodeExpected = 204 -) { - const path = '/api/v1/videos/' + videoId + '/abuse/' + videoAbuseId - - return makePutBodyRequest({ - url, - token, - path, - fields: body, - statusCodeExpected - }) -} - -function deleteVideoAbuse (url: string, token: string, videoId: string | number, videoAbuseId: number, statusCodeExpected = 204) { - const path = '/api/v1/videos/' + videoId + '/abuse/' + videoAbuseId - - return makeDeleteRequest({ - url, - token, - path, - statusCodeExpected - }) -} - -// --------------------------------------------------------------------------- - -export { - reportVideoAbuse, - getVideoAbusesList, - updateVideoAbuse, - deleteVideoAbuse -} diff --git a/server/tests/utils/videos/video-blacklist.ts b/server/tests/utils/videos/video-blacklist.ts deleted file mode 100644 index 2c176fde0..000000000 --- a/server/tests/utils/videos/video-blacklist.ts +++ /dev/null @@ -1,67 +0,0 @@ -import * as request from 'supertest' - -function addVideoToBlacklist (url: string, token: string, videoId: number | string, reason?: string, specialStatus = 204) { - const path = '/api/v1/videos/' + videoId + '/blacklist' - - return request(url) - .post(path) - .send({ reason }) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .expect(specialStatus) -} - -function updateVideoBlacklist (url: string, token: string, videoId: number, reason?: string, specialStatus = 204) { - const path = '/api/v1/videos/' + videoId + '/blacklist' - - return request(url) - .put(path) - .send({ reason }) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .expect(specialStatus) -} - -function removeVideoFromBlacklist (url: string, token: string, videoId: number | string, specialStatus = 204) { - const path = '/api/v1/videos/' + videoId + '/blacklist' - - return request(url) - .delete(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .expect(specialStatus) -} - -function getBlacklistedVideosList (url: string, token: string, specialStatus = 200) { - const path = '/api/v1/videos/blacklist/' - - return request(url) - .get(path) - .query({ sort: 'createdAt' }) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .expect(specialStatus) - .expect('Content-Type', /json/) -} - -function getSortedBlacklistedVideosList (url: string, token: string, sort: string, specialStatus = 200) { - const path = '/api/v1/videos/blacklist/' - - return request(url) - .get(path) - .query({ sort: sort }) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .expect(specialStatus) - .expect('Content-Type', /json/) -} - -// --------------------------------------------------------------------------- - -export { - addVideoToBlacklist, - removeVideoFromBlacklist, - getBlacklistedVideosList, - getSortedBlacklistedVideosList, - updateVideoBlacklist -} diff --git a/server/tests/utils/videos/video-captions.ts b/server/tests/utils/videos/video-captions.ts deleted file mode 100644 index 41e52be07..000000000 --- a/server/tests/utils/videos/video-captions.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { makeDeleteRequest, makeGetRequest } from '../' -import { buildAbsoluteFixturePath, makeUploadRequest } from '../index' -import * as request from 'supertest' -import * as chai from 'chai' - -const expect = chai.expect - -function createVideoCaption (args: { - url: string, - accessToken: string - videoId: string | number - language: string - fixture: string, - mimeType?: string, - statusCodeExpected?: number -}) { - const path = '/api/v1/videos/' + args.videoId + '/captions/' + args.language - - const captionfile = buildAbsoluteFixturePath(args.fixture) - const captionfileAttach = args.mimeType ? [ captionfile, { contentType: args.mimeType } ] : captionfile - - return makeUploadRequest({ - method: 'PUT', - url: args.url, - path, - token: args.accessToken, - fields: {}, - attaches: { - captionfile: captionfileAttach - }, - statusCodeExpected: args.statusCodeExpected || 204 - }) -} - -function listVideoCaptions (url: string, videoId: string | number) { - const path = '/api/v1/videos/' + videoId + '/captions' - - return makeGetRequest({ - url, - path, - statusCodeExpected: 200 - }) -} - -function deleteVideoCaption (url: string, token: string, videoId: string | number, language: string) { - const path = '/api/v1/videos/' + videoId + '/captions/' + language - - return makeDeleteRequest({ - url, - token, - path, - statusCodeExpected: 204 - }) -} - -async function testCaptionFile (url: string, captionPath: string, containsString: string) { - const res = await request(url) - .get(captionPath) - .expect(200) - - expect(res.text).to.contain(containsString) -} - -// --------------------------------------------------------------------------- - -export { - createVideoCaption, - listVideoCaptions, - testCaptionFile, - deleteVideoCaption -} diff --git a/server/tests/utils/videos/video-change-ownership.ts b/server/tests/utils/videos/video-change-ownership.ts deleted file mode 100644 index f288692ea..000000000 --- a/server/tests/utils/videos/video-change-ownership.ts +++ /dev/null @@ -1,54 +0,0 @@ -import * as request from 'supertest' - -function changeVideoOwnership (url: string, token: string, videoId: number | string, username) { - const path = '/api/v1/videos/' + videoId + '/give-ownership' - - return request(url) - .post(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .send({ username }) - .expect(204) -} - -function getVideoChangeOwnershipList (url: string, token: string) { - const path = '/api/v1/videos/ownership' - - return request(url) - .get(path) - .query({ sort: '-createdAt' }) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .expect(200) - .expect('Content-Type', /json/) -} - -function acceptChangeOwnership (url: string, token: string, ownershipId: string, channelId: number, expectedStatus = 204) { - const path = '/api/v1/videos/ownership/' + ownershipId + '/accept' - - return request(url) - .post(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .send({ channelId }) - .expect(expectedStatus) -} - -function refuseChangeOwnership (url: string, token: string, ownershipId: string, expectedStatus = 204) { - const path = '/api/v1/videos/ownership/' + ownershipId + '/refuse' - - return request(url) - .post(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .expect(expectedStatus) -} - -// --------------------------------------------------------------------------- - -export { - changeVideoOwnership, - getVideoChangeOwnershipList, - acceptChangeOwnership, - refuseChangeOwnership -} diff --git a/server/tests/utils/videos/video-channels.ts b/server/tests/utils/videos/video-channels.ts deleted file mode 100644 index 092985777..000000000 --- a/server/tests/utils/videos/video-channels.ts +++ /dev/null @@ -1,118 +0,0 @@ -import * as request from 'supertest' -import { VideoChannelCreate, VideoChannelUpdate } from '../../../../shared/models/videos' -import { updateAvatarRequest } from '../index' - -function getVideoChannelsList (url: string, start: number, count: number, sort?: string) { - const path = '/api/v1/video-channels' - - const req = request(url) - .get(path) - .query({ start: start }) - .query({ count: count }) - - if (sort) req.query({ sort }) - - return req.set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -function getAccountVideoChannelsList (url: string, accountName: string, specialStatus = 200) { - const path = '/api/v1/accounts/' + accountName + '/video-channels' - - return request(url) - .get(path) - .set('Accept', 'application/json') - .expect(specialStatus) - .expect('Content-Type', /json/) -} - -function addVideoChannel ( - url: string, - token: string, - videoChannelAttributesArg: VideoChannelCreate, - expectedStatus = 200 -) { - const path = '/api/v1/video-channels/' - - // Default attributes - let attributes = { - displayName: 'my super video channel', - description: 'my super channel description', - support: 'my super channel support' - } - attributes = Object.assign(attributes, videoChannelAttributesArg) - - return request(url) - .post(path) - .send(attributes) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .expect(expectedStatus) -} - -function updateVideoChannel ( - url: string, - token: string, - channelName: string, - attributes: VideoChannelUpdate, - expectedStatus = 204 -) { - const body = {} - const path = '/api/v1/video-channels/' + channelName - - if (attributes.displayName) body['displayName'] = attributes.displayName - if (attributes.description) body['description'] = attributes.description - if (attributes.support) body['support'] = attributes.support - - return request(url) - .put(path) - .send(body) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .expect(expectedStatus) -} - -function deleteVideoChannel (url: string, token: string, channelName: string, expectedStatus = 204) { - const path = '/api/v1/video-channels/' + channelName - - return request(url) - .delete(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .expect(expectedStatus) -} - -function getVideoChannel (url: string, channelName: string) { - const path = '/api/v1/video-channels/' + channelName - - return request(url) - .get(path) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -function updateVideoChannelAvatar (options: { - url: string, - accessToken: string, - fixture: string, - videoChannelName: string | number -}) { - - const path = '/api/v1/video-channels/' + options.videoChannelName + '/avatar/pick' - - return updateAvatarRequest(Object.assign(options, { path })) -} - -// --------------------------------------------------------------------------- - -export { - updateVideoChannelAvatar, - getVideoChannelsList, - getAccountVideoChannelsList, - addVideoChannel, - updateVideoChannel, - deleteVideoChannel, - getVideoChannel -} diff --git a/server/tests/utils/videos/video-comments.ts b/server/tests/utils/videos/video-comments.ts deleted file mode 100644 index 7d4cae364..000000000 --- a/server/tests/utils/videos/video-comments.ts +++ /dev/null @@ -1,87 +0,0 @@ -import * as request from 'supertest' -import { makeDeleteRequest } from '../' - -function getVideoCommentThreads (url: string, videoId: number | string, start: number, count: number, sort?: string, token?: string) { - const path = '/api/v1/videos/' + videoId + '/comment-threads' - - const req = request(url) - .get(path) - .query({ start: start }) - .query({ count: count }) - - if (sort) req.query({ sort }) - if (token) req.set('Authorization', 'Bearer ' + token) - - return req.set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -function getVideoThreadComments (url: string, videoId: number | string, threadId: number, token?: string) { - const path = '/api/v1/videos/' + videoId + '/comment-threads/' + threadId - - const req = request(url) - .get(path) - .set('Accept', 'application/json') - - if (token) req.set('Authorization', 'Bearer ' + token) - - return req.expect(200) - .expect('Content-Type', /json/) -} - -function addVideoCommentThread (url: string, token: string, videoId: number | string, text: string, expectedStatus = 200) { - const path = '/api/v1/videos/' + videoId + '/comment-threads' - - return request(url) - .post(path) - .send({ text }) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .expect(expectedStatus) -} - -function addVideoCommentReply ( - url: string, - token: string, - videoId: number | string, - inReplyToCommentId: number, - text: string, - expectedStatus = 200 -) { - const path = '/api/v1/videos/' + videoId + '/comments/' + inReplyToCommentId - - return request(url) - .post(path) - .send({ text }) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .expect(expectedStatus) -} - -function deleteVideoComment ( - url: string, - token: string, - videoId: number | string, - commentId: number, - statusCodeExpected = 204 -) { - const path = '/api/v1/videos/' + videoId + '/comments/' + commentId - - return makeDeleteRequest({ - url, - path, - token, - statusCodeExpected - }) -} - -// --------------------------------------------------------------------------- - -export { - getVideoCommentThreads, - getVideoThreadComments, - addVideoCommentThread, - addVideoCommentReply, - deleteVideoComment -} diff --git a/server/tests/utils/videos/video-history.ts b/server/tests/utils/videos/video-history.ts deleted file mode 100644 index 7635478f7..000000000 --- a/server/tests/utils/videos/video-history.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { makePutBodyRequest } from '../requests/requests' - -function userWatchVideo (url: string, token: string, videoId: number | string, currentTime: number) { - const path = '/api/v1/videos/' + videoId + '/watching' - const fields = { currentTime } - - return makePutBodyRequest({ url, path, token, fields, statusCodeExpected: 204 }) -} - -// --------------------------------------------------------------------------- - -export { - userWatchVideo -} diff --git a/server/tests/utils/videos/video-imports.ts b/server/tests/utils/videos/video-imports.ts deleted file mode 100644 index 59dfd481a..000000000 --- a/server/tests/utils/videos/video-imports.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { VideoImportCreate } from '../../../../shared/models/videos' -import { makeGetRequest, makeUploadRequest } from '..' - -function getYoutubeVideoUrl () { - return 'https://youtu.be/msX3jv1XdvM' -} - -function getMagnetURI () { - // tslint:disable:max-line-length - return 'magnet:?xs=https%3A%2F%2Fpeertube2.cpy.re%2Fstatic%2Ftorrents%2Fb209ca00-c8bb-4b2b-b421-1ede169f3dbc-720.torrent&xt=urn:btih:0f498834733e8057ed5c6f2ee2b4efd8d84a76ee&dn=super+peertube2+video&tr=wss%3A%2F%2Fpeertube2.cpy.re%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube2.cpy.re%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube2.cpy.re%2Fstatic%2Fwebseed%2Fb209ca00-c8bb-4b2b-b421-1ede169f3dbc-720.mp4' -} - -function importVideo (url: string, token: string, attributes: VideoImportCreate) { - const path = '/api/v1/videos/imports' - - let attaches: any = {} - if (attributes.torrentfile) attaches = { torrentfile: attributes.torrentfile } - - return makeUploadRequest({ - url, - path, - token, - attaches, - fields: attributes, - statusCodeExpected: 200 - }) -} - -function getMyVideoImports (url: string, token: string, sort?: string) { - const path = '/api/v1/users/me/videos/imports' - - const query = {} - if (sort) query['sort'] = sort - - return makeGetRequest({ - url, - query, - path, - token, - statusCodeExpected: 200 - }) -} - -// --------------------------------------------------------------------------- - -export { - getYoutubeVideoUrl, - importVideo, - getMagnetURI, - getMyVideoImports -} diff --git a/server/tests/utils/videos/videos.ts b/server/tests/utils/videos/videos.ts deleted file mode 100644 index 87c385f38..000000000 --- a/server/tests/utils/videos/videos.ts +++ /dev/null @@ -1,576 +0,0 @@ -/* tslint:disable:no-unused-expression */ - -import { expect } from 'chai' -import { existsSync, readdir, readFile } from 'fs-extra' -import * as parseTorrent from 'parse-torrent' -import { extname, join } from 'path' -import * as request from 'supertest' -import { - buildAbsoluteFixturePath, - getMyUserInformation, - immutableAssign, - makeGetRequest, - makePutBodyRequest, - makeUploadRequest, - root, - ServerInfo, - testImage -} from '../' -import { VideoDetails, VideoPrivacy } from '../../../../shared/models/videos' -import { VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES, VIDEO_PRIVACIES } from '../../../initializers' -import { dateIsValid, webtorrentAdd } from '../index' - -type VideoAttributes = { - name?: string - category?: number - licence?: number - language?: string - nsfw?: boolean - commentsEnabled?: boolean - waitTranscoding?: boolean - description?: string - tags?: string[] - channelId?: number - privacy?: VideoPrivacy - fixture?: string - thumbnailfile?: string - previewfile?: string - scheduleUpdate?: { - updateAt: string - privacy?: VideoPrivacy - } -} - -function getVideoCategories (url: string) { - const path = '/api/v1/videos/categories' - - return makeGetRequest({ - url, - path, - statusCodeExpected: 200 - }) -} - -function getVideoLicences (url: string) { - const path = '/api/v1/videos/licences' - - return makeGetRequest({ - url, - path, - statusCodeExpected: 200 - }) -} - -function getVideoLanguages (url: string) { - const path = '/api/v1/videos/languages' - - return makeGetRequest({ - url, - path, - statusCodeExpected: 200 - }) -} - -function getVideoPrivacies (url: string) { - const path = '/api/v1/videos/privacies' - - return makeGetRequest({ - url, - path, - statusCodeExpected: 200 - }) -} - -function getVideo (url: string, id: number | string, expectedStatus = 200) { - const path = '/api/v1/videos/' + id - - return request(url) - .get(path) - .set('Accept', 'application/json') - .expect(expectedStatus) -} - -function viewVideo (url: string, id: number | string, expectedStatus = 204, xForwardedFor?: string) { - const path = '/api/v1/videos/' + id + '/views' - - const req = request(url) - .post(path) - .set('Accept', 'application/json') - - if (xForwardedFor) { - req.set('X-Forwarded-For', xForwardedFor) - } - - return req.expect(expectedStatus) -} - -function getVideoWithToken (url: string, token: string, id: number | string, expectedStatus = 200) { - const path = '/api/v1/videos/' + id - - return request(url) - .get(path) - .set('Authorization', 'Bearer ' + token) - .set('Accept', 'application/json') - .expect(expectedStatus) -} - -function getVideoDescription (url: string, descriptionPath: string) { - return request(url) - .get(descriptionPath) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -function getVideosList (url: string) { - const path = '/api/v1/videos' - - return request(url) - .get(path) - .query({ sort: 'name' }) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -function getVideosListWithToken (url: string, token: string, query: { nsfw?: boolean } = {}) { - const path = '/api/v1/videos' - - return request(url) - .get(path) - .set('Authorization', 'Bearer ' + token) - .query(immutableAssign(query, { sort: 'name' })) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -function getLocalVideos (url: string) { - const path = '/api/v1/videos' - - return request(url) - .get(path) - .query({ sort: 'name', filter: 'local' }) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -function getMyVideos (url: string, accessToken: string, start: number, count: number, sort?: string) { - const path = '/api/v1/users/me/videos' - - const req = request(url) - .get(path) - .query({ start: start }) - .query({ count: count }) - - if (sort) req.query({ sort }) - - return req.set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .expect(200) - .expect('Content-Type', /json/) -} - -function getAccountVideos ( - url: string, - accessToken: string, - accountName: string, - start: number, - count: number, - sort?: string, - query: { nsfw?: boolean } = {} -) { - const path = '/api/v1/accounts/' + accountName + '/videos' - - return makeGetRequest({ - url, - path, - query: immutableAssign(query, { - start, - count, - sort - }), - token: accessToken, - statusCodeExpected: 200 - }) -} - -function getVideoChannelVideos ( - url: string, - accessToken: string, - videoChannelName: string, - start: number, - count: number, - sort?: string, - query: { nsfw?: boolean } = {} -) { - const path = '/api/v1/video-channels/' + videoChannelName + '/videos' - - return makeGetRequest({ - url, - path, - query: immutableAssign(query, { - start, - count, - sort - }), - token: accessToken, - statusCodeExpected: 200 - }) -} - -function getVideosListPagination (url: string, start: number, count: number, sort?: string) { - const path = '/api/v1/videos' - - const req = request(url) - .get(path) - .query({ start: start }) - .query({ count: count }) - - if (sort) req.query({ sort }) - - return req.set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -function getVideosListSort (url: string, sort: string) { - const path = '/api/v1/videos' - - return request(url) - .get(path) - .query({ sort: sort }) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -function getVideosWithFilters (url: string, query: { tagsAllOf: string[], categoryOneOf: number[] | number }) { - const path = '/api/v1/videos' - - return request(url) - .get(path) - .query(query) - .set('Accept', 'application/json') - .expect(200) - .expect('Content-Type', /json/) -} - -function removeVideo (url: string, token: string, id: number | string, expectedStatus = 204) { - const path = '/api/v1/videos' - - return request(url) - .delete(path + '/' + id) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + token) - .expect(expectedStatus) -} - -async function checkVideoFilesWereRemoved ( - videoUUID: string, - serverNumber: number, - directories = [ 'videos', 'thumbnails', 'torrents', 'previews', 'captions' ] -) { - const testDirectory = 'test' + serverNumber - - for (const directory of directories) { - const directoryPath = join(root(), testDirectory, directory) - - const directoryExists = existsSync(directoryPath) - expect(directoryExists).to.be.true - - const files = await readdir(directoryPath) - for (const file of files) { - expect(file).to.not.contain(videoUUID) - } - } -} - -async function uploadVideo (url: string, accessToken: string, videoAttributesArg: VideoAttributes, specialStatus = 200) { - const path = '/api/v1/videos/upload' - let defaultChannelId = '1' - - try { - const res = await getMyUserInformation(url, accessToken) - defaultChannelId = res.body.videoChannels[0].id - } catch (e) { /* empty */ } - - // Override default attributes - const attributes = Object.assign({ - name: 'my super video', - category: 5, - licence: 4, - language: 'zh', - channelId: defaultChannelId, - nsfw: true, - waitTranscoding: false, - description: 'my super description', - support: 'my super support text', - tags: [ 'tag' ], - privacy: VideoPrivacy.PUBLIC, - commentsEnabled: true, - fixture: 'video_short.webm' - }, videoAttributesArg) - - const req = request(url) - .post(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .field('name', attributes.name) - .field('nsfw', JSON.stringify(attributes.nsfw)) - .field('commentsEnabled', JSON.stringify(attributes.commentsEnabled)) - .field('waitTranscoding', JSON.stringify(attributes.waitTranscoding)) - .field('privacy', attributes.privacy.toString()) - .field('channelId', attributes.channelId) - - if (attributes.description !== undefined) { - req.field('description', attributes.description) - } - if (attributes.language !== undefined) { - req.field('language', attributes.language.toString()) - } - if (attributes.category !== undefined) { - req.field('category', attributes.category.toString()) - } - if (attributes.licence !== undefined) { - req.field('licence', attributes.licence.toString()) - } - - for (let i = 0; i < attributes.tags.length; i++) { - req.field('tags[' + i + ']', attributes.tags[i]) - } - - if (attributes.thumbnailfile !== undefined) { - req.attach('thumbnailfile', buildAbsoluteFixturePath(attributes.thumbnailfile)) - } - if (attributes.previewfile !== undefined) { - req.attach('previewfile', buildAbsoluteFixturePath(attributes.previewfile)) - } - - if (attributes.scheduleUpdate) { - req.field('scheduleUpdate[updateAt]', attributes.scheduleUpdate.updateAt) - - if (attributes.scheduleUpdate.privacy) { - req.field('scheduleUpdate[privacy]', attributes.scheduleUpdate.privacy) - } - } - - return req.attach('videofile', buildAbsoluteFixturePath(attributes.fixture)) - .expect(specialStatus) -} - -function updateVideo (url: string, accessToken: string, id: number | string, attributes: VideoAttributes, statusCodeExpected = 204) { - const path = '/api/v1/videos/' + id - const body = {} - - if (attributes.name) body['name'] = attributes.name - if (attributes.category) body['category'] = attributes.category - if (attributes.licence) body['licence'] = attributes.licence - if (attributes.language) body['language'] = attributes.language - if (attributes.nsfw !== undefined) body['nsfw'] = JSON.stringify(attributes.nsfw) - if (attributes.commentsEnabled !== undefined) body['commentsEnabled'] = JSON.stringify(attributes.commentsEnabled) - if (attributes.description) body['description'] = attributes.description - if (attributes.tags) body['tags'] = attributes.tags - if (attributes.privacy) body['privacy'] = attributes.privacy - if (attributes.channelId) body['channelId'] = attributes.channelId - if (attributes.scheduleUpdate) body['scheduleUpdate'] = attributes.scheduleUpdate - - // Upload request - if (attributes.thumbnailfile || attributes.previewfile) { - const attaches: any = {} - if (attributes.thumbnailfile) attaches.thumbnailfile = attributes.thumbnailfile - if (attributes.previewfile) attaches.previewfile = attributes.previewfile - - return makeUploadRequest({ - url, - method: 'PUT', - path, - token: accessToken, - fields: body, - attaches, - statusCodeExpected - }) - } - - return makePutBodyRequest({ - url, - path, - fields: body, - token: accessToken, - statusCodeExpected - }) -} - -function rateVideo (url: string, accessToken: string, id: number, rating: string, specialStatus = 204) { - const path = '/api/v1/videos/' + id + '/rate' - - return request(url) - .put(path) - .set('Accept', 'application/json') - .set('Authorization', 'Bearer ' + accessToken) - .send({ rating }) - .expect(specialStatus) -} - -function parseTorrentVideo (server: ServerInfo, videoUUID: string, resolution: number) { - return new Promise((res, rej) => { - const torrentName = videoUUID + '-' + resolution + '.torrent' - const torrentPath = join(__dirname, '..', '..', '..', '..', 'test' + server.serverNumber, 'torrents', torrentName) - readFile(torrentPath, (err, data) => { - if (err) return rej(err) - - return res(parseTorrent(data)) - }) - }) -} - -async function completeVideoCheck ( - url: string, - video: any, - attributes: { - name: string - category: number - licence: number - language: string - nsfw: boolean - commentsEnabled: boolean - description: string - publishedAt?: string - support: string - account: { - name: string - host: string - } - isLocal: boolean - tags: string[] - privacy: number - likes?: number - dislikes?: number - duration: number - channel: { - displayName: string - name: string - description - isLocal: boolean - } - fixture: string - files: { - resolution: number - size: number - }[], - thumbnailfile?: string - previewfile?: string - } -) { - if (!attributes.likes) attributes.likes = 0 - if (!attributes.dislikes) attributes.dislikes = 0 - - expect(video.name).to.equal(attributes.name) - expect(video.category.id).to.equal(attributes.category) - expect(video.category.label).to.equal(attributes.category !== null ? VIDEO_CATEGORIES[attributes.category] : 'Misc') - expect(video.licence.id).to.equal(attributes.licence) - expect(video.licence.label).to.equal(attributes.licence !== null ? VIDEO_LICENCES[attributes.licence] : 'Unknown') - expect(video.language.id).to.equal(attributes.language) - expect(video.language.label).to.equal(attributes.language !== null ? VIDEO_LANGUAGES[attributes.language] : 'Unknown') - expect(video.privacy.id).to.deep.equal(attributes.privacy) - expect(video.privacy.label).to.deep.equal(VIDEO_PRIVACIES[attributes.privacy]) - expect(video.nsfw).to.equal(attributes.nsfw) - expect(video.description).to.equal(attributes.description) - expect(video.account.id).to.be.a('number') - expect(video.account.uuid).to.be.a('string') - expect(video.account.host).to.equal(attributes.account.host) - expect(video.account.name).to.equal(attributes.account.name) - expect(video.channel.displayName).to.equal(attributes.channel.displayName) - expect(video.channel.name).to.equal(attributes.channel.name) - expect(video.likes).to.equal(attributes.likes) - expect(video.dislikes).to.equal(attributes.dislikes) - expect(video.isLocal).to.equal(attributes.isLocal) - expect(video.duration).to.equal(attributes.duration) - expect(dateIsValid(video.createdAt)).to.be.true - expect(dateIsValid(video.publishedAt)).to.be.true - expect(dateIsValid(video.updatedAt)).to.be.true - - if (attributes.publishedAt) { - expect(video.publishedAt).to.equal(attributes.publishedAt) - } - - const res = await getVideo(url, video.uuid) - const videoDetails: VideoDetails = res.body - - expect(videoDetails.files).to.have.lengthOf(attributes.files.length) - expect(videoDetails.tags).to.deep.equal(attributes.tags) - expect(videoDetails.account.name).to.equal(attributes.account.name) - expect(videoDetails.account.host).to.equal(attributes.account.host) - expect(video.channel.displayName).to.equal(attributes.channel.displayName) - expect(video.channel.name).to.equal(attributes.channel.name) - expect(videoDetails.channel.host).to.equal(attributes.account.host) - expect(videoDetails.channel.isLocal).to.equal(attributes.channel.isLocal) - expect(dateIsValid(videoDetails.channel.createdAt.toString())).to.be.true - expect(dateIsValid(videoDetails.channel.updatedAt.toString())).to.be.true - expect(videoDetails.commentsEnabled).to.equal(attributes.commentsEnabled) - - for (const attributeFile of attributes.files) { - const file = videoDetails.files.find(f => f.resolution.id === attributeFile.resolution) - expect(file).not.to.be.undefined - - let extension = extname(attributes.fixture) - // Transcoding enabled on server 2, extension will always be .mp4 - if (attributes.account.host === 'localhost:9002') extension = '.mp4' - - const magnetUri = file.magnetUri - expect(file.magnetUri).to.have.lengthOf.above(2) - expect(file.torrentUrl).to.equal(`http://${attributes.account.host}/static/torrents/${videoDetails.uuid}-${file.resolution.id}.torrent`) - expect(file.fileUrl).to.equal(`http://${attributes.account.host}/static/webseed/${videoDetails.uuid}-${file.resolution.id}${extension}`) - expect(file.resolution.id).to.equal(attributeFile.resolution) - expect(file.resolution.label).to.equal(attributeFile.resolution + 'p') - - const minSize = attributeFile.size - ((10 * attributeFile.size) / 100) - const maxSize = attributeFile.size + ((10 * attributeFile.size) / 100) - expect(file.size, - 'File size for resolution ' + file.resolution.label + ' outside confidence interval (' + minSize + '> size <' + maxSize + ')') - .to.be.above(minSize).and.below(maxSize) - - { - await testImage(url, attributes.thumbnailfile || attributes.fixture, videoDetails.thumbnailPath) - } - - if (attributes.previewfile) { - await testImage(url, attributes.previewfile, videoDetails.previewPath) - } - - const torrent = await webtorrentAdd(magnetUri, true) - expect(torrent.files).to.be.an('array') - expect(torrent.files.length).to.equal(1) - expect(torrent.files[0].path).to.exist.and.to.not.equal('') - } -} - -// --------------------------------------------------------------------------- - -export { - getVideoDescription, - getVideoCategories, - getVideoLicences, - getVideoPrivacies, - getVideoLanguages, - getMyVideos, - getAccountVideos, - getVideoChannelVideos, - getVideo, - getVideoWithToken, - getVideosList, - getVideosListPagination, - getVideosListSort, - removeVideo, - getVideosListWithToken, - uploadVideo, - getVideosWithFilters, - updateVideo, - rateVideo, - viewVideo, - parseTorrentVideo, - getLocalVideos, - completeVideoCheck, - checkVideoFilesWereRemoved -} diff --git a/server/tools/peertube-get-access-token.ts b/server/tools/peertube-get-access-token.ts index eb2571a03..a68665f5b 100644 --- a/server/tools/peertube-get-access-token.ts +++ b/server/tools/peertube-get-access-token.ts @@ -6,7 +6,7 @@ import { Server, Client, User -} from '../tests/utils/index' +} from '../../shared/utils' program .option('-u, --url ', 'Server url') diff --git a/server/tools/peertube-import-videos.ts b/server/tools/peertube-import-videos.ts index 21505b79d..1fe0a9348 100644 --- a/server/tools/peertube-import-videos.ts +++ b/server/tools/peertube-import-videos.ts @@ -6,7 +6,7 @@ import { join } from 'path' import { VideoPrivacy } from '../../shared/models/videos' import { doRequestAndSaveToFile } from '../helpers/requests' import { CONSTRAINTS_FIELDS } from '../initializers' -import { getClient, getVideoCategories, login, searchVideoWithSort, uploadVideo } from '../tests/utils' +import { getClient, getVideoCategories, login, searchVideoWithSort, uploadVideo } from '../../shared/utils/index' import { truncate } from 'lodash' import * as prompt from 'prompt' import { remove } from 'fs-extra' diff --git a/server/tools/peertube-upload.ts b/server/tools/peertube-upload.ts index 6248fb47d..cc7bd9b4c 100644 --- a/server/tools/peertube-upload.ts +++ b/server/tools/peertube-upload.ts @@ -1,8 +1,8 @@ import * as program from 'commander' import { access, constants } from 'fs-extra' import { isAbsolute } from 'path' -import { getClient, login } from '../tests/utils' -import { uploadVideo } from '../tests/utils/index' +import { getClient, login } from '../../shared/utils' +import { uploadVideo } from '../../shared/utils/' import { VideoPrivacy } from '../../shared/models/videos' import { netrc, getSettings } from './cli' diff --git a/shared/utils/cli/cli.ts b/shared/utils/cli/cli.ts new file mode 100644 index 000000000..54d05e9c6 --- /dev/null +++ b/shared/utils/cli/cli.ts @@ -0,0 +1,24 @@ +import { exec } from 'child_process' + +import { ServerInfo } from '../server/servers' + +function getEnvCli (server?: ServerInfo) { + return `NODE_ENV=test NODE_APP_INSTANCE=${server.serverNumber}` +} + +async function execCLI (command: string) { + return new Promise((res, rej) => { + exec(command, (err, stdout, stderr) => { + if (err) return rej(err) + + return res(stdout) + }) + }) +} + +// --------------------------------------------------------------------------- + +export { + execCLI, + getEnvCli +} diff --git a/shared/utils/feeds/feeds.ts b/shared/utils/feeds/feeds.ts new file mode 100644 index 000000000..af6df2b20 --- /dev/null +++ b/shared/utils/feeds/feeds.ts @@ -0,0 +1,32 @@ +import * as request from 'supertest' + +type FeedType = 'videos' | 'video-comments' + +function getXMLfeed (url: string, feed: FeedType, format?: string) { + const path = '/feeds/' + feed + '.xml' + + return request(url) + .get(path) + .query((format) ? { format: format } : {}) + .set('Accept', 'application/xml') + .expect(200) + .expect('Content-Type', /xml/) +} + +function getJSONfeed (url: string, feed: FeedType, query: any = {}) { + const path = '/feeds/' + feed + '.json' + + return request(url) + .get(path) + .query(query) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +// --------------------------------------------------------------------------- + +export { + getXMLfeed, + getJSONfeed +} diff --git a/shared/utils/index.ts b/shared/utils/index.ts new file mode 100644 index 000000000..897389824 --- /dev/null +++ b/shared/utils/index.ts @@ -0,0 +1,18 @@ +export * from './server/activitypub' +export * from './cli/cli' +export * from './server/clients' +export * from './server/config' +export * from './users/login' +export * from './miscs/miscs' +export * from './server/follows' +export * from './requests/requests' +export * from './server/servers' +export * from './videos/services' +export * from './users/users' +export * from './videos/video-abuses' +export * from './videos/video-blacklist' +export * from './videos/video-channels' +export * from './videos/videos' +export * from './videos/video-change-ownership' +export * from './feeds/feeds' +export * from './search/videos' diff --git a/shared/utils/miscs/email.ts b/shared/utils/miscs/email.ts new file mode 100644 index 000000000..21accd09d --- /dev/null +++ b/shared/utils/miscs/email.ts @@ -0,0 +1,25 @@ +import * as MailDev from 'maildev' + +function mockSmtpServer (emailsCollection: object[]) { + const maildev = new MailDev({ + ip: '127.0.0.1', + smtp: 1025, + disableWeb: true, + silent: true + }) + maildev.on('new', email => emailsCollection.push(email)) + + return new Promise((res, rej) => { + maildev.listen(err => { + if (err) return rej(err) + + return res() + }) + }) +} + +// --------------------------------------------------------------------------- + +export { + mockSmtpServer +} diff --git a/shared/utils/miscs/miscs.ts b/shared/utils/miscs/miscs.ts new file mode 100644 index 000000000..589daa420 --- /dev/null +++ b/shared/utils/miscs/miscs.ts @@ -0,0 +1,101 @@ +/* tslint:disable:no-unused-expression */ + +import * as chai from 'chai' +import { isAbsolute, join } from 'path' +import * as request from 'supertest' +import * as WebTorrent from 'webtorrent' +import { pathExists, readFile } from 'fs-extra' +import * as ffmpeg from 'fluent-ffmpeg' + +const expect = chai.expect +let webtorrent = new WebTorrent() + +function immutableAssign (target: T, source: U) { + return Object.assign<{}, T, U>({}, target, source) +} + + // Default interval -> 5 minutes +function dateIsValid (dateString: string, interval = 300000) { + const dateToCheck = new Date(dateString) + const now = new Date() + + return Math.abs(now.getTime() - dateToCheck.getTime()) <= interval +} + +function wait (milliseconds: number) { + return new Promise(resolve => setTimeout(resolve, milliseconds)) +} + +function webtorrentAdd (torrent: string, refreshWebTorrent = false) { + if (refreshWebTorrent === true) webtorrent = new WebTorrent() + + return new Promise(res => webtorrent.add(torrent, res)) +} + +function root () { + // We are in server/tests/utils/miscs + return join(__dirname, '..', '..', '..', '..') +} + +async function testImage (url: string, imageName: string, imagePath: string, extension = '.jpg') { + const res = await request(url) + .get(imagePath) + .expect(200) + + const body = res.body + + const data = await readFile(join(__dirname, '..', '..', 'fixtures', imageName + extension)) + const minLength = body.length - ((20 * body.length) / 100) + const maxLength = body.length + ((20 * body.length) / 100) + + expect(data.length).to.be.above(minLength) + expect(data.length).to.be.below(maxLength) +} + +function buildAbsoluteFixturePath (path: string, customTravisPath = false) { + if (isAbsolute(path)) { + return path + } + + if (customTravisPath && process.env.TRAVIS) return join(process.env.HOME, 'fixtures', path) + + return join(__dirname, '..', '..', 'fixtures', path) +} + +async function generateHighBitrateVideo () { + const tempFixturePath = buildAbsoluteFixturePath('video_high_bitrate_1080p.mp4', true) + + const exists = await pathExists(tempFixturePath) + if (!exists) { + + // Generate a random, high bitrate video on the fly, so we don't have to include + // a large file in the repo. The video needs to have a certain minimum length so + // that FFmpeg properly applies bitrate limits. + // https://stackoverflow.com/a/15795112 + return new Promise(async (res, rej) => { + ffmpeg() + .outputOptions([ '-f rawvideo', '-video_size 1920x1080', '-i /dev/urandom' ]) + .outputOptions([ '-ac 2', '-f s16le', '-i /dev/urandom', '-t 10' ]) + .outputOptions([ '-maxrate 10M', '-bufsize 10M' ]) + .output(tempFixturePath) + .on('error', rej) + .on('end', () => res(tempFixturePath)) + .run() + }) + } + + return tempFixturePath +} + +// --------------------------------------------------------------------------- + +export { + dateIsValid, + wait, + webtorrentAdd, + immutableAssign, + testImage, + buildAbsoluteFixturePath, + root, + generateHighBitrateVideo +} diff --git a/shared/utils/overviews/overviews.ts b/shared/utils/overviews/overviews.ts new file mode 100644 index 000000000..23e3ceb1e --- /dev/null +++ b/shared/utils/overviews/overviews.ts @@ -0,0 +1,18 @@ +import { makeGetRequest } from '../requests/requests' + +function getVideosOverview (url: string, useCache = false) { + const path = '/api/v1/overviews/videos' + + const query = { + t: useCache ? undefined : new Date().getTime() + } + + return makeGetRequest({ + url, + path, + query, + statusCodeExpected: 200 + }) +} + +export { getVideosOverview } diff --git a/shared/utils/requests/check-api-params.ts b/shared/utils/requests/check-api-params.ts new file mode 100644 index 000000000..edb47e0e9 --- /dev/null +++ b/shared/utils/requests/check-api-params.ts @@ -0,0 +1,40 @@ +import { makeGetRequest } from './requests' +import { immutableAssign } from '..' + +function checkBadStartPagination (url: string, path: string, token?: string, query = {}) { + return makeGetRequest({ + url, + path, + token, + query: immutableAssign(query, { start: 'hello' }), + statusCodeExpected: 400 + }) +} + +function checkBadCountPagination (url: string, path: string, token?: string, query = {}) { + return makeGetRequest({ + url, + path, + token, + query: immutableAssign(query, { count: 'hello' }), + statusCodeExpected: 400 + }) +} + +function checkBadSortPagination (url: string, path: string, token?: string, query = {}) { + return makeGetRequest({ + url, + path, + token, + query: immutableAssign(query, { sort: 'hello' }), + statusCodeExpected: 400 + }) +} + +// --------------------------------------------------------------------------- + +export { + checkBadStartPagination, + checkBadCountPagination, + checkBadSortPagination +} diff --git a/shared/utils/requests/requests.ts b/shared/utils/requests/requests.ts new file mode 100644 index 000000000..5796540f7 --- /dev/null +++ b/shared/utils/requests/requests.ts @@ -0,0 +1,168 @@ +import * as request from 'supertest' +import { buildAbsoluteFixturePath } from '../miscs/miscs' +import { isAbsolute, join } from 'path' + +function makeGetRequest (options: { + url: string, + path: string, + query?: any, + token?: string, + statusCodeExpected?: number, + contentType?: string +}) { + if (!options.statusCodeExpected) options.statusCodeExpected = 400 + if (options.contentType === undefined) options.contentType = 'application/json' + + const req = request(options.url) + .get(options.path) + + if (options.contentType) req.set('Accept', options.contentType) + if (options.token) req.set('Authorization', 'Bearer ' + options.token) + if (options.query) req.query(options.query) + + return req.expect(options.statusCodeExpected) +} + +function makeDeleteRequest (options: { + url: string, + path: string, + token?: string, + statusCodeExpected?: number +}) { + if (!options.statusCodeExpected) options.statusCodeExpected = 400 + + const req = request(options.url) + .delete(options.path) + .set('Accept', 'application/json') + + if (options.token) req.set('Authorization', 'Bearer ' + options.token) + + return req.expect(options.statusCodeExpected) +} + +function makeUploadRequest (options: { + url: string, + method?: 'POST' | 'PUT', + path: string, + token?: string, + fields: { [ fieldName: string ]: any }, + attaches: { [ attachName: string ]: any | any[] }, + statusCodeExpected?: number +}) { + if (!options.statusCodeExpected) options.statusCodeExpected = 400 + + let req: request.Test + if (options.method === 'PUT') { + req = request(options.url).put(options.path) + } else { + req = request(options.url).post(options.path) + } + + req.set('Accept', 'application/json') + + if (options.token) req.set('Authorization', 'Bearer ' + options.token) + + Object.keys(options.fields).forEach(field => { + const value = options.fields[field] + + if (Array.isArray(value)) { + for (let i = 0; i < value.length; i++) { + req.field(field + '[' + i + ']', value[i]) + } + } else { + req.field(field, value) + } + }) + + Object.keys(options.attaches).forEach(attach => { + const value = options.attaches[attach] + if (Array.isArray(value)) { + req.attach(attach, buildAbsoluteFixturePath(value[0]), value[1]) + } else { + req.attach(attach, buildAbsoluteFixturePath(value)) + } + }) + + return req.expect(options.statusCodeExpected) +} + +function makePostBodyRequest (options: { + url: string, + path: string, + token?: string, + fields?: { [ fieldName: string ]: any }, + statusCodeExpected?: number +}) { + if (!options.fields) options.fields = {} + if (!options.statusCodeExpected) options.statusCodeExpected = 400 + + const req = request(options.url) + .post(options.path) + .set('Accept', 'application/json') + + if (options.token) req.set('Authorization', 'Bearer ' + options.token) + + return req.send(options.fields) + .expect(options.statusCodeExpected) +} + +function makePutBodyRequest (options: { + url: string, + path: string, + token?: string, + fields: { [ fieldName: string ]: any }, + statusCodeExpected?: number +}) { + if (!options.statusCodeExpected) options.statusCodeExpected = 400 + + const req = request(options.url) + .put(options.path) + .set('Accept', 'application/json') + + if (options.token) req.set('Authorization', 'Bearer ' + options.token) + + return req.send(options.fields) + .expect(options.statusCodeExpected) +} + +function makeHTMLRequest (url: string, path: string) { + return request(url) + .get(path) + .set('Accept', 'text/html') + .expect(200) +} + +function updateAvatarRequest (options: { + url: string, + path: string, + accessToken: string, + fixture: string +}) { + let filePath = '' + if (isAbsolute(options.fixture)) { + filePath = options.fixture + } else { + filePath = join(__dirname, '..', '..', 'fixtures', options.fixture) + } + + return makeUploadRequest({ + url: options.url, + path: options.path, + token: options.accessToken, + fields: {}, + attaches: { avatarfile: filePath }, + statusCodeExpected: 200 + }) +} + +// --------------------------------------------------------------------------- + +export { + makeHTMLRequest, + makeGetRequest, + makeUploadRequest, + makePostBodyRequest, + makePutBodyRequest, + makeDeleteRequest, + updateAvatarRequest +} diff --git a/shared/utils/search/video-channels.ts b/shared/utils/search/video-channels.ts new file mode 100644 index 000000000..0532134ae --- /dev/null +++ b/shared/utils/search/video-channels.ts @@ -0,0 +1,22 @@ +import { makeGetRequest } from '../requests/requests' + +function searchVideoChannel (url: string, search: string, token?: string, statusCodeExpected = 200) { + const path = '/api/v1/search/video-channels' + + return makeGetRequest({ + url, + path, + query: { + sort: '-createdAt', + search + }, + token, + statusCodeExpected + }) +} + +// --------------------------------------------------------------------------- + +export { + searchVideoChannel +} diff --git a/shared/utils/search/videos.ts b/shared/utils/search/videos.ts new file mode 100644 index 000000000..3a0c10e42 --- /dev/null +++ b/shared/utils/search/videos.ts @@ -0,0 +1,77 @@ +/* tslint:disable:no-unused-expression */ + +import * as request from 'supertest' +import { VideosSearchQuery } from '../../../../shared/models/search' +import { immutableAssign } from '..' + +function searchVideo (url: string, search: string) { + const path = '/api/v1/search/videos' + const req = request(url) + .get(path) + .query({ sort: '-publishedAt', search }) + .set('Accept', 'application/json') + + return req.expect(200) + .expect('Content-Type', /json/) +} + +function searchVideoWithToken (url: string, search: string, token: string, query: { nsfw?: boolean } = {}) { + const path = '/api/v1/search/videos' + const req = request(url) + .get(path) + .set('Authorization', 'Bearer ' + token) + .query(immutableAssign(query, { sort: '-publishedAt', search })) + .set('Accept', 'application/json') + + return req.expect(200) + .expect('Content-Type', /json/) +} + +function searchVideoWithPagination (url: string, search: string, start: number, count: number, sort?: string) { + const path = '/api/v1/search/videos' + + const req = request(url) + .get(path) + .query({ start }) + .query({ search }) + .query({ count }) + + if (sort) req.query({ sort }) + + return req.set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +function searchVideoWithSort (url: string, search: string, sort: string) { + const path = '/api/v1/search/videos' + + return request(url) + .get(path) + .query({ search }) + .query({ sort }) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +function advancedVideosSearch (url: string, options: VideosSearchQuery) { + const path = '/api/v1/search/videos' + + return request(url) + .get(path) + .query(options) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +// --------------------------------------------------------------------------- + +export { + searchVideo, + advancedVideosSearch, + searchVideoWithToken, + searchVideoWithPagination, + searchVideoWithSort +} diff --git a/shared/utils/server/activitypub.ts b/shared/utils/server/activitypub.ts new file mode 100644 index 000000000..cf3c1c3b3 --- /dev/null +++ b/shared/utils/server/activitypub.ts @@ -0,0 +1,15 @@ +import * as request from 'supertest' + +function makeActivityPubGetRequest (url: string, path: string) { + return request(url) + .get(path) + .set('Accept', 'application/activity+json,text/html;q=0.9,\\*/\\*;q=0.8') + .expect(200) + .expect('Content-Type', /json/) +} + +// --------------------------------------------------------------------------- + +export { + makeActivityPubGetRequest +} diff --git a/shared/utils/server/clients.ts b/shared/utils/server/clients.ts new file mode 100644 index 000000000..273aac747 --- /dev/null +++ b/shared/utils/server/clients.ts @@ -0,0 +1,19 @@ +import * as request from 'supertest' +import * as urlUtil from 'url' + +function getClient (url: string) { + const path = '/api/v1/oauth-clients/local' + + return request(url) + .get(path) + .set('Host', urlUtil.parse(url).host) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +// --------------------------------------------------------------------------- + +export { + getClient +} diff --git a/shared/utils/server/config.ts b/shared/utils/server/config.ts new file mode 100644 index 000000000..b85e02ab7 --- /dev/null +++ b/shared/utils/server/config.ts @@ -0,0 +1,135 @@ +import { makeDeleteRequest, makeGetRequest, makePutBodyRequest } from '../' +import { CustomConfig } from '../../../../shared/models/server/custom-config.model' + +function getConfig (url: string) { + const path = '/api/v1/config' + + return makeGetRequest({ + url, + path, + statusCodeExpected: 200 + }) +} + +function getAbout (url: string) { + const path = '/api/v1/config/about' + + return makeGetRequest({ + url, + path, + statusCodeExpected: 200 + }) +} + +function getCustomConfig (url: string, token: string, statusCodeExpected = 200) { + const path = '/api/v1/config/custom' + + return makeGetRequest({ + url, + token, + path, + statusCodeExpected + }) +} + +function updateCustomConfig (url: string, token: string, newCustomConfig: CustomConfig, statusCodeExpected = 200) { + const path = '/api/v1/config/custom' + + return makePutBodyRequest({ + url, + token, + path, + fields: newCustomConfig, + statusCodeExpected + }) +} + +function updateCustomSubConfig (url: string, token: string, newConfig: any) { + const updateParams: CustomConfig = { + instance: { + name: 'PeerTube updated', + shortDescription: 'my short description', + description: 'my super description', + terms: 'my super terms', + defaultClientRoute: '/videos/recently-added', + defaultNSFWPolicy: 'blur', + customizations: { + javascript: 'alert("coucou")', + css: 'body { background-color: red; }' + } + }, + services: { + twitter: { + username: '@MySuperUsername', + whitelisted: true + } + }, + cache: { + previews: { + size: 2 + }, + captions: { + size: 3 + } + }, + signup: { + enabled: false, + limit: 5, + requiresEmailVerification: false + }, + admin: { + email: 'superadmin1@example.com' + }, + user: { + videoQuota: 5242881, + videoQuotaDaily: 318742 + }, + transcoding: { + enabled: true, + threads: 1, + resolutions: { + '240p': false, + '360p': true, + '480p': true, + '720p': false, + '1080p': false + } + }, + import: { + videos: { + http: { + enabled: false + }, + torrent: { + enabled: false + } + } + } + } + + Object.assign(updateParams, newConfig) + + return updateCustomConfig(url, token, updateParams) +} + +function deleteCustomConfig (url: string, token: string, statusCodeExpected = 200) { + const path = '/api/v1/config/custom' + + return makeDeleteRequest({ + url, + token, + path, + statusCodeExpected + }) +} + +// --------------------------------------------------------------------------- + +export { + getConfig, + getCustomConfig, + updateCustomConfig, + getAbout, + deleteCustomConfig, + updateCustomSubConfig +} diff --git a/shared/utils/server/follows.ts b/shared/utils/server/follows.ts new file mode 100644 index 000000000..7741757a6 --- /dev/null +++ b/shared/utils/server/follows.ts @@ -0,0 +1,79 @@ +import * as request from 'supertest' +import { ServerInfo } from './servers' +import { waitJobs } from './jobs' + +function getFollowersListPaginationAndSort (url: string, start: number, count: number, sort: string, search?: string) { + const path = '/api/v1/server/followers' + + return request(url) + .get(path) + .query({ start }) + .query({ count }) + .query({ sort }) + .query({ search }) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +function getFollowingListPaginationAndSort (url: string, start: number, count: number, sort: string, search?: string) { + const path = '/api/v1/server/following' + + return request(url) + .get(path) + .query({ start }) + .query({ count }) + .query({ sort }) + .query({ search }) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +async function follow (follower: string, following: string[], accessToken: string, expectedStatus = 204) { + const path = '/api/v1/server/following' + + const followingHosts = following.map(f => f.replace(/^http:\/\//, '')) + const res = await request(follower) + .post(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .send({ 'hosts': followingHosts }) + .expect(expectedStatus) + + return res +} + +async function unfollow (url: string, accessToken: string, target: ServerInfo, expectedStatus = 204) { + const path = '/api/v1/server/following/' + target.host + + const res = await request(url) + .delete(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(expectedStatus) + + return res +} + +async function doubleFollow (server1: ServerInfo, server2: ServerInfo) { + await Promise.all([ + follow(server1.url, [ server2.url ], server1.accessToken), + follow(server2.url, [ server1.url ], server2.accessToken) + ]) + + // Wait request propagation + await waitJobs([ server1, server2 ]) + + return true +} + +// --------------------------------------------------------------------------- + +export { + getFollowersListPaginationAndSort, + getFollowingListPaginationAndSort, + unfollow, + follow, + doubleFollow +} diff --git a/shared/utils/server/jobs.ts b/shared/utils/server/jobs.ts new file mode 100644 index 000000000..4c02cace5 --- /dev/null +++ b/shared/utils/server/jobs.ts @@ -0,0 +1,77 @@ +import * as request from 'supertest' +import { Job, JobState } from '../../../../shared/models' +import { ServerInfo, wait } from '../index' + +function getJobsList (url: string, accessToken: string, state: JobState) { + const path = '/api/v1/jobs/' + state + + return request(url) + .get(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(200) + .expect('Content-Type', /json/) +} + +function getJobsListPaginationAndSort (url: string, accessToken: string, state: JobState, start: number, count: number, sort: string) { + const path = '/api/v1/jobs/' + state + + return request(url) + .get(path) + .query({ start }) + .query({ count }) + .query({ sort }) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(200) + .expect('Content-Type', /json/) +} + +async function waitJobs (serversArg: ServerInfo[] | ServerInfo) { + let servers: ServerInfo[] + + if (Array.isArray(serversArg) === false) servers = [ serversArg as ServerInfo ] + else servers = serversArg as ServerInfo[] + + const states: JobState[] = [ 'waiting', 'active', 'delayed' ] + const tasks: Promise[] = [] + let pendingRequests: boolean + + do { + pendingRequests = false + + // Check if each server has pending request + for (const server of servers) { + for (const state of states) { + const p = getJobsListPaginationAndSort(server.url, server.accessToken, state, 0, 10, '-createdAt') + .then(res => res.body.data) + .then((jobs: Job[]) => jobs.filter(j => j.type !== 'videos-views')) + .then(jobs => { + if (jobs.length !== 0) pendingRequests = true + }) + tasks.push(p) + } + } + + await Promise.all(tasks) + + // Retry, in case of new jobs were created + if (pendingRequests === false) { + await wait(1000) + + await Promise.all(tasks) + } + + if (pendingRequests) { + await wait(1000) + } + } while (pendingRequests) +} + +// --------------------------------------------------------------------------- + +export { + getJobsList, + waitJobs, + getJobsListPaginationAndSort +} diff --git a/shared/utils/server/redundancy.ts b/shared/utils/server/redundancy.ts new file mode 100644 index 000000000..c39ff2c8b --- /dev/null +++ b/shared/utils/server/redundancy.ts @@ -0,0 +1,17 @@ +import { makePutBodyRequest } from '../requests/requests' + +async function updateRedundancy (url: string, accessToken: string, host: string, redundancyAllowed: boolean, expectedStatus = 204) { + const path = '/api/v1/server/redundancy/' + host + + return makePutBodyRequest({ + url, + path, + token: accessToken, + fields: { redundancyAllowed }, + statusCodeExpected: expectedStatus + }) +} + +export { + updateRedundancy +} diff --git a/shared/utils/server/servers.ts b/shared/utils/server/servers.ts new file mode 100644 index 000000000..3c946db27 --- /dev/null +++ b/shared/utils/server/servers.ts @@ -0,0 +1,185 @@ +import { ChildProcess, exec, fork } from 'child_process' +import { join } from 'path' +import { root, wait } from '../miscs/miscs' +import { readFile } from 'fs-extra' + +interface ServerInfo { + app: ChildProcess, + url: string + host: string + serverNumber: number + + client: { + id: string, + secret: string + } + + user: { + username: string, + password: string, + email?: string + } + + accessToken?: string + + video?: { + id: number + uuid: string + name: string + account: { + name: string + } + } + + remoteVideo?: { + id: number + uuid: string + } +} + +function flushAndRunMultipleServers (totalServers: number, configOverride?: Object) { + let apps = [] + let i = 0 + + return new Promise(res => { + function anotherServerDone (serverNumber, app) { + apps[serverNumber - 1] = app + i++ + if (i === totalServers) { + return res(apps) + } + } + + flushTests() + .then(() => { + for (let j = 1; j <= totalServers; j++) { + runServer(j, configOverride).then(app => anotherServerDone(j, app)) + } + }) + }) +} + +function flushTests () { + return new Promise((res, rej) => { + return exec('npm run clean:server:test', err => { + if (err) return rej(err) + + return res() + }) + }) +} + +function runServer (serverNumber: number, configOverride?: Object) { + const server: ServerInfo = { + app: null, + serverNumber: serverNumber, + url: `http://localhost:${9000 + serverNumber}`, + host: `localhost:${9000 + serverNumber}`, + client: { + id: null, + secret: null + }, + user: { + username: null, + password: null + } + } + + // These actions are async so we need to be sure that they have both been done + const serverRunString = { + 'Server listening': false + } + const key = 'Database peertube_test' + serverNumber + ' is ready' + serverRunString[key] = false + + const regexps = { + client_id: 'Client id: (.+)', + client_secret: 'Client secret: (.+)', + user_username: 'Username: (.+)', + user_password: 'User password: (.+)' + } + + // Share the environment + const env = Object.create(process.env) + env['NODE_ENV'] = 'test' + env['NODE_APP_INSTANCE'] = serverNumber.toString() + + if (configOverride !== undefined) { + env['NODE_CONFIG'] = JSON.stringify(configOverride) + } + + const options = { + silent: true, + env: env, + detached: true + } + + return new Promise(res => { + server.app = fork(join(__dirname, '..', '..', '..', '..', 'dist', 'server.js'), [], options) + server.app.stdout.on('data', function onStdout (data) { + let dontContinue = false + + // Capture things if we want to + for (const key of Object.keys(regexps)) { + const regexp = regexps[key] + const matches = data.toString().match(regexp) + if (matches !== null) { + if (key === 'client_id') server.client.id = matches[1] + else if (key === 'client_secret') server.client.secret = matches[1] + else if (key === 'user_username') server.user.username = matches[1] + else if (key === 'user_password') server.user.password = matches[1] + } + } + + // Check if all required sentences are here + for (const key of Object.keys(serverRunString)) { + if (data.toString().indexOf(key) !== -1) serverRunString[key] = true + if (serverRunString[key] === false) dontContinue = true + } + + // If no, there is maybe one thing not already initialized (client/user credentials generation...) + if (dontContinue === true) return + + server.app.stdout.removeListener('data', onStdout) + res(server) + }) + }) +} + +async function reRunServer (server: ServerInfo, configOverride?: any) { + const newServer = await runServer(server.serverNumber, configOverride) + server.app = newServer.app + + return server +} + +function killallServers (servers: ServerInfo[]) { + for (const server of servers) { + process.kill(-server.app.pid) + } +} + +async function waitUntilLog (server: ServerInfo, str: string, count = 1) { + const logfile = join(root(), 'test' + server.serverNumber, 'logs/peertube.log') + + while (true) { + const buf = await readFile(logfile) + + const matches = buf.toString().match(new RegExp(str, 'g')) + if (matches && matches.length === count) return + + await wait(1000) + } +} + +// --------------------------------------------------------------------------- + +export { + ServerInfo, + flushAndRunMultipleServers, + flushTests, + runServer, + killallServers, + reRunServer, + waitUntilLog +} diff --git a/shared/utils/server/stats.ts b/shared/utils/server/stats.ts new file mode 100644 index 000000000..01989d952 --- /dev/null +++ b/shared/utils/server/stats.ts @@ -0,0 +1,22 @@ +import { makeGetRequest } from '../' + +function getStats (url: string, useCache = false) { + const path = '/api/v1/server/stats' + + const query = { + t: useCache ? undefined : new Date().getTime() + } + + return makeGetRequest({ + url, + path, + query, + statusCodeExpected: 200 + }) +} + +// --------------------------------------------------------------------------- + +export { + getStats +} diff --git a/shared/utils/users/accounts.ts b/shared/utils/users/accounts.ts new file mode 100644 index 000000000..f82b8d906 --- /dev/null +++ b/shared/utils/users/accounts.ts @@ -0,0 +1,63 @@ +/* tslint:disable:no-unused-expression */ + +import { expect } from 'chai' +import { existsSync, readdir } from 'fs-extra' +import { join } from 'path' +import { Account } from '../../../../shared/models/actors' +import { root } from '../index' +import { makeGetRequest } from '../requests/requests' + +function getAccountsList (url: string, sort = '-createdAt', statusCodeExpected = 200) { + const path = '/api/v1/accounts' + + return makeGetRequest({ + url, + query: { sort }, + path, + statusCodeExpected + }) +} + +function getAccount (url: string, accountName: string, statusCodeExpected = 200) { + const path = '/api/v1/accounts/' + accountName + + return makeGetRequest({ + url, + path, + statusCodeExpected + }) +} + +async function expectAccountFollows (url: string, nameWithDomain: string, followersCount: number, followingCount: number) { + const res = await getAccountsList(url) + const account = res.body.data.find((a: Account) => a.name + '@' + a.host === nameWithDomain) + + const message = `${nameWithDomain} on ${url}` + expect(account.followersCount).to.equal(followersCount, message) + expect(account.followingCount).to.equal(followingCount, message) +} + +async function checkActorFilesWereRemoved (actorUUID: string, serverNumber: number) { + const testDirectory = 'test' + serverNumber + + for (const directory of [ 'avatars' ]) { + const directoryPath = join(root(), testDirectory, directory) + + const directoryExists = existsSync(directoryPath) + expect(directoryExists).to.be.true + + const files = await readdir(directoryPath) + for (const file of files) { + expect(file).to.not.contain(actorUUID) + } + } +} + +// --------------------------------------------------------------------------- + +export { + getAccount, + expectAccountFollows, + getAccountsList, + checkActorFilesWereRemoved +} diff --git a/shared/utils/users/blocklist.ts b/shared/utils/users/blocklist.ts new file mode 100644 index 000000000..35b537571 --- /dev/null +++ b/shared/utils/users/blocklist.ts @@ -0,0 +1,198 @@ +/* tslint:disable:no-unused-expression */ + +import { makeDeleteRequest, makePostBodyRequest } from '../index' +import { makeGetRequest } from '../requests/requests' + +function getAccountBlocklistByAccount ( + url: string, + token: string, + start: number, + count: number, + sort = '-createdAt', + statusCodeExpected = 200 +) { + const path = '/api/v1/users/me/blocklist/accounts' + + return makeGetRequest({ + url, + token, + query: { start, count, sort }, + path, + statusCodeExpected + }) +} + +function addAccountToAccountBlocklist (url: string, token: string, accountToBlock: string, statusCodeExpected = 204) { + const path = '/api/v1/users/me/blocklist/accounts' + + return makePostBodyRequest({ + url, + path, + token, + fields: { + accountName: accountToBlock + }, + statusCodeExpected + }) +} + +function removeAccountFromAccountBlocklist (url: string, token: string, accountToUnblock: string, statusCodeExpected = 204) { + const path = '/api/v1/users/me/blocklist/accounts/' + accountToUnblock + + return makeDeleteRequest({ + url, + path, + token, + statusCodeExpected + }) +} + +function getServerBlocklistByAccount ( + url: string, + token: string, + start: number, + count: number, + sort = '-createdAt', + statusCodeExpected = 200 +) { + const path = '/api/v1/users/me/blocklist/servers' + + return makeGetRequest({ + url, + token, + query: { start, count, sort }, + path, + statusCodeExpected + }) +} + +function addServerToAccountBlocklist (url: string, token: string, serverToBlock: string, statusCodeExpected = 204) { + const path = '/api/v1/users/me/blocklist/servers' + + return makePostBodyRequest({ + url, + path, + token, + fields: { + host: serverToBlock + }, + statusCodeExpected + }) +} + +function removeServerFromAccountBlocklist (url: string, token: string, serverToBlock: string, statusCodeExpected = 204) { + const path = '/api/v1/users/me/blocklist/servers/' + serverToBlock + + return makeDeleteRequest({ + url, + path, + token, + statusCodeExpected + }) +} + +function getAccountBlocklistByServer ( + url: string, + token: string, + start: number, + count: number, + sort = '-createdAt', + statusCodeExpected = 200 +) { + const path = '/api/v1/server/blocklist/accounts' + + return makeGetRequest({ + url, + token, + query: { start, count, sort }, + path, + statusCodeExpected + }) +} + +function addAccountToServerBlocklist (url: string, token: string, accountToBlock: string, statusCodeExpected = 204) { + const path = '/api/v1/server/blocklist/accounts' + + return makePostBodyRequest({ + url, + path, + token, + fields: { + accountName: accountToBlock + }, + statusCodeExpected + }) +} + +function removeAccountFromServerBlocklist (url: string, token: string, accountToUnblock: string, statusCodeExpected = 204) { + const path = '/api/v1/server/blocklist/accounts/' + accountToUnblock + + return makeDeleteRequest({ + url, + path, + token, + statusCodeExpected + }) +} + +function getServerBlocklistByServer ( + url: string, + token: string, + start: number, + count: number, + sort = '-createdAt', + statusCodeExpected = 200 +) { + const path = '/api/v1/server/blocklist/servers' + + return makeGetRequest({ + url, + token, + query: { start, count, sort }, + path, + statusCodeExpected + }) +} + +function addServerToServerBlocklist (url: string, token: string, serverToBlock: string, statusCodeExpected = 204) { + const path = '/api/v1/server/blocklist/servers' + + return makePostBodyRequest({ + url, + path, + token, + fields: { + host: serverToBlock + }, + statusCodeExpected + }) +} + +function removeServerFromServerBlocklist (url: string, token: string, serverToBlock: string, statusCodeExpected = 204) { + const path = '/api/v1/server/blocklist/servers/' + serverToBlock + + return makeDeleteRequest({ + url, + path, + token, + statusCodeExpected + }) +} + +// --------------------------------------------------------------------------- + +export { + getAccountBlocklistByAccount, + addAccountToAccountBlocklist, + removeAccountFromAccountBlocklist, + getServerBlocklistByAccount, + addServerToAccountBlocklist, + removeServerFromAccountBlocklist, + + getAccountBlocklistByServer, + addAccountToServerBlocklist, + removeAccountFromServerBlocklist, + getServerBlocklistByServer, + addServerToServerBlocklist, + removeServerFromServerBlocklist +} diff --git a/shared/utils/users/login.ts b/shared/utils/users/login.ts new file mode 100644 index 000000000..ddeb9df2a --- /dev/null +++ b/shared/utils/users/login.ts @@ -0,0 +1,62 @@ +import * as request from 'supertest' + +import { ServerInfo } from '../server/servers' + +type Client = { id: string, secret: string } +type User = { username: string, password: string } +type Server = { url: string, client: Client, user: User } + +function login (url: string, client: Client, user: User, expectedStatus = 200) { + const path = '/api/v1/users/token' + + const body = { + client_id: client.id, + client_secret: client.secret, + username: user.username, + password: user.password, + response_type: 'code', + grant_type: 'password', + scope: 'upload' + } + + return request(url) + .post(path) + .type('form') + .send(body) + .expect(expectedStatus) +} + +async function serverLogin (server: Server) { + const res = await login(server.url, server.client, server.user, 200) + + return res.body.access_token as string +} + +async function userLogin (server: Server, user: User, expectedStatus = 200) { + const res = await login(server.url, server.client, user, expectedStatus) + + return res.body.access_token as string +} + +function setAccessTokensToServers (servers: ServerInfo[]) { + const tasks: Promise[] = [] + + for (const server of servers) { + const p = serverLogin(server).then(t => server.accessToken = t) + tasks.push(p) + } + + return Promise.all(tasks) +} + +// --------------------------------------------------------------------------- + +export { + login, + serverLogin, + userLogin, + setAccessTokensToServers, + Server, + Client, + User +} diff --git a/shared/utils/users/user-subscriptions.ts b/shared/utils/users/user-subscriptions.ts new file mode 100644 index 000000000..b0e7da7cc --- /dev/null +++ b/shared/utils/users/user-subscriptions.ts @@ -0,0 +1,82 @@ +import { makeDeleteRequest, makeGetRequest, makePostBodyRequest } from '../' + +function addUserSubscription (url: string, token: string, targetUri: string, statusCodeExpected = 204) { + const path = '/api/v1/users/me/subscriptions' + + return makePostBodyRequest({ + url, + path, + token, + statusCodeExpected, + fields: { uri: targetUri } + }) +} + +function listUserSubscriptions (url: string, token: string, sort = '-createdAt', statusCodeExpected = 200) { + const path = '/api/v1/users/me/subscriptions' + + return makeGetRequest({ + url, + path, + token, + statusCodeExpected, + query: { sort } + }) +} + +function listUserSubscriptionVideos (url: string, token: string, sort = '-createdAt', statusCodeExpected = 200) { + const path = '/api/v1/users/me/subscriptions/videos' + + return makeGetRequest({ + url, + path, + token, + statusCodeExpected, + query: { sort } + }) +} + +function getUserSubscription (url: string, token: string, uri: string, statusCodeExpected = 200) { + const path = '/api/v1/users/me/subscriptions/' + uri + + return makeGetRequest({ + url, + path, + token, + statusCodeExpected + }) +} + +function removeUserSubscription (url: string, token: string, uri: string, statusCodeExpected = 204) { + const path = '/api/v1/users/me/subscriptions/' + uri + + return makeDeleteRequest({ + url, + path, + token, + statusCodeExpected + }) +} + +function areSubscriptionsExist (url: string, token: string, uris: string[], statusCodeExpected = 200) { + const path = '/api/v1/users/me/subscriptions/exist' + + return makeGetRequest({ + url, + path, + query: { 'uris[]': uris }, + token, + statusCodeExpected + }) +} + +// --------------------------------------------------------------------------- + +export { + areSubscriptionsExist, + addUserSubscription, + listUserSubscriptions, + getUserSubscription, + listUserSubscriptionVideos, + removeUserSubscription +} diff --git a/shared/utils/users/users.ts b/shared/utils/users/users.ts new file mode 100644 index 000000000..1b385aaf7 --- /dev/null +++ b/shared/utils/users/users.ts @@ -0,0 +1,296 @@ +import * as request from 'supertest' +import { makePostBodyRequest, makePutBodyRequest, updateAvatarRequest } from '../' + +import { UserRole } from '../../index' +import { NSFWPolicyType } from '../../models/videos/nsfw-policy.type' + +function createUser ( + url: string, + accessToken: string, + username: string, + password: string, + videoQuota = 1000000, + videoQuotaDaily = -1, + role: UserRole = UserRole.USER, + specialStatus = 200 +) { + const path = '/api/v1/users' + const body = { + username, + password, + role, + email: username + '@example.com', + videoQuota, + videoQuotaDaily + } + + return request(url) + .post(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .send(body) + .expect(specialStatus) +} + +function registerUser (url: string, username: string, password: string, specialStatus = 204) { + const path = '/api/v1/users/register' + const body = { + username, + password, + email: username + '@example.com' + } + + return request(url) + .post(path) + .set('Accept', 'application/json') + .send(body) + .expect(specialStatus) +} + +function getMyUserInformation (url: string, accessToken: string, specialStatus = 200) { + const path = '/api/v1/users/me' + + return request(url) + .get(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(specialStatus) + .expect('Content-Type', /json/) +} + +function deleteMe (url: string, accessToken: string, specialStatus = 204) { + const path = '/api/v1/users/me' + + return request(url) + .delete(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(specialStatus) +} + +function getMyUserVideoQuotaUsed (url: string, accessToken: string, specialStatus = 200) { + const path = '/api/v1/users/me/video-quota-used' + + return request(url) + .get(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(specialStatus) + .expect('Content-Type', /json/) +} + +function getUserInformation (url: string, accessToken: string, userId: number) { + const path = '/api/v1/users/' + userId + + return request(url) + .get(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(200) + .expect('Content-Type', /json/) +} + +function getMyUserVideoRating (url: string, accessToken: string, videoId: number | string, specialStatus = 200) { + const path = '/api/v1/users/me/videos/' + videoId + '/rating' + + return request(url) + .get(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(specialStatus) + .expect('Content-Type', /json/) +} + +function getUsersList (url: string, accessToken: string) { + const path = '/api/v1/users' + + return request(url) + .get(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(200) + .expect('Content-Type', /json/) +} + +function getUsersListPaginationAndSort (url: string, accessToken: string, start: number, count: number, sort: string, search?: string) { + const path = '/api/v1/users' + + return request(url) + .get(path) + .query({ start }) + .query({ count }) + .query({ sort }) + .query({ search }) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(200) + .expect('Content-Type', /json/) +} + +function removeUser (url: string, userId: number | string, accessToken: string, expectedStatus = 204) { + const path = '/api/v1/users' + + return request(url) + .delete(path + '/' + userId) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(expectedStatus) +} + +function blockUser (url: string, userId: number | string, accessToken: string, expectedStatus = 204, reason?: string) { + const path = '/api/v1/users' + let body: any + if (reason) body = { reason } + + return request(url) + .post(path + '/' + userId + '/block') + .send(body) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(expectedStatus) +} + +function unblockUser (url: string, userId: number | string, accessToken: string, expectedStatus = 204) { + const path = '/api/v1/users' + + return request(url) + .post(path + '/' + userId + '/unblock') + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(expectedStatus) +} + +function updateMyUser (options: { + url: string + accessToken: string, + currentPassword?: string, + newPassword?: string, + nsfwPolicy?: NSFWPolicyType, + email?: string, + autoPlayVideo?: boolean + displayName?: string, + description?: string +}) { + const path = '/api/v1/users/me' + + const toSend = {} + if (options.currentPassword !== undefined && options.currentPassword !== null) toSend['currentPassword'] = options.currentPassword + if (options.newPassword !== undefined && options.newPassword !== null) toSend['password'] = options.newPassword + if (options.nsfwPolicy !== undefined && options.nsfwPolicy !== null) toSend['nsfwPolicy'] = options.nsfwPolicy + if (options.autoPlayVideo !== undefined && options.autoPlayVideo !== null) toSend['autoPlayVideo'] = options.autoPlayVideo + if (options.email !== undefined && options.email !== null) toSend['email'] = options.email + if (options.description !== undefined && options.description !== null) toSend['description'] = options.description + if (options.displayName !== undefined && options.displayName !== null) toSend['displayName'] = options.displayName + + return makePutBodyRequest({ + url: options.url, + path, + token: options.accessToken, + fields: toSend, + statusCodeExpected: 204 + }) +} + +function updateMyAvatar (options: { + url: string, + accessToken: string, + fixture: string +}) { + const path = '/api/v1/users/me/avatar/pick' + + return updateAvatarRequest(Object.assign(options, { path })) +} + +function updateUser (options: { + url: string + userId: number, + accessToken: string, + email?: string, + videoQuota?: number, + videoQuotaDaily?: number, + role?: UserRole +}) { + const path = '/api/v1/users/' + options.userId + + const toSend = {} + if (options.email !== undefined && options.email !== null) toSend['email'] = options.email + if (options.videoQuota !== undefined && options.videoQuota !== null) toSend['videoQuota'] = options.videoQuota + if (options.videoQuotaDaily !== undefined && options.videoQuotaDaily !== null) toSend['videoQuotaDaily'] = options.videoQuotaDaily + if (options.role !== undefined && options.role !== null) toSend['role'] = options.role + + return makePutBodyRequest({ + url: options.url, + path, + token: options.accessToken, + fields: toSend, + statusCodeExpected: 204 + }) +} + +function askResetPassword (url: string, email: string) { + const path = '/api/v1/users/ask-reset-password' + + return makePostBodyRequest({ + url, + path, + fields: { email }, + statusCodeExpected: 204 + }) +} + +function resetPassword (url: string, userId: number, verificationString: string, password: string, statusCodeExpected = 204) { + const path = '/api/v1/users/' + userId + '/reset-password' + + return makePostBodyRequest({ + url, + path, + fields: { password, verificationString }, + statusCodeExpected + }) +} + +function askSendVerifyEmail (url: string, email: string) { + const path = '/api/v1/users/ask-send-verify-email' + + return makePostBodyRequest({ + url, + path, + fields: { email }, + statusCodeExpected: 204 + }) +} + +function verifyEmail (url: string, userId: number, verificationString: string, statusCodeExpected = 204) { + const path = '/api/v1/users/' + userId + '/verify-email' + + return makePostBodyRequest({ + url, + path, + fields: { verificationString }, + statusCodeExpected + }) +} + +// --------------------------------------------------------------------------- + +export { + createUser, + registerUser, + getMyUserInformation, + getMyUserVideoRating, + deleteMe, + getMyUserVideoQuotaUsed, + getUsersList, + getUsersListPaginationAndSort, + removeUser, + updateUser, + updateMyUser, + getUserInformation, + blockUser, + unblockUser, + askResetPassword, + resetPassword, + updateMyAvatar, + askSendVerifyEmail, + verifyEmail +} diff --git a/shared/utils/videos/services.ts b/shared/utils/videos/services.ts new file mode 100644 index 000000000..1a53dd4cf --- /dev/null +++ b/shared/utils/videos/services.ts @@ -0,0 +1,23 @@ +import * as request from 'supertest' + +function getOEmbed (url: string, oembedUrl: string, format?: string, maxHeight?: number, maxWidth?: number) { + const path = '/services/oembed' + const query = { + url: oembedUrl, + format, + maxheight: maxHeight, + maxwidth: maxWidth + } + + return request(url) + .get(path) + .query(query) + .set('Accept', 'application/json') + .expect(200) +} + +// --------------------------------------------------------------------------- + +export { + getOEmbed +} diff --git a/shared/utils/videos/video-abuses.ts b/shared/utils/videos/video-abuses.ts new file mode 100644 index 000000000..14907e6a0 --- /dev/null +++ b/shared/utils/videos/video-abuses.ts @@ -0,0 +1,65 @@ +import * as request from 'supertest' +import { VideoAbuseUpdate } from '../../../../shared/models/videos/abuse/video-abuse-update.model' +import { makeDeleteRequest, makePutBodyRequest } from '..' + +function reportVideoAbuse (url: string, token: string, videoId: number | string, reason: string, specialStatus = 200) { + const path = '/api/v1/videos/' + videoId + '/abuse' + + return request(url) + .post(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .send({ reason }) + .expect(specialStatus) +} + +function getVideoAbusesList (url: string, token: string) { + const path = '/api/v1/videos/abuse' + + return request(url) + .get(path) + .query({ sort: 'createdAt' }) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .expect(200) + .expect('Content-Type', /json/) +} + +function updateVideoAbuse ( + url: string, + token: string, + videoId: string | number, + videoAbuseId: number, + body: VideoAbuseUpdate, + statusCodeExpected = 204 +) { + const path = '/api/v1/videos/' + videoId + '/abuse/' + videoAbuseId + + return makePutBodyRequest({ + url, + token, + path, + fields: body, + statusCodeExpected + }) +} + +function deleteVideoAbuse (url: string, token: string, videoId: string | number, videoAbuseId: number, statusCodeExpected = 204) { + const path = '/api/v1/videos/' + videoId + '/abuse/' + videoAbuseId + + return makeDeleteRequest({ + url, + token, + path, + statusCodeExpected + }) +} + +// --------------------------------------------------------------------------- + +export { + reportVideoAbuse, + getVideoAbusesList, + updateVideoAbuse, + deleteVideoAbuse +} diff --git a/shared/utils/videos/video-blacklist.ts b/shared/utils/videos/video-blacklist.ts new file mode 100644 index 000000000..2c176fde0 --- /dev/null +++ b/shared/utils/videos/video-blacklist.ts @@ -0,0 +1,67 @@ +import * as request from 'supertest' + +function addVideoToBlacklist (url: string, token: string, videoId: number | string, reason?: string, specialStatus = 204) { + const path = '/api/v1/videos/' + videoId + '/blacklist' + + return request(url) + .post(path) + .send({ reason }) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .expect(specialStatus) +} + +function updateVideoBlacklist (url: string, token: string, videoId: number, reason?: string, specialStatus = 204) { + const path = '/api/v1/videos/' + videoId + '/blacklist' + + return request(url) + .put(path) + .send({ reason }) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .expect(specialStatus) +} + +function removeVideoFromBlacklist (url: string, token: string, videoId: number | string, specialStatus = 204) { + const path = '/api/v1/videos/' + videoId + '/blacklist' + + return request(url) + .delete(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .expect(specialStatus) +} + +function getBlacklistedVideosList (url: string, token: string, specialStatus = 200) { + const path = '/api/v1/videos/blacklist/' + + return request(url) + .get(path) + .query({ sort: 'createdAt' }) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .expect(specialStatus) + .expect('Content-Type', /json/) +} + +function getSortedBlacklistedVideosList (url: string, token: string, sort: string, specialStatus = 200) { + const path = '/api/v1/videos/blacklist/' + + return request(url) + .get(path) + .query({ sort: sort }) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .expect(specialStatus) + .expect('Content-Type', /json/) +} + +// --------------------------------------------------------------------------- + +export { + addVideoToBlacklist, + removeVideoFromBlacklist, + getBlacklistedVideosList, + getSortedBlacklistedVideosList, + updateVideoBlacklist +} diff --git a/shared/utils/videos/video-captions.ts b/shared/utils/videos/video-captions.ts new file mode 100644 index 000000000..41e52be07 --- /dev/null +++ b/shared/utils/videos/video-captions.ts @@ -0,0 +1,71 @@ +import { makeDeleteRequest, makeGetRequest } from '../' +import { buildAbsoluteFixturePath, makeUploadRequest } from '../index' +import * as request from 'supertest' +import * as chai from 'chai' + +const expect = chai.expect + +function createVideoCaption (args: { + url: string, + accessToken: string + videoId: string | number + language: string + fixture: string, + mimeType?: string, + statusCodeExpected?: number +}) { + const path = '/api/v1/videos/' + args.videoId + '/captions/' + args.language + + const captionfile = buildAbsoluteFixturePath(args.fixture) + const captionfileAttach = args.mimeType ? [ captionfile, { contentType: args.mimeType } ] : captionfile + + return makeUploadRequest({ + method: 'PUT', + url: args.url, + path, + token: args.accessToken, + fields: {}, + attaches: { + captionfile: captionfileAttach + }, + statusCodeExpected: args.statusCodeExpected || 204 + }) +} + +function listVideoCaptions (url: string, videoId: string | number) { + const path = '/api/v1/videos/' + videoId + '/captions' + + return makeGetRequest({ + url, + path, + statusCodeExpected: 200 + }) +} + +function deleteVideoCaption (url: string, token: string, videoId: string | number, language: string) { + const path = '/api/v1/videos/' + videoId + '/captions/' + language + + return makeDeleteRequest({ + url, + token, + path, + statusCodeExpected: 204 + }) +} + +async function testCaptionFile (url: string, captionPath: string, containsString: string) { + const res = await request(url) + .get(captionPath) + .expect(200) + + expect(res.text).to.contain(containsString) +} + +// --------------------------------------------------------------------------- + +export { + createVideoCaption, + listVideoCaptions, + testCaptionFile, + deleteVideoCaption +} diff --git a/shared/utils/videos/video-change-ownership.ts b/shared/utils/videos/video-change-ownership.ts new file mode 100644 index 000000000..f288692ea --- /dev/null +++ b/shared/utils/videos/video-change-ownership.ts @@ -0,0 +1,54 @@ +import * as request from 'supertest' + +function changeVideoOwnership (url: string, token: string, videoId: number | string, username) { + const path = '/api/v1/videos/' + videoId + '/give-ownership' + + return request(url) + .post(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .send({ username }) + .expect(204) +} + +function getVideoChangeOwnershipList (url: string, token: string) { + const path = '/api/v1/videos/ownership' + + return request(url) + .get(path) + .query({ sort: '-createdAt' }) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .expect(200) + .expect('Content-Type', /json/) +} + +function acceptChangeOwnership (url: string, token: string, ownershipId: string, channelId: number, expectedStatus = 204) { + const path = '/api/v1/videos/ownership/' + ownershipId + '/accept' + + return request(url) + .post(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .send({ channelId }) + .expect(expectedStatus) +} + +function refuseChangeOwnership (url: string, token: string, ownershipId: string, expectedStatus = 204) { + const path = '/api/v1/videos/ownership/' + ownershipId + '/refuse' + + return request(url) + .post(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .expect(expectedStatus) +} + +// --------------------------------------------------------------------------- + +export { + changeVideoOwnership, + getVideoChangeOwnershipList, + acceptChangeOwnership, + refuseChangeOwnership +} diff --git a/shared/utils/videos/video-channels.ts b/shared/utils/videos/video-channels.ts new file mode 100644 index 000000000..092985777 --- /dev/null +++ b/shared/utils/videos/video-channels.ts @@ -0,0 +1,118 @@ +import * as request from 'supertest' +import { VideoChannelCreate, VideoChannelUpdate } from '../../../../shared/models/videos' +import { updateAvatarRequest } from '../index' + +function getVideoChannelsList (url: string, start: number, count: number, sort?: string) { + const path = '/api/v1/video-channels' + + const req = request(url) + .get(path) + .query({ start: start }) + .query({ count: count }) + + if (sort) req.query({ sort }) + + return req.set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +function getAccountVideoChannelsList (url: string, accountName: string, specialStatus = 200) { + const path = '/api/v1/accounts/' + accountName + '/video-channels' + + return request(url) + .get(path) + .set('Accept', 'application/json') + .expect(specialStatus) + .expect('Content-Type', /json/) +} + +function addVideoChannel ( + url: string, + token: string, + videoChannelAttributesArg: VideoChannelCreate, + expectedStatus = 200 +) { + const path = '/api/v1/video-channels/' + + // Default attributes + let attributes = { + displayName: 'my super video channel', + description: 'my super channel description', + support: 'my super channel support' + } + attributes = Object.assign(attributes, videoChannelAttributesArg) + + return request(url) + .post(path) + .send(attributes) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .expect(expectedStatus) +} + +function updateVideoChannel ( + url: string, + token: string, + channelName: string, + attributes: VideoChannelUpdate, + expectedStatus = 204 +) { + const body = {} + const path = '/api/v1/video-channels/' + channelName + + if (attributes.displayName) body['displayName'] = attributes.displayName + if (attributes.description) body['description'] = attributes.description + if (attributes.support) body['support'] = attributes.support + + return request(url) + .put(path) + .send(body) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .expect(expectedStatus) +} + +function deleteVideoChannel (url: string, token: string, channelName: string, expectedStatus = 204) { + const path = '/api/v1/video-channels/' + channelName + + return request(url) + .delete(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .expect(expectedStatus) +} + +function getVideoChannel (url: string, channelName: string) { + const path = '/api/v1/video-channels/' + channelName + + return request(url) + .get(path) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +function updateVideoChannelAvatar (options: { + url: string, + accessToken: string, + fixture: string, + videoChannelName: string | number +}) { + + const path = '/api/v1/video-channels/' + options.videoChannelName + '/avatar/pick' + + return updateAvatarRequest(Object.assign(options, { path })) +} + +// --------------------------------------------------------------------------- + +export { + updateVideoChannelAvatar, + getVideoChannelsList, + getAccountVideoChannelsList, + addVideoChannel, + updateVideoChannel, + deleteVideoChannel, + getVideoChannel +} diff --git a/shared/utils/videos/video-comments.ts b/shared/utils/videos/video-comments.ts new file mode 100644 index 000000000..7d4cae364 --- /dev/null +++ b/shared/utils/videos/video-comments.ts @@ -0,0 +1,87 @@ +import * as request from 'supertest' +import { makeDeleteRequest } from '../' + +function getVideoCommentThreads (url: string, videoId: number | string, start: number, count: number, sort?: string, token?: string) { + const path = '/api/v1/videos/' + videoId + '/comment-threads' + + const req = request(url) + .get(path) + .query({ start: start }) + .query({ count: count }) + + if (sort) req.query({ sort }) + if (token) req.set('Authorization', 'Bearer ' + token) + + return req.set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +function getVideoThreadComments (url: string, videoId: number | string, threadId: number, token?: string) { + const path = '/api/v1/videos/' + videoId + '/comment-threads/' + threadId + + const req = request(url) + .get(path) + .set('Accept', 'application/json') + + if (token) req.set('Authorization', 'Bearer ' + token) + + return req.expect(200) + .expect('Content-Type', /json/) +} + +function addVideoCommentThread (url: string, token: string, videoId: number | string, text: string, expectedStatus = 200) { + const path = '/api/v1/videos/' + videoId + '/comment-threads' + + return request(url) + .post(path) + .send({ text }) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .expect(expectedStatus) +} + +function addVideoCommentReply ( + url: string, + token: string, + videoId: number | string, + inReplyToCommentId: number, + text: string, + expectedStatus = 200 +) { + const path = '/api/v1/videos/' + videoId + '/comments/' + inReplyToCommentId + + return request(url) + .post(path) + .send({ text }) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .expect(expectedStatus) +} + +function deleteVideoComment ( + url: string, + token: string, + videoId: number | string, + commentId: number, + statusCodeExpected = 204 +) { + const path = '/api/v1/videos/' + videoId + '/comments/' + commentId + + return makeDeleteRequest({ + url, + path, + token, + statusCodeExpected + }) +} + +// --------------------------------------------------------------------------- + +export { + getVideoCommentThreads, + getVideoThreadComments, + addVideoCommentThread, + addVideoCommentReply, + deleteVideoComment +} diff --git a/shared/utils/videos/video-history.ts b/shared/utils/videos/video-history.ts new file mode 100644 index 000000000..7635478f7 --- /dev/null +++ b/shared/utils/videos/video-history.ts @@ -0,0 +1,14 @@ +import { makePutBodyRequest } from '../requests/requests' + +function userWatchVideo (url: string, token: string, videoId: number | string, currentTime: number) { + const path = '/api/v1/videos/' + videoId + '/watching' + const fields = { currentTime } + + return makePutBodyRequest({ url, path, token, fields, statusCodeExpected: 204 }) +} + +// --------------------------------------------------------------------------- + +export { + userWatchVideo +} diff --git a/shared/utils/videos/video-imports.ts b/shared/utils/videos/video-imports.ts new file mode 100644 index 000000000..59dfd481a --- /dev/null +++ b/shared/utils/videos/video-imports.ts @@ -0,0 +1,51 @@ +import { VideoImportCreate } from '../../../../shared/models/videos' +import { makeGetRequest, makeUploadRequest } from '..' + +function getYoutubeVideoUrl () { + return 'https://youtu.be/msX3jv1XdvM' +} + +function getMagnetURI () { + // tslint:disable:max-line-length + return 'magnet:?xs=https%3A%2F%2Fpeertube2.cpy.re%2Fstatic%2Ftorrents%2Fb209ca00-c8bb-4b2b-b421-1ede169f3dbc-720.torrent&xt=urn:btih:0f498834733e8057ed5c6f2ee2b4efd8d84a76ee&dn=super+peertube2+video&tr=wss%3A%2F%2Fpeertube2.cpy.re%3A443%2Ftracker%2Fsocket&tr=https%3A%2F%2Fpeertube2.cpy.re%2Ftracker%2Fannounce&ws=https%3A%2F%2Fpeertube2.cpy.re%2Fstatic%2Fwebseed%2Fb209ca00-c8bb-4b2b-b421-1ede169f3dbc-720.mp4' +} + +function importVideo (url: string, token: string, attributes: VideoImportCreate) { + const path = '/api/v1/videos/imports' + + let attaches: any = {} + if (attributes.torrentfile) attaches = { torrentfile: attributes.torrentfile } + + return makeUploadRequest({ + url, + path, + token, + attaches, + fields: attributes, + statusCodeExpected: 200 + }) +} + +function getMyVideoImports (url: string, token: string, sort?: string) { + const path = '/api/v1/users/me/videos/imports' + + const query = {} + if (sort) query['sort'] = sort + + return makeGetRequest({ + url, + query, + path, + token, + statusCodeExpected: 200 + }) +} + +// --------------------------------------------------------------------------- + +export { + getYoutubeVideoUrl, + importVideo, + getMagnetURI, + getMyVideoImports +} diff --git a/shared/utils/videos/videos.ts b/shared/utils/videos/videos.ts new file mode 100644 index 000000000..87c385f38 --- /dev/null +++ b/shared/utils/videos/videos.ts @@ -0,0 +1,576 @@ +/* tslint:disable:no-unused-expression */ + +import { expect } from 'chai' +import { existsSync, readdir, readFile } from 'fs-extra' +import * as parseTorrent from 'parse-torrent' +import { extname, join } from 'path' +import * as request from 'supertest' +import { + buildAbsoluteFixturePath, + getMyUserInformation, + immutableAssign, + makeGetRequest, + makePutBodyRequest, + makeUploadRequest, + root, + ServerInfo, + testImage +} from '../' +import { VideoDetails, VideoPrivacy } from '../../../../shared/models/videos' +import { VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES, VIDEO_PRIVACIES } from '../../../initializers' +import { dateIsValid, webtorrentAdd } from '../index' + +type VideoAttributes = { + name?: string + category?: number + licence?: number + language?: string + nsfw?: boolean + commentsEnabled?: boolean + waitTranscoding?: boolean + description?: string + tags?: string[] + channelId?: number + privacy?: VideoPrivacy + fixture?: string + thumbnailfile?: string + previewfile?: string + scheduleUpdate?: { + updateAt: string + privacy?: VideoPrivacy + } +} + +function getVideoCategories (url: string) { + const path = '/api/v1/videos/categories' + + return makeGetRequest({ + url, + path, + statusCodeExpected: 200 + }) +} + +function getVideoLicences (url: string) { + const path = '/api/v1/videos/licences' + + return makeGetRequest({ + url, + path, + statusCodeExpected: 200 + }) +} + +function getVideoLanguages (url: string) { + const path = '/api/v1/videos/languages' + + return makeGetRequest({ + url, + path, + statusCodeExpected: 200 + }) +} + +function getVideoPrivacies (url: string) { + const path = '/api/v1/videos/privacies' + + return makeGetRequest({ + url, + path, + statusCodeExpected: 200 + }) +} + +function getVideo (url: string, id: number | string, expectedStatus = 200) { + const path = '/api/v1/videos/' + id + + return request(url) + .get(path) + .set('Accept', 'application/json') + .expect(expectedStatus) +} + +function viewVideo (url: string, id: number | string, expectedStatus = 204, xForwardedFor?: string) { + const path = '/api/v1/videos/' + id + '/views' + + const req = request(url) + .post(path) + .set('Accept', 'application/json') + + if (xForwardedFor) { + req.set('X-Forwarded-For', xForwardedFor) + } + + return req.expect(expectedStatus) +} + +function getVideoWithToken (url: string, token: string, id: number | string, expectedStatus = 200) { + const path = '/api/v1/videos/' + id + + return request(url) + .get(path) + .set('Authorization', 'Bearer ' + token) + .set('Accept', 'application/json') + .expect(expectedStatus) +} + +function getVideoDescription (url: string, descriptionPath: string) { + return request(url) + .get(descriptionPath) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +function getVideosList (url: string) { + const path = '/api/v1/videos' + + return request(url) + .get(path) + .query({ sort: 'name' }) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +function getVideosListWithToken (url: string, token: string, query: { nsfw?: boolean } = {}) { + const path = '/api/v1/videos' + + return request(url) + .get(path) + .set('Authorization', 'Bearer ' + token) + .query(immutableAssign(query, { sort: 'name' })) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +function getLocalVideos (url: string) { + const path = '/api/v1/videos' + + return request(url) + .get(path) + .query({ sort: 'name', filter: 'local' }) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +function getMyVideos (url: string, accessToken: string, start: number, count: number, sort?: string) { + const path = '/api/v1/users/me/videos' + + const req = request(url) + .get(path) + .query({ start: start }) + .query({ count: count }) + + if (sort) req.query({ sort }) + + return req.set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .expect(200) + .expect('Content-Type', /json/) +} + +function getAccountVideos ( + url: string, + accessToken: string, + accountName: string, + start: number, + count: number, + sort?: string, + query: { nsfw?: boolean } = {} +) { + const path = '/api/v1/accounts/' + accountName + '/videos' + + return makeGetRequest({ + url, + path, + query: immutableAssign(query, { + start, + count, + sort + }), + token: accessToken, + statusCodeExpected: 200 + }) +} + +function getVideoChannelVideos ( + url: string, + accessToken: string, + videoChannelName: string, + start: number, + count: number, + sort?: string, + query: { nsfw?: boolean } = {} +) { + const path = '/api/v1/video-channels/' + videoChannelName + '/videos' + + return makeGetRequest({ + url, + path, + query: immutableAssign(query, { + start, + count, + sort + }), + token: accessToken, + statusCodeExpected: 200 + }) +} + +function getVideosListPagination (url: string, start: number, count: number, sort?: string) { + const path = '/api/v1/videos' + + const req = request(url) + .get(path) + .query({ start: start }) + .query({ count: count }) + + if (sort) req.query({ sort }) + + return req.set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +function getVideosListSort (url: string, sort: string) { + const path = '/api/v1/videos' + + return request(url) + .get(path) + .query({ sort: sort }) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +function getVideosWithFilters (url: string, query: { tagsAllOf: string[], categoryOneOf: number[] | number }) { + const path = '/api/v1/videos' + + return request(url) + .get(path) + .query(query) + .set('Accept', 'application/json') + .expect(200) + .expect('Content-Type', /json/) +} + +function removeVideo (url: string, token: string, id: number | string, expectedStatus = 204) { + const path = '/api/v1/videos' + + return request(url) + .delete(path + '/' + id) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + token) + .expect(expectedStatus) +} + +async function checkVideoFilesWereRemoved ( + videoUUID: string, + serverNumber: number, + directories = [ 'videos', 'thumbnails', 'torrents', 'previews', 'captions' ] +) { + const testDirectory = 'test' + serverNumber + + for (const directory of directories) { + const directoryPath = join(root(), testDirectory, directory) + + const directoryExists = existsSync(directoryPath) + expect(directoryExists).to.be.true + + const files = await readdir(directoryPath) + for (const file of files) { + expect(file).to.not.contain(videoUUID) + } + } +} + +async function uploadVideo (url: string, accessToken: string, videoAttributesArg: VideoAttributes, specialStatus = 200) { + const path = '/api/v1/videos/upload' + let defaultChannelId = '1' + + try { + const res = await getMyUserInformation(url, accessToken) + defaultChannelId = res.body.videoChannels[0].id + } catch (e) { /* empty */ } + + // Override default attributes + const attributes = Object.assign({ + name: 'my super video', + category: 5, + licence: 4, + language: 'zh', + channelId: defaultChannelId, + nsfw: true, + waitTranscoding: false, + description: 'my super description', + support: 'my super support text', + tags: [ 'tag' ], + privacy: VideoPrivacy.PUBLIC, + commentsEnabled: true, + fixture: 'video_short.webm' + }, videoAttributesArg) + + const req = request(url) + .post(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .field('name', attributes.name) + .field('nsfw', JSON.stringify(attributes.nsfw)) + .field('commentsEnabled', JSON.stringify(attributes.commentsEnabled)) + .field('waitTranscoding', JSON.stringify(attributes.waitTranscoding)) + .field('privacy', attributes.privacy.toString()) + .field('channelId', attributes.channelId) + + if (attributes.description !== undefined) { + req.field('description', attributes.description) + } + if (attributes.language !== undefined) { + req.field('language', attributes.language.toString()) + } + if (attributes.category !== undefined) { + req.field('category', attributes.category.toString()) + } + if (attributes.licence !== undefined) { + req.field('licence', attributes.licence.toString()) + } + + for (let i = 0; i < attributes.tags.length; i++) { + req.field('tags[' + i + ']', attributes.tags[i]) + } + + if (attributes.thumbnailfile !== undefined) { + req.attach('thumbnailfile', buildAbsoluteFixturePath(attributes.thumbnailfile)) + } + if (attributes.previewfile !== undefined) { + req.attach('previewfile', buildAbsoluteFixturePath(attributes.previewfile)) + } + + if (attributes.scheduleUpdate) { + req.field('scheduleUpdate[updateAt]', attributes.scheduleUpdate.updateAt) + + if (attributes.scheduleUpdate.privacy) { + req.field('scheduleUpdate[privacy]', attributes.scheduleUpdate.privacy) + } + } + + return req.attach('videofile', buildAbsoluteFixturePath(attributes.fixture)) + .expect(specialStatus) +} + +function updateVideo (url: string, accessToken: string, id: number | string, attributes: VideoAttributes, statusCodeExpected = 204) { + const path = '/api/v1/videos/' + id + const body = {} + + if (attributes.name) body['name'] = attributes.name + if (attributes.category) body['category'] = attributes.category + if (attributes.licence) body['licence'] = attributes.licence + if (attributes.language) body['language'] = attributes.language + if (attributes.nsfw !== undefined) body['nsfw'] = JSON.stringify(attributes.nsfw) + if (attributes.commentsEnabled !== undefined) body['commentsEnabled'] = JSON.stringify(attributes.commentsEnabled) + if (attributes.description) body['description'] = attributes.description + if (attributes.tags) body['tags'] = attributes.tags + if (attributes.privacy) body['privacy'] = attributes.privacy + if (attributes.channelId) body['channelId'] = attributes.channelId + if (attributes.scheduleUpdate) body['scheduleUpdate'] = attributes.scheduleUpdate + + // Upload request + if (attributes.thumbnailfile || attributes.previewfile) { + const attaches: any = {} + if (attributes.thumbnailfile) attaches.thumbnailfile = attributes.thumbnailfile + if (attributes.previewfile) attaches.previewfile = attributes.previewfile + + return makeUploadRequest({ + url, + method: 'PUT', + path, + token: accessToken, + fields: body, + attaches, + statusCodeExpected + }) + } + + return makePutBodyRequest({ + url, + path, + fields: body, + token: accessToken, + statusCodeExpected + }) +} + +function rateVideo (url: string, accessToken: string, id: number, rating: string, specialStatus = 204) { + const path = '/api/v1/videos/' + id + '/rate' + + return request(url) + .put(path) + .set('Accept', 'application/json') + .set('Authorization', 'Bearer ' + accessToken) + .send({ rating }) + .expect(specialStatus) +} + +function parseTorrentVideo (server: ServerInfo, videoUUID: string, resolution: number) { + return new Promise((res, rej) => { + const torrentName = videoUUID + '-' + resolution + '.torrent' + const torrentPath = join(__dirname, '..', '..', '..', '..', 'test' + server.serverNumber, 'torrents', torrentName) + readFile(torrentPath, (err, data) => { + if (err) return rej(err) + + return res(parseTorrent(data)) + }) + }) +} + +async function completeVideoCheck ( + url: string, + video: any, + attributes: { + name: string + category: number + licence: number + language: string + nsfw: boolean + commentsEnabled: boolean + description: string + publishedAt?: string + support: string + account: { + name: string + host: string + } + isLocal: boolean + tags: string[] + privacy: number + likes?: number + dislikes?: number + duration: number + channel: { + displayName: string + name: string + description + isLocal: boolean + } + fixture: string + files: { + resolution: number + size: number + }[], + thumbnailfile?: string + previewfile?: string + } +) { + if (!attributes.likes) attributes.likes = 0 + if (!attributes.dislikes) attributes.dislikes = 0 + + expect(video.name).to.equal(attributes.name) + expect(video.category.id).to.equal(attributes.category) + expect(video.category.label).to.equal(attributes.category !== null ? VIDEO_CATEGORIES[attributes.category] : 'Misc') + expect(video.licence.id).to.equal(attributes.licence) + expect(video.licence.label).to.equal(attributes.licence !== null ? VIDEO_LICENCES[attributes.licence] : 'Unknown') + expect(video.language.id).to.equal(attributes.language) + expect(video.language.label).to.equal(attributes.language !== null ? VIDEO_LANGUAGES[attributes.language] : 'Unknown') + expect(video.privacy.id).to.deep.equal(attributes.privacy) + expect(video.privacy.label).to.deep.equal(VIDEO_PRIVACIES[attributes.privacy]) + expect(video.nsfw).to.equal(attributes.nsfw) + expect(video.description).to.equal(attributes.description) + expect(video.account.id).to.be.a('number') + expect(video.account.uuid).to.be.a('string') + expect(video.account.host).to.equal(attributes.account.host) + expect(video.account.name).to.equal(attributes.account.name) + expect(video.channel.displayName).to.equal(attributes.channel.displayName) + expect(video.channel.name).to.equal(attributes.channel.name) + expect(video.likes).to.equal(attributes.likes) + expect(video.dislikes).to.equal(attributes.dislikes) + expect(video.isLocal).to.equal(attributes.isLocal) + expect(video.duration).to.equal(attributes.duration) + expect(dateIsValid(video.createdAt)).to.be.true + expect(dateIsValid(video.publishedAt)).to.be.true + expect(dateIsValid(video.updatedAt)).to.be.true + + if (attributes.publishedAt) { + expect(video.publishedAt).to.equal(attributes.publishedAt) + } + + const res = await getVideo(url, video.uuid) + const videoDetails: VideoDetails = res.body + + expect(videoDetails.files).to.have.lengthOf(attributes.files.length) + expect(videoDetails.tags).to.deep.equal(attributes.tags) + expect(videoDetails.account.name).to.equal(attributes.account.name) + expect(videoDetails.account.host).to.equal(attributes.account.host) + expect(video.channel.displayName).to.equal(attributes.channel.displayName) + expect(video.channel.name).to.equal(attributes.channel.name) + expect(videoDetails.channel.host).to.equal(attributes.account.host) + expect(videoDetails.channel.isLocal).to.equal(attributes.channel.isLocal) + expect(dateIsValid(videoDetails.channel.createdAt.toString())).to.be.true + expect(dateIsValid(videoDetails.channel.updatedAt.toString())).to.be.true + expect(videoDetails.commentsEnabled).to.equal(attributes.commentsEnabled) + + for (const attributeFile of attributes.files) { + const file = videoDetails.files.find(f => f.resolution.id === attributeFile.resolution) + expect(file).not.to.be.undefined + + let extension = extname(attributes.fixture) + // Transcoding enabled on server 2, extension will always be .mp4 + if (attributes.account.host === 'localhost:9002') extension = '.mp4' + + const magnetUri = file.magnetUri + expect(file.magnetUri).to.have.lengthOf.above(2) + expect(file.torrentUrl).to.equal(`http://${attributes.account.host}/static/torrents/${videoDetails.uuid}-${file.resolution.id}.torrent`) + expect(file.fileUrl).to.equal(`http://${attributes.account.host}/static/webseed/${videoDetails.uuid}-${file.resolution.id}${extension}`) + expect(file.resolution.id).to.equal(attributeFile.resolution) + expect(file.resolution.label).to.equal(attributeFile.resolution + 'p') + + const minSize = attributeFile.size - ((10 * attributeFile.size) / 100) + const maxSize = attributeFile.size + ((10 * attributeFile.size) / 100) + expect(file.size, + 'File size for resolution ' + file.resolution.label + ' outside confidence interval (' + minSize + '> size <' + maxSize + ')') + .to.be.above(minSize).and.below(maxSize) + + { + await testImage(url, attributes.thumbnailfile || attributes.fixture, videoDetails.thumbnailPath) + } + + if (attributes.previewfile) { + await testImage(url, attributes.previewfile, videoDetails.previewPath) + } + + const torrent = await webtorrentAdd(magnetUri, true) + expect(torrent.files).to.be.an('array') + expect(torrent.files.length).to.equal(1) + expect(torrent.files[0].path).to.exist.and.to.not.equal('') + } +} + +// --------------------------------------------------------------------------- + +export { + getVideoDescription, + getVideoCategories, + getVideoLicences, + getVideoPrivacies, + getVideoLanguages, + getMyVideos, + getAccountVideos, + getVideoChannelVideos, + getVideo, + getVideoWithToken, + getVideosList, + getVideosListPagination, + getVideosListSort, + removeVideo, + getVideosListWithToken, + uploadVideo, + getVideosWithFilters, + updateVideo, + rateVideo, + viewVideo, + parseTorrentVideo, + getLocalVideos, + completeVideoCheck, + checkVideoFilesWereRemoved +} -- cgit v1.2.3 From d4681c0074ba51c62a3aeb9fb3f2cd071dd21e32 Mon Sep 17 00:00:00 2001 From: buoyantair Date: Mon, 29 Oct 2018 22:36:09 +0530 Subject: Fix dependency issues --- shared/utils/search/videos.ts | 2 +- shared/utils/server/config.ts | 2 +- shared/utils/server/jobs.ts | 2 +- shared/utils/users/accounts.ts | 2 +- shared/utils/videos/video-abuses.ts | 2 +- shared/utils/videos/video-channels.ts | 2 +- shared/utils/videos/video-imports.ts | 2 +- shared/utils/videos/videos.ts | 4 ++-- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/shared/utils/search/videos.ts b/shared/utils/search/videos.ts index 3a0c10e42..115b3ff9a 100644 --- a/shared/utils/search/videos.ts +++ b/shared/utils/search/videos.ts @@ -1,7 +1,7 @@ /* tslint:disable:no-unused-expression */ import * as request from 'supertest' -import { VideosSearchQuery } from '../../../../shared/models/search' +import { VideosSearchQuery } from '../../models/search' import { immutableAssign } from '..' function searchVideo (url: string, search: string) { diff --git a/shared/utils/server/config.ts b/shared/utils/server/config.ts index b85e02ab7..15a94432b 100644 --- a/shared/utils/server/config.ts +++ b/shared/utils/server/config.ts @@ -1,5 +1,5 @@ import { makeDeleteRequest, makeGetRequest, makePutBodyRequest } from '../' -import { CustomConfig } from '../../../../shared/models/server/custom-config.model' +import { CustomConfig } from '../../models/server/custom-config.model' function getConfig (url: string) { const path = '/api/v1/config' diff --git a/shared/utils/server/jobs.ts b/shared/utils/server/jobs.ts index 4c02cace5..3eec1d7d7 100644 --- a/shared/utils/server/jobs.ts +++ b/shared/utils/server/jobs.ts @@ -1,5 +1,5 @@ import * as request from 'supertest' -import { Job, JobState } from '../../../../shared/models' +import { Job, JobState } from '../../models' import { ServerInfo, wait } from '../index' function getJobsList (url: string, accessToken: string, state: JobState) { diff --git a/shared/utils/users/accounts.ts b/shared/utils/users/accounts.ts index f82b8d906..5601f2a77 100644 --- a/shared/utils/users/accounts.ts +++ b/shared/utils/users/accounts.ts @@ -3,7 +3,7 @@ import { expect } from 'chai' import { existsSync, readdir } from 'fs-extra' import { join } from 'path' -import { Account } from '../../../../shared/models/actors' +import { Account } from '../../models/actors' import { root } from '../index' import { makeGetRequest } from '../requests/requests' diff --git a/shared/utils/videos/video-abuses.ts b/shared/utils/videos/video-abuses.ts index 14907e6a0..8be891a9b 100644 --- a/shared/utils/videos/video-abuses.ts +++ b/shared/utils/videos/video-abuses.ts @@ -1,5 +1,5 @@ import * as request from 'supertest' -import { VideoAbuseUpdate } from '../../../../shared/models/videos/abuse/video-abuse-update.model' +import { VideoAbuseUpdate } from '../../models/videos/abuse/video-abuse-update.model' import { makeDeleteRequest, makePutBodyRequest } from '..' function reportVideoAbuse (url: string, token: string, videoId: number | string, reason: string, specialStatus = 200) { diff --git a/shared/utils/videos/video-channels.ts b/shared/utils/videos/video-channels.ts index 092985777..3d37f0e4c 100644 --- a/shared/utils/videos/video-channels.ts +++ b/shared/utils/videos/video-channels.ts @@ -1,5 +1,5 @@ import * as request from 'supertest' -import { VideoChannelCreate, VideoChannelUpdate } from '../../../../shared/models/videos' +import { VideoChannelCreate, VideoChannelUpdate } from '../../models/videos' import { updateAvatarRequest } from '../index' function getVideoChannelsList (url: string, start: number, count: number, sort?: string) { diff --git a/shared/utils/videos/video-imports.ts b/shared/utils/videos/video-imports.ts index 59dfd481a..bf5062cd1 100644 --- a/shared/utils/videos/video-imports.ts +++ b/shared/utils/videos/video-imports.ts @@ -1,4 +1,4 @@ -import { VideoImportCreate } from '../../../../shared/models/videos' +import { VideoImportCreate } from '../../models/videos' import { makeGetRequest, makeUploadRequest } from '..' function getYoutubeVideoUrl () { diff --git a/shared/utils/videos/videos.ts b/shared/utils/videos/videos.ts index 87c385f38..b3206e566 100644 --- a/shared/utils/videos/videos.ts +++ b/shared/utils/videos/videos.ts @@ -16,8 +16,8 @@ import { ServerInfo, testImage } from '../' -import { VideoDetails, VideoPrivacy } from '../../../../shared/models/videos' -import { VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES, VIDEO_PRIVACIES } from '../../../initializers' +import { VideoDetails, VideoPrivacy } from '../../models/videos' +import { VIDEO_CATEGORIES, VIDEO_LANGUAGES, VIDEO_LICENCES, VIDEO_PRIVACIES } from '../../../server/initializers' import { dateIsValid, webtorrentAdd } from '../index' type VideoAttributes = { -- cgit v1.2.3 From 92e07c3b5d9dbf2febedb1b5b87ec676eb6d1ac8 Mon Sep 17 00:00:00 2001 From: buoyantair Date: Fri, 16 Nov 2018 02:51:26 +0530 Subject: Fix dependency errors between modules --- server/lib/activitypub/process/process-create.ts | 2 +- server/lib/activitypub/process/process-like.ts | 2 +- server/tests/api/activitypub/client.ts | 2 +- server/tests/api/activitypub/fetch.ts | 4 ++-- server/tests/api/activitypub/helpers.ts | 2 +- server/tests/api/activitypub/security.ts | 11 ++++++++++- server/tests/api/server/no-client.ts | 4 ++-- shared/utils/index.ts | 2 -- 8 files changed, 18 insertions(+), 11 deletions(-) diff --git a/server/lib/activitypub/process/process-create.ts b/server/lib/activitypub/process/process-create.ts index 214e14546..9a72cb899 100644 --- a/server/lib/activitypub/process/process-create.ts +++ b/server/lib/activitypub/process/process-create.ts @@ -12,7 +12,7 @@ import { getOrCreateVideoAndAccountAndChannel } from '../videos' import { forwardVideoRelatedActivity } from '../send/utils' import { Redis } from '../../redis' import { createOrUpdateCacheFile } from '../cache-file' -import { immutableAssign } from '../../../tests/utils' +import { immutableAssign } from '../../../../shared/utils' import { getVideoDislikeActivityPubUrl } from '../url' import { VideoModel } from '../../../models/video/video' diff --git a/server/lib/activitypub/process/process-like.ts b/server/lib/activitypub/process/process-like.ts index 0dca17551..be86665e9 100644 --- a/server/lib/activitypub/process/process-like.ts +++ b/server/lib/activitypub/process/process-like.ts @@ -5,7 +5,7 @@ import { AccountVideoRateModel } from '../../../models/account/account-video-rat import { ActorModel } from '../../../models/activitypub/actor' import { forwardVideoRelatedActivity } from '../send/utils' import { getOrCreateVideoAndAccountAndChannel } from '../videos' -import { immutableAssign } from '../../../tests/utils' +import { immutableAssign } from '../../../../shared/utils' import { getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from '../url' async function processLikeActivity (activity: ActivityLike, byActor: ActorModel) { diff --git a/server/tests/api/activitypub/client.ts b/server/tests/api/activitypub/client.ts index 334cd4e5c..d45232c8d 100644 --- a/server/tests/api/activitypub/client.ts +++ b/server/tests/api/activitypub/client.ts @@ -9,7 +9,7 @@ import { runServer, ServerInfo, setAccessTokensToServers -} from '../../shared/utils' +} from '../../../../shared/utils' const expect = chai.expect diff --git a/server/tests/api/activitypub/fetch.ts b/server/tests/api/activitypub/fetch.ts index a42c606c6..e84eb18bb 100644 --- a/server/tests/api/activitypub/fetch.ts +++ b/server/tests/api/activitypub/fetch.ts @@ -13,10 +13,10 @@ import { setAccessTokensToServers, uploadVideo, userLogin -} from '../../utils' +} from '../../../../shared/utils' import * as chai from 'chai' import { setActorField, setVideoField } from '../../utils/miscs/sql' -import { waitJobs } from '../../utils/server/jobs' +import { waitJobs } from '../../../../shared/utils/server/jobs' import { Video } from '../../../../shared/models/videos' const expect = chai.expect diff --git a/server/tests/api/activitypub/helpers.ts b/server/tests/api/activitypub/helpers.ts index 610846247..4c42f3d67 100644 --- a/server/tests/api/activitypub/helpers.ts +++ b/server/tests/api/activitypub/helpers.ts @@ -2,7 +2,7 @@ import 'mocha' import { expect } from 'chai' -import { buildRequestStub } from '../../utils' +import { buildRequestStub } from '../../utils/miscs/stubs' import { isHTTPSignatureVerified, isJsonLDSignatureVerified, parseHTTPSignature } from '../../../helpers/peertube-crypto' import { cloneDeep } from 'lodash' import { buildSignedActivity } from '../../../helpers/activitypub' diff --git a/server/tests/api/activitypub/security.ts b/server/tests/api/activitypub/security.ts index e7899bb14..69b7c0148 100644 --- a/server/tests/api/activitypub/security.ts +++ b/server/tests/api/activitypub/security.ts @@ -2,7 +2,16 @@ import 'mocha' -import { flushAndRunMultipleServers, flushTests, killallServers, makePOSTAPRequest, makeFollowRequest, ServerInfo } from '../../utils' +import { + flushAndRunMultipleServers, + flushTests, + killallServers, + ServerInfo +} from '../../../../shared/utils' +import { + makePOSTAPRequest, + makeFollowRequest, +} from '../../utils/requests/activitypub' import { HTTP_SIGNATURE } from '../../../initializers' import { buildDigest, buildGlobalHeaders } from '../../../lib/job-queue/handlers/utils/activitypub-http-utils' import * as chai from 'chai' diff --git a/server/tests/api/server/no-client.ts b/server/tests/api/server/no-client.ts index 6d6ce8532..3b95ce945 100644 --- a/server/tests/api/server/no-client.ts +++ b/server/tests/api/server/no-client.ts @@ -4,8 +4,8 @@ import { flushTests, killallServers, ServerInfo -} from '../../utils/index' -import { runServer } from '../../utils/server/servers' +} from '../../../../shared/utils' +import { runServer } from '../../../../shared/utils/server/servers' describe('Start and stop server without web client routes', function () { let server: ServerInfo diff --git a/shared/utils/index.ts b/shared/utils/index.ts index 905d93823..897389824 100644 --- a/shared/utils/index.ts +++ b/shared/utils/index.ts @@ -4,10 +4,8 @@ export * from './server/clients' export * from './server/config' export * from './users/login' export * from './miscs/miscs' -export * from './miscs/stubs' export * from './server/follows' export * from './requests/requests' -export * from './requests/activitypub' export * from './server/servers' export * from './videos/services' export * from './users/users' -- cgit v1.2.3 From 35adc403b7eed6d1309bbce901268a76dd01b6ef Mon Sep 17 00:00:00 2001 From: buoyantair Date: Tue, 20 Nov 2018 12:33:52 +0530 Subject: Fix dependency issues --- server/tests/api/server/follow-constraints.ts | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/server/tests/api/server/follow-constraints.ts b/server/tests/api/server/follow-constraints.ts index 3135fc568..8bb073c41 100644 --- a/server/tests/api/server/follow-constraints.ts +++ b/server/tests/api/server/follow-constraints.ts @@ -2,11 +2,21 @@ import * as chai from 'chai' import 'mocha' -import { doubleFollow, getAccountVideos, getVideo, getVideoChannelVideos, getVideoWithToken } from '../../utils' -import { flushAndRunMultipleServers, killallServers, ServerInfo, setAccessTokensToServers, uploadVideo } from '../../utils/index' -import { unfollow } from '../../utils/server/follows' -import { userLogin } from '../../utils/users/login' -import { createUser } from '../../utils/users/users' +import { + doubleFollow, + getAccountVideos, + getVideo, + getVideoChannelVideos, + getVideoWithToken, + flushAndRunMultipleServers, + killallServers, + ServerInfo, + setAccessTokensToServers, + uploadVideo +} from '../../../../shared/utils' +import { unfollow } from '../../../../shared/utils/server/follows' +import { userLogin } from '../../../../shared/utils/users/login' +import { createUser } from '../../../../shared/utils/users/users' const expect = chai.expect -- cgit v1.2.3 From 75939291703cf18010495f6b85d6d65e01184235 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Thu, 22 Nov 2018 15:40:49 +0100 Subject: Check free storage before upgrading --- scripts/upgrade.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts/upgrade.sh b/scripts/upgrade.sh index c70b3b42a..0a9ce1dab 100755 --- a/scripts/upgrade.sh +++ b/scripts/upgrade.sh @@ -20,6 +20,14 @@ if [ ! -e "$PEERTUBE_PATH/versions" -o ! -e "$PEERTUBE_PATH/config/production.ya exit 1 fi +REMAINING=$(df -k $PEERTUBE_PATH | awk '{ print $4}' | sed -n 2p) +ONE_GB=$((1024 * 1024)) +if [ "$REMAINING" -lt "$ONE_GB" ]; then + echo "Error - not enough free space for upgrading" + echo "" + echo "Make sure you have at least 1 GB of free space in $PEERTUBE_PATH" + exit 1 +fi # Backup database SQL_BACKUP_PATH="$PEERTUBE_PATH/backup/sql-peertube_prod-$(date +"%Y%m%d-%H%M").bak" -- cgit v1.2.3 From 5c94c38d18a02864b6f384bcd829a0d3f2d86c4a Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Sat, 1 Dec 2018 14:00:07 +0100 Subject: Check if awk and sed are executable --- scripts/upgrade.sh | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/scripts/upgrade.sh b/scripts/upgrade.sh index 0a9ce1dab..4f7c58edd 100755 --- a/scripts/upgrade.sh +++ b/scripts/upgrade.sh @@ -20,13 +20,15 @@ if [ ! -e "$PEERTUBE_PATH/versions" -o ! -e "$PEERTUBE_PATH/config/production.ya exit 1 fi -REMAINING=$(df -k $PEERTUBE_PATH | awk '{ print $4}' | sed -n 2p) -ONE_GB=$((1024 * 1024)) -if [ "$REMAINING" -lt "$ONE_GB" ]; then - echo "Error - not enough free space for upgrading" - echo "" - echo "Make sure you have at least 1 GB of free space in $PEERTUBE_PATH" - exit 1 +if [ -x "$(command -v awk)" ] && [ -x "$(command -v sed)" ] ; then + REMAINING=$(df -k $PEERTUBE_PATH | awk '{ print $4}' | sed -n 2p) + ONE_GB=$((1024 * 1024)) + if [ "$REMAINING" -lt "$ONE_GB" ]; then + echo "Error - not enough free space for upgrading" + echo "" + echo "Make sure you have at least 1 GB of free space in $PEERTUBE_PATH" + exit 1 + fi fi # Backup database -- cgit v1.2.3 From f9a971c671d5a8b88f420a86656a788575105598 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 4 Dec 2018 09:34:29 +0100 Subject: Update dependencies --- package.json | 4 +- server/initializers/constants.ts | 2 +- server/lib/job-queue/handlers/video-file.ts | 4 +- yarn.lock | 347 +++++++++++++++------------- 4 files changed, 196 insertions(+), 161 deletions(-) diff --git a/package.json b/package.json index d4076612e..c5e4c329c 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "cli-table": "^0.3.1", "commander": "^2.13.0", "concurrently": "^4.0.1", - "config": "^2.0.1", + "config": "^3.0.0", "cookie-parser": "^1.4.3", "cors": "^2.8.1", "create-torrent": "^3.24.5", @@ -165,7 +165,7 @@ "@types/bcrypt": "^3.0.0", "@types/bluebird": "3.5.21", "@types/body-parser": "^1.16.3", - "@types/bull": "^3.3.12", + "@types/bull": "3.4.0", "@types/bytes": "^3.0.0", "@types/chai": "^4.0.4", "@types/chai-json-schema": "^1.4.3", diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index aa243859c..8a8bcd126 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -773,7 +773,7 @@ function buildVideosRedundancy (objs: any[]): VideosRedundancy[] { if (!objs) return [] return objs.map(obj => { - return Object.assign(obj, { + return Object.assign({}, obj, { minLifetime: parseDuration(obj.min_lifetime), size: bytes.parse(obj.size), minViews: obj.min_views diff --git a/server/lib/job-queue/handlers/video-file.ts b/server/lib/job-queue/handlers/video-file.ts index adc0a2a15..ddbf6d1c2 100644 --- a/server/lib/job-queue/handlers/video-file.ts +++ b/server/lib/job-queue/handlers/video-file.ts @@ -1,5 +1,5 @@ import * as Bull from 'bull' -import { VideoResolution, VideoState } from '../../../../shared' +import { VideoResolution, VideoState, Job } from '../../../../shared' import { logger } from '../../../helpers/logger' import { VideoModel } from '../../../models/video/video' import { JobQueue } from '../job-queue' @@ -111,7 +111,7 @@ async function onVideoFileOptimizerSuccess (video: VideoModel, isNewVideo: boole ) if (resolutionsEnabled.length !== 0) { - const tasks: Bluebird[] = [] + const tasks: Bluebird>[] = [] for (const resolution of resolutionsEnabled) { const dataInput = { diff --git a/yarn.lock b/yarn.lock index b961fb5cc..1cbe6756d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,20 @@ # yarn lockfile v1 +"@iamstarkov/listr-update-renderer@0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@iamstarkov/listr-update-renderer/-/listr-update-renderer-0.4.1.tgz#d7c48092a2dcf90fd672b6c8b458649cb350c77e" + integrity sha512-IJyxQWsYDEkf8C8QthBn5N8tIUR9V9je6j3sMIpAkonaadjbvxmRC6RAhpa3RKxndhNnU2M6iNbtJwd7usQYIA== + dependencies: + chalk "^1.1.3" + cli-truncate "^0.2.1" + elegant-spinner "^1.0.1" + figures "^1.7.0" + indent-string "^3.0.0" + log-symbols "^1.0.2" + log-update "^2.3.0" + strip-ansi "^3.0.1" + "@samverschueren/stream-to-observable@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz#ecdf48d532c58ea477acfcab80348424f8d0662f" @@ -44,7 +58,7 @@ "@types/connect" "*" "@types/node" "*" -"@types/bull@^3.3.12": +"@types/bull@3.4.0": version "3.4.0" resolved "https://registry.yarnpkg.com/@types/bull/-/bull-3.4.0.tgz#18ffefefa4dd1cfbdbdc8ca7df56c934459f6b9d" integrity sha512-NVD2X+cUu1qNv6blsOfCr2fVsD3+O13U19dFuy9Du7PWfn1/gjFZEDk220uBuRSH5JyaP4nV6S8BLjsT5/bXUg== @@ -233,9 +247,9 @@ "@types/express" "*" "@types/node@*", "@types/node@^10.0.8": - version "10.12.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.8.tgz#d0a3ab5a6e61458c492304e2776ac136b81db927" - integrity sha512-INamyRZG4rW3lDCUmwVd5Xho/bXvQm/v1yP8V0UN1RuInU7RoWoaO570b+yLX4Ia/0szsx1wa8VzcsVlsvbWLA== + version "10.12.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.12.tgz#e15a9d034d9210f00320ef718a50c4a799417c47" + integrity sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A== "@types/node@6.0.41": version "6.0.41" @@ -251,9 +265,9 @@ "@types/node" "*" "@types/oauth2-server@^3.0.8": - version "3.0.9" - resolved "https://registry.yarnpkg.com/@types/oauth2-server/-/oauth2-server-3.0.9.tgz#e3f32011862f03f399635c5916d5a383bca26fe2" - integrity sha512-NixZjyKS4TCM1mMr6QViK0rxR8iMHiE1utYje+ZGne1SgJQzLT3OOAjCrnRp70G+L8W1BXnzIPPaIxj1kYJHNg== + version "3.0.10" + resolved "https://registry.yarnpkg.com/@types/oauth2-server/-/oauth2-server-3.0.10.tgz#ea671a6ad3d02062aac5f7c1ba1fb9c468314db0" + integrity sha512-1XYQdBrBuGimRhGLk9XavjGY2h5IYmT0rTi3pDAWzq6xRWZp+LCAwNm8YNYdDwQxBp//eogtZePe8mS7QPDiNg== dependencies: "@types/express" "*" @@ -284,9 +298,9 @@ integrity sha512-HtKGu+qG1NPvYe1z7ezLsyIaXYyi8SoAVqWDZgDQ8dLrsZvSzUNCwZyfX33uhWxL/SU0ZDQZ3nwZ0nimt507Kw== "@types/redis@^2.8.5": - version "2.8.7" - resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.7.tgz#e0825093fb1af9d5b4a7246c6d7d1163cc842c35" - integrity sha512-ZMW8M5LRxU0D4u2GhnCEqJ1/mUJKSudlCWxeP1FRxfZQqr0Pb4tonPLzDEyRpC50uvEfAP3xOLjDuUOWi0QHCQ== + version "2.8.8" + resolved "https://registry.yarnpkg.com/@types/redis/-/redis-2.8.8.tgz#70855e79a6020080cca3cb5f1f5ee7f11b49a979" + integrity sha512-o/1ufNVPA92uum9HFbEiXXIHBuLywSwHQtAZoACMc1FhPXS5YftybBC1EI0zjdbUb273VVWF0Ivll/bq4g+gyw== dependencies: "@types/node" "*" @@ -341,9 +355,9 @@ "@types/node" "*" "@types/supertest@^2.0.3": - version "2.0.6" - resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.6.tgz#a0665350c0e36315e1bccdf4785f2b76fcb71b6b" - integrity sha512-qRvPP8dO7IBqJz8LaQ7/Lw2oo/geiDUPAMx/L+CQCkR9sN622O30XCH7RSyUmilyCSyjxyhJ7cEtd3hmwPwvhw== + version "2.0.7" + resolved "https://registry.yarnpkg.com/@types/supertest/-/supertest-2.0.7.tgz#46ff6508075cd4519736be060f0d6331a5c8ca7b" + integrity sha512-GibTh4OTkal71btYe2fpZP/rVHIPnnUsYphEaoywVHo+mo2a/LhlOFkIm5wdN0H0DA0Hx8x+tKgCYMD9elHu5w== dependencies: "@types/superagent" "*" @@ -477,9 +491,9 @@ ajv@^4.7.0: json-stable-stringify "^1.0.1" ajv@^6.5.5: - version "6.5.5" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.5.tgz#cf97cdade71c6399a92c6d6c4177381291b781a1" - integrity sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg== + version "6.6.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61" + integrity sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -844,9 +858,9 @@ binary-search@^1.3.4: integrity sha512-dPxU/vZLnH0tEVjVPgi015oSwqu6oLfCeHywuFRhBE0yM0mYocvleTl8qsdM1YFhRzTRhM1+VzS8XLDVrHPopg== bindings@^1.3.0, bindings@~1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" - integrity sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw== + version "1.3.1" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.1.tgz#21fc7c6d67c18516ec5aaa2815b145ff77b26ea5" + integrity sha512-i47mqjF9UbjxJhxGf+pZ6kSxrnI3wBLlnGI2ArWJ4r0VrvDS7ZYXkprq/pLaBWYq4GM0r4zdHY+NNRqEMU7uew== bindings@~1.2.1: version "1.2.1" @@ -1143,9 +1157,9 @@ builtins@^1.0.3: integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= bull@^3.4.2: - version "3.5.1" - resolved "https://registry.yarnpkg.com/bull/-/bull-3.5.1.tgz#b936a1306cb7e9dc1ac9c23a0dcaf41a1370effc" - integrity sha512-stbptND5+uRmzd6gIUJlC93fikXKyrJl53HGxzyqD0ahCMeyFRlaD5kN1i+PqfZSkcHKx/kK3HOJ8knum/Yi7A== + version "3.5.2" + resolved "https://registry.yarnpkg.com/bull/-/bull-3.5.2.tgz#9c85f205b17686efab2ee28aaa4388887360de32" + integrity sha512-tuL4Uj0kUeaQ7Cow3POkca20fk+VSsR8AiTFeNkyMmuicBnE1ZMwvF1NRDY7vIH43pD9PiMCSEP4Li/934Pw1w== dependencies: bluebird "^3.5.3" cron-parser "^2.5.0" @@ -1283,6 +1297,11 @@ camelcase@^4.0.0, camelcase@^4.1.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= +camelcase@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + camelize@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/camelize/-/camelize-1.0.0.tgz#164a5483e630fa4321e5af07020e531831b2609b" @@ -1447,14 +1466,14 @@ cli-columns@^3.1.2: string-width "^2.0.0" strip-ansi "^3.0.1" -cli-cursor@^1.0.1, cli-cursor@^1.0.2: +cli-cursor@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= dependencies: restore-cursor "^1.0.1" -cli-cursor@^2.0.0: +cli-cursor@^2.0.0, cli-cursor@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= @@ -1701,15 +1720,15 @@ concat-stream@^1.4.6, concat-stream@^1.5.0, concat-stream@^1.5.2: typedarray "^0.0.6" concurrently@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-4.0.1.tgz#f6310fbadf2f476dd95df952edb5c0ab789f672c" - integrity sha512-D8UI+mlI/bfvrA57SeKOht6sEpb01dKk+8Yee4fbnkk1Ue8r3S+JXoEdFZIpzQlXJGtnxo47Wvvg/kG4ba3U6Q== + version "4.1.0" + resolved "https://registry.yarnpkg.com/concurrently/-/concurrently-4.1.0.tgz#17fdf067da71210685d9ea554423ef239da30d33" + integrity sha512-pwzXCE7qtOB346LyO9eFWpkFJVO3JQZ/qU/feGeaAHiX1M3Rw3zgXKc5cZ8vSH5DGygkjzLFDzA/pwoQDkRNGg== dependencies: chalk "^2.4.1" date-fns "^1.23.0" lodash "^4.17.10" read-pkg "^4.0.1" - rxjs "6.2.2" + rxjs "^6.3.3" spawn-command "^0.0.2-1" supports-color "^4.5.0" tree-kill "^1.1.0" @@ -1723,10 +1742,10 @@ config-chain@~1.1.11: ini "^1.3.4" proto-list "~1.2.1" -config@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/config/-/config-2.0.1.tgz#995ccc8175460578d646ac0a2e4018ffa44ca046" - integrity sha512-aTaviJnC8ZjQYx8kQf4u6tWqIxWolyQQ3LqXgnCLAsIb78JrUshHG0YuzIarzTaVVe1Pazms3TXImfYra8UsyQ== +config@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/config/-/config-3.0.0.tgz#a71cdbb22d225df9eff20b95178d65a63c452367" + integrity sha512-QMr3BCOcHdgXx8t8cLfBhWtHcIAAMikaxUc2XASuH2A93g9kOIRch7sXFQdSvdMxhQobnctWm2y68YJYRttJlw== dependencies: json5 "^1.0.1" @@ -1830,7 +1849,16 @@ cors@^2.8.1: object-assign "^4" vary "^1" -cosmiconfig@^5.0.2, cosmiconfig@^5.0.6: +cosmiconfig@5.0.6: + version "5.0.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.6.tgz#dca6cf680a0bd03589aff684700858c81abeeb39" + integrity sha512-6DWfizHriCrFWURP1/qyhsiFvYdlJzbCzmtFWh744+KyWsJo5+kPzUZZaMRSSItoYc0pxFX7gEO7ZC1/gN/7AQ== + dependencies: + is-directory "^0.3.1" + js-yaml "^3.9.0" + parse-json "^4.0.0" + +cosmiconfig@^5.0.6: version "5.0.7" resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.0.7.tgz#39826b292ee0d78eda137dfa3173bd1c21a43b04" integrity sha512-PcLqxTKiDmNT6pSpy4N6KtuPwb53W+2tzNvwOZw0WH9N6O0vLIBq0x8aj8Oj75ere4YcGi48bDFCL+3fRJdlNA== @@ -1867,9 +1895,9 @@ create-torrent@^3.24.5, create-torrent@^3.33.0: simple-sha1 "^2.0.0" cron-parser@^2.5.0: - version "2.7.1" - resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-2.7.1.tgz#d08c00b1e220db564fd1cecb5019c8dd450f84d1" - integrity sha512-gupE4KsGEVtp5X4YbUlQx6NiFt3e+VOhREPI4ZXS9FT5JcOjfw2ey1EUv3J6XWrxHR1aKYrk4uJDmdRjG39bgA== + version "2.7.3" + resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-2.7.3.tgz#12603f89f5375af353a9357be2543d3172eac651" + integrity sha512-t9Kc7HWBWPndBzvbdQ1YG9rpPRB37Tb/tTviziUOh1qs3TARGh3b1p+tnkOHNe1K5iI3oheBPgLqwotMM7+lpg== dependencies: is-nan "^1.2.1" moment-timezone "^0.5.23" @@ -1993,18 +2021,11 @@ debuglog@^1.0.0, debuglog@^1.0.1: resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= -decamelize@^1.1.1: +decamelize@^1.1.1, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= -decamelize@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-2.0.0.tgz#656d7bbc8094c4c788ea53c5840908c9c7d063c7" - integrity sha512-Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg== - dependencies: - xregexp "4.0.0" - decode-uri-component@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" @@ -2644,10 +2665,10 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-template@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.1.tgz#981f188c0c3a87d2e28f559bc541426ff94f21dd" - integrity sha512-cebqLtV8KOZfw0UI8TEFWxtczxxC1jvyUvx6H4fyp1K1FN7A4Q+uggVUlOsI1K8AGU0rwOGqP8nCapdrw8CYQg== +expand-template@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== expect-ct@0.1.1: version "0.1.1" @@ -2837,6 +2858,13 @@ figures@^1.3.5, figures@^1.7.0: escape-string-regexp "^1.0.5" object-assign "^4.1.0" +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= + dependencies: + escape-string-regexp "^1.0.5" + file-entry-cache@^1.1.1: version "1.3.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-1.3.1.tgz#44c61ea607ae4be9c1402f41f44270cbfe334ff8" @@ -3420,9 +3448,9 @@ has-values@^1.0.0: kind-of "^4.0.0" hash.js@^1.0.0: - version "1.1.5" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" - integrity sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA== + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.1" @@ -3557,9 +3585,9 @@ humanize-ms@^1.2.1: ms "^2.0.0" husky@^1.0.0-rc.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/husky/-/husky-1.1.4.tgz#92f61383527d2571e9586234e5864356bfaceaa9" - integrity sha512-cZjGpS7qsaBSo3fOMUuR7erQloX3l5XzL1v/RkIqU6zrQImDdU70z5Re9fGDp7+kbYlM2EtS4aYMlahBeiCUGw== + version "1.2.0" + resolved "https://registry.yarnpkg.com/husky/-/husky-1.2.0.tgz#d631dda1e4a9ee8ba69a10b0c51a0e2c66e711e5" + integrity sha512-/ib3+iycykXC0tYIxsyqierikVa9DA2DrT32UEirqNEFVqOj1bFMTgP3jAz8HM7FgC/C8pc/BTUa9MV2GEkZaA== dependencies: cosmiconfig "^5.0.6" execa "^1.0.0" @@ -4483,13 +4511,14 @@ libxmljs@0.19.5: node-pre-gyp "~0.11.0" lint-staged@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.0.4.tgz#d3c909fcf7897152cdce2d6e42500cd9b5b41a0d" - integrity sha512-Rs0VxXoyFqHMrPQgKAMy+O907+m5Po71UVPhBi7BUBwU7ZZ2aoc+mZmpOX3DVPCoTcy6+hqJa9yIZfacNpJHdg== + version "8.1.0" + resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-8.1.0.tgz#dbc3ae2565366d8f20efb9f9799d076da64863f2" + integrity sha512-yfSkyJy7EuVsaoxtUSEhrD81spdJOe/gMTGea3XaV7HyoRhTb9Gdlp6/JppRZERvKSEYXP9bjcmq6CA5oL2lYQ== dependencies: + "@iamstarkov/listr-update-renderer" "0.4.1" chalk "^2.3.1" commander "^2.14.1" - cosmiconfig "^5.0.2" + cosmiconfig "5.0.6" debug "^3.1.0" dedent "^0.7.0" del "^3.0.0" @@ -4500,7 +4529,6 @@ lint-staged@^8.0.4: is-windows "^1.0.2" jest-validate "^23.5.0" listr "^0.14.2" - listr-update-renderer "https://github.com/okonet/listr-update-renderer/tarball/upgrade-log-update" lodash "^4.17.5" log-symbols "^2.2.0" micromatch "^3.1.8" @@ -4518,9 +4546,10 @@ listr-silent-renderer@^1.1.1: resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" integrity sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4= -listr-update-renderer@^0.4.0, "listr-update-renderer@https://github.com/okonet/listr-update-renderer/tarball/upgrade-log-update": - version "0.4.0" - resolved "https://github.com/okonet/listr-update-renderer/tarball/upgrade-log-update#06073fa93166277607a7814f4e1f83960081414c" +listr-update-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz#4ea8368548a7b8aecb7e06d8c95cb45ae2ede6a2" + integrity sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA== dependencies: chalk "^1.1.3" cli-truncate "^0.2.1" @@ -4531,30 +4560,30 @@ listr-update-renderer@^0.4.0, "listr-update-renderer@https://github.com/okonet/l log-update "^2.3.0" strip-ansi "^3.0.1" -listr-verbose-renderer@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" - integrity sha1-ggb0z21S3cWCfl/RSYng6WWTOjU= +listr-verbose-renderer@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz#f1132167535ea4c1261102b9f28dac7cba1e03db" + integrity sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw== dependencies: - chalk "^1.1.3" - cli-cursor "^1.0.2" + chalk "^2.4.1" + cli-cursor "^2.1.0" date-fns "^1.27.2" - figures "^1.7.0" + figures "^2.0.0" listr@^0.14.2: - version "0.14.2" - resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.2.tgz#cbe44b021100a15376addfc2d79349ee430bfe14" - integrity sha512-vmaNJ1KlGuGWShHI35X/F8r9xxS0VTHh9GejVXwSN20fG5xpq3Jh4bJbnumoT6q5EDM/8/YP1z3YMtQbFmhuXw== + version "0.14.3" + resolved "https://registry.yarnpkg.com/listr/-/listr-0.14.3.tgz#2fea909604e434be464c50bddba0d496928fa586" + integrity sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA== dependencies: "@samverschueren/stream-to-observable" "^0.3.0" is-observable "^1.1.0" is-promise "^2.1.0" is-stream "^1.1.0" listr-silent-renderer "^1.1.1" - listr-update-renderer "^0.4.0" - listr-verbose-renderer "^0.4.0" - p-map "^1.1.1" - rxjs "^6.1.0" + listr-update-renderer "^0.5.0" + listr-verbose-renderer "^0.5.0" + p-map "^2.0.0" + rxjs "^6.3.3" load-ip-set@^2.1.0: version "2.1.0" @@ -4791,9 +4820,9 @@ lowercase-keys@^1.0.0: integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== + 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" @@ -5054,9 +5083,9 @@ mime@^1.3.4, mime@^1.4.1: integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" - integrity sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg== + version "2.4.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" + integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w== mimelib@^0.3.0: version "0.3.1" @@ -5386,9 +5415,9 @@ node-abi@^2.2.0: semver "^5.4.1" node-addon-api@^1.6.0: - version "1.6.1" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.6.1.tgz#a9881c8dbc6400bac6ddedcb96eccf8051678536" - integrity sha512-GcLOYrG5/enbqH4SMsqXt6GQUQGGnDnE3FLDZzXYkCgQHuZV5UDFR+EboeY8kpG0avroyOjpFQ2qLEBosFcRIA== + version "1.6.2" + resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.6.2.tgz#d8aad9781a5cfc4132cc2fecdbdd982534265217" + integrity sha512-479Bjw9nTE5DdBSZZWprFryHGjUaQC31y1wHo19We/k0BZlrmhqQitWoUL0cD8+scljCbIUL+E58oRDEakdGGA== node-fetch-npm@^2.0.2: version "2.0.2" @@ -5484,20 +5513,20 @@ nodemailer-shared@^1.1.0: nodemailer-fetch "1.6.0" nodemailer@^4.4.2: - version "4.6.8" - resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-4.6.8.tgz#f82fb407828bf2e76d92acc34b823d83e774f89c" - integrity sha512-A3s7EM/426OBIZbLHXq2KkgvmKbn2Xga4m4G+ZUA4IaZvG8PcZXrFh+2E4VaS2o+emhuUVRnzKN2YmpkXQ9qwA== + version "4.7.0" + resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-4.7.0.tgz#4420e06abfffd77d0618f184ea49047db84f4ad8" + integrity sha512-IludxDypFpYw4xpzKdMAozBSkzKHmNBvGanUREjJItgJ2NYcK/s8+PggVhj7c2yGFQykKsnnmv1+Aqo0ZfjHmw== nodemon@^1.18.6: - version "1.18.6" - resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.6.tgz#89b1136634d6c0afc7de24cc932a760e999e2c76" - integrity sha512-4pHQNYEZun+IkIC2jCaXEhkZnfA7rQe73i8RkdRyDJls/K+WxR7IpI5uNUsAvQ0zWvYcCDNGD+XVtw2ZG86/uQ== + version "1.18.7" + resolved "https://registry.yarnpkg.com/nodemon/-/nodemon-1.18.7.tgz#716b66bf3e89ac4fcfb38a9e61887a03fc82efbb" + integrity sha512-xuC1V0F5EcEyKQ1VhHYD13owznQbUw29JKvZ8bVH7TmuvVNHvvbp9pLgE4PjTMRJVe0pJ8fGRvwR2nMiosIsPQ== dependencies: chokidar "^2.0.4" debug "^3.1.0" ignore-by-default "^1.0.1" minimatch "^3.0.4" - pstree.remy "^1.1.0" + pstree.remy "^1.1.2" semver "^5.5.0" supports-color "^5.2.0" touch "^3.1.0" @@ -6051,6 +6080,11 @@ p-map@^1.1.1: 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-try@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" @@ -6270,7 +6304,7 @@ pg-hstore@^2.3.2: dependencies: underscore "^1.7.0" -pg-pool@~2.0.3: +pg-pool@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/pg-pool/-/pg-pool-2.0.4.tgz#05ad0f2d9437d89c94ccc4f4d0a44ac65ade865b" integrity sha512-Mi2AsmlFkVMpI28NreaDkz5DkfxLOG16C/HNwi091LDlOiDiQACtAroLxSd1vIS2imBqxdjjO9cQZg2CwsOPbw== @@ -6286,14 +6320,14 @@ pg-types@~1.12.1: postgres-interval "^1.1.0" pg@^7.4.1: - version "7.6.1" - resolved "https://registry.yarnpkg.com/pg/-/pg-7.6.1.tgz#42c68aed37bf38b813616e3d21f4338f350c1b79" - integrity sha512-rAItIkYrRaNGinZN/Hs8F9R5mQjQSPlnzxPF+eCimSl92qnuNGR42gkpOQKP1bnvTwkSjRTBL+VNC5EcFhtCuQ== + version "7.7.1" + resolved "https://registry.yarnpkg.com/pg/-/pg-7.7.1.tgz#546b192ff484322b69689391f885de3ba91a30d4" + integrity sha512-p3I0mXOmUvCoVlCMFW6iYSrnguPol6q8He15NGgSIdM3sPGjFc+8JGCeKclw8ZR4ETd+Jxy2KNiaPUcocHZeMw== dependencies: buffer-writer "2.0.0" packet-reader "0.3.1" pg-connection-string "0.1.3" - pg-pool "~2.0.3" + pg-pool "^2.0.4" pg-types "~1.12.1" pgpass "1.x" semver "4.3.2" @@ -6396,12 +6430,12 @@ postgres-interval@^1.1.0: xtend "^4.0.0" prebuild-install@^5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.2.1.tgz#87ba8cf17c65360a75eefeb3519e87973bf9791d" - integrity sha512-9DAccsInWHB48TBQi2eJkLPE049JuAI6FjIH0oIrij4bpDVEbX6JvlWRAcAAlUqBHhjgq0jNqA3m3bBXWm9v6w== + version "5.2.2" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-5.2.2.tgz#237888f21bfda441d0ee5f5612484390bccd4046" + integrity sha512-4e8VJnP3zJdZv/uP0eNWmr2r9urp4NECw7Mt1OSAi3rcLrbBRxGiAkfUFtre2MhQ5wfREAjRV+K1gubvs/GPsA== dependencies: detect-libc "^1.0.3" - expand-template "^1.0.2" + expand-template "^2.0.3" github-from-package "0.0.0" minimist "^1.2.0" mkdirp "^0.5.1" @@ -6529,7 +6563,7 @@ psl@^1.1.24: resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== -pstree.remy@^1.1.0: +pstree.remy@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.2.tgz#4448bbeb4b2af1fed242afc8dc7416a6f504951a" integrity sha512-vL6NLxNHzkNTjGJUpMm5PLC+94/0tTlC1vkP9bdU0pOHih+EujMjgMTwfZopZvHWRFbqJ5Y73OMoau50PewDDA== @@ -6587,11 +6621,16 @@ qs@4.0.0: resolved "https://registry.yarnpkg.com/qs/-/qs-4.0.0.tgz#c31d9b74ec27df75e543a86c78728ed8d4623607" integrity sha1-wx2bdOwn33XlQ6hseHKO2NRiNgc= -qs@6.5.2, qs@^6.5.1, qs@~6.5.2: +qs@6.5.2, qs@~6.5.2: version "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.1: + version "6.6.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.6.0.tgz#a99c0f69a8d26bf7ef012f871cdabb0aee4424c2" + integrity sha512-KIJqT9jQJDQx5h5uAVPimw6yVg2SekOKu959OCtktD3FjzbpvaPr8i4zzg07DOMz+igA4W/aNM7OV8H37pFYfA== + query-string@^6.1.0: version "6.2.0" resolved "https://registry.yarnpkg.com/query-string/-/query-string-6.2.0.tgz#468edeb542b7e0538f9f9b1aeb26f034f19c86e1" @@ -7077,14 +7116,7 @@ rx-lite@^3.1.2: resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI= -rxjs@6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.2.2.tgz#eb75fa3c186ff5289907d06483a77884586e1cf9" - integrity sha512-0MI8+mkKAXZUF9vMrEoPnaoHkfzBPP4IGwUYRJhIRJF6/w3uByO1e91bEHn8zd43RdkTMKiooYKmwz7RH6zfOQ== - dependencies: - tslib "^1.9.0" - -rxjs@^6.1.0: +rxjs@^6.3.3: version "6.3.3" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" integrity sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw== @@ -7869,10 +7901,10 @@ string2compact@^1.1.1, string2compact@^1.2.5: addr-to-ip-port "^1.0.1" ipaddr.js "^1.0.1" -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" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== dependencies: safe-buffer "~5.1.0" @@ -7881,6 +7913,13 @@ string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + stringify-object@^3.2.2: version "3.3.0" resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz#703065aefca19300d3ce88af4f5b3956d7556629" @@ -8342,9 +8381,9 @@ tsutils@^2.27.2: tslib "^1.8.1" tsutils@^3.0.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.5.0.tgz#42602f7df241e753a2105cc3627a664abf11f745" - integrity sha512-/FZ+pEJQixWruFejFxNPRSwg+iF6aw7PYZVRqUscJ7EnzV3zieI8byfZziUR7QjCuJFulq8SEe9JcGflO4ze4Q== + version "3.5.2" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.5.2.tgz#6fd3c2d5a731e83bb21b070a173ec0faf3a8f6d3" + integrity sha512-qIlklNuI/1Dzfm+G+kJV5gg3gimZIX5haYtIVQe7qGyKd7eu8T1t1DY6pz4Sc2CGXAj9s1izycctm9Zfl9sRuQ== dependencies: tslib "^1.8.1" @@ -8411,9 +8450,9 @@ typedarray@^0.0.6: integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= typescript@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68" - integrity sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA== + version "3.2.1" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.1.tgz#0b7a04b8cf3868188de914d9568bd030f0c56192" + integrity sha512-jw7P2z/h6aPT4AENXDGjcfHTu5CSqzsbZc6YlUIebTyBAq8XaKp78x7VcSh30xwSCcsu5irZkYZUSFP1MrAMbg== uid-number@0.0.6: version "0.0.6" @@ -8720,9 +8759,9 @@ wcwidth@^1.0.0: defaults "^1.0.3" webfinger.js@^2.6.6: - version "2.6.6" - resolved "https://registry.yarnpkg.com/webfinger.js/-/webfinger.js-2.6.6.tgz#52ebdc85da8c8fb6beb690e8e32594c99d2ff4ae" - integrity sha512-dQpuL01XtluQ9Ndgu62o3pEmIe/ssDoIE0CQsOyavGl04xyHal+Ge4gFerw5V0BFoLTQpD8ZZqaDzb43hG9atw== + version "2.7.0" + resolved "https://registry.yarnpkg.com/webfinger.js/-/webfinger.js-2.7.0.tgz#403354a14a65aeeba64c1408c18a387487cea106" + integrity sha512-l+UtsuV4zrBKyVAj9VCtwWgscTgadCsdGgL1OvbV102cvydWwJCGXlFIXauzWLzfheIDHfPNRWfgMuwyC6ZfIA== dependencies: xhr2 "^0.1.4" @@ -8909,9 +8948,9 @@ ws@1.1.2: ultron "1.0.x" ws@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.0.tgz#119a9dbf92c54e190ec18d10e871d55c95cf9373" - integrity sha512-H3dGVdGvW2H8bnYpIDc3u3LH8Wue3Qh+Zto6aXXFzvESkTVT6rAfKR6tR/+coaUvxs8yHtmNV0uioBF62ZGSTg== + version "6.1.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" + integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw== dependencies: async-limiter "~1.0.0" @@ -8936,16 +8975,16 @@ xhr2@^0.1.4: integrity sha1-f4dliEdxbbUCYyOBL4GMras4el8= xliff@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/xliff/-/xliff-4.1.0.tgz#32ea268a6442c122e132e6abf874539b1fc9c6b3" - integrity sha512-BlqCVTd16GLNx4TAll1Ebs1Gswh6g/Mx/9z6cXmbNTVqy7iqXAAwZjmhE2G1fX+++xoXy0IufPp+DOv8tJC/pA== + version "4.1.2" + resolved "https://registry.yarnpkg.com/xliff/-/xliff-4.1.2.tgz#eb6fae21346d82653febd44d478f5748ad79fbd2" + integrity sha512-ru+ya+rz2cb+D3Or9sf5xrj0MCL+q+vZmWOJlqZehIWlG3hqeIXhbfLMDAW9A5BsnRfL+BdMBHaogaTUGHyMyA== dependencies: - xml-js "1.6.7" + xml-js "1.6.8" -xml-js@1.6.7: - version "1.6.7" - resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.7.tgz#a99b40c18a16d3e06537b3ae026a27bd60ffe8ab" - integrity sha512-1hn0xwwfMcWywnJxqiOXiv+pZaOJyf/YWcUeqJICF0BFb+IOkRFSkKyeA0V62WqTHXNdBxNuCFHhS/w2DtYpoA== +xml-js@1.6.8: + version "1.6.8" + resolved "https://registry.yarnpkg.com/xml-js/-/xml-js-1.6.8.tgz#e06419c54235f18f4c2cdda824cbd65a782330de" + integrity sha512-kUv/geyN80d+s1T68uBfjoz+PjNUjwwf5AWWRwKRqqQaGozpMVsFsKYnenPsxlbN/VL7f0ia8NfLLPCDwX+95Q== dependencies: sax "^1.2.4" @@ -8977,11 +9016,6 @@ xmlhttprequest-ssl@1.5.3: resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz#185a888c04eca46c3e4070d99f7b49de3528992d" integrity sha1-GFqIjATspGw+QHDZn3tJ3jUomS0= -xregexp@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-4.0.0.tgz#e698189de49dd2a18cc5687b05e17c8e43943020" - integrity sha512-PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg== - "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" @@ -9003,16 +9037,17 @@ yallist@^2.1.2: integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== -yargs-parser@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-10.1.0.tgz#7202265b89f7e9e9f2e5765e0fe735a905edbaa8" - integrity sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ== +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== dependencies: - camelcase "^4.1.0" + camelcase "^5.0.0" + decamelize "^1.2.0" yargs-parser@^8.0.0: version "8.1.0" @@ -9047,12 +9082,12 @@ yargs@^11.0.0: yargs-parser "^9.0.2" yargs@^12.0.1, yargs@^12.0.2: - version "12.0.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.2.tgz#fe58234369392af33ecbef53819171eff0f5aadc" - integrity sha512-e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ== + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== dependencies: cliui "^4.0.0" - decamelize "^2.0.0" + decamelize "^1.2.0" find-up "^3.0.0" get-caller-file "^1.0.1" os-locale "^3.0.0" @@ -9062,7 +9097,7 @@ yargs@^12.0.1, yargs@^12.0.2: string-width "^2.0.0" which-module "^2.0.0" y18n "^3.2.1 || ^4.0.0" - yargs-parser "^10.1.0" + yargs-parser "^11.1.1" yeast@0.1.2: version "0.1.2" @@ -9085,9 +9120,9 @@ youtube-dl@^1.12.2: streamify "^0.2.9" z-schema@^3.24.1: - version "3.24.1" - resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-3.24.1.tgz#07a3643c8e061ec1af32e823c9f9e5e5e56e3c8d" - integrity sha512-2eR8eq/v1coNqyBc5HzswEcoLbw+S33RMnR326uiuOIr97ve5vwPNMDrKS1IRCB12bZ3a8BrfGxrRwuSXUyPvw== + version "3.24.2" + resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-3.24.2.tgz#193560e718812d98fdc190c38871b634b92f2386" + integrity sha512-Zb2YLJ9g72MexBXKPRzoypd4OZfVkFghdy10eVbcMNLl9YQsPXtyMpiK7a3sG7IIERg1lEDjEMrG9Km9DPbWLw== dependencies: core-js "^2.5.7" lodash.get "^4.0.0" -- cgit v1.2.3 From d639c3bf14bd490ab99b41b2feee5a3b91267436 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 4 Dec 2018 10:07:43 +0100 Subject: Improve tools doc --- support/doc/tools.md | 80 ++++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/support/doc/tools.md b/support/doc/tools.md index 1c7739525..5a1f212b1 100644 --- a/support/doc/tools.md +++ b/support/doc/tools.md @@ -4,13 +4,13 @@ **Table of Contents** -- [CLI wrapper](#cli-wrapper) - [Remote Tools](#remote-tools) - [Dependencies](#dependencies) - [Installation](#installation) - - [peertube-import-videos.js](#peertube-import-videosjs) - - [peertube-upload.js](#peertube-uploadjs) - - [peertube-watch.js](#peertube-watchjs) + - [CLI wrapper](#cli-wrapper) + - [peertube-import-videos.js](#peertube-import-videosjs) + - [peertube-upload.js](#peertube-uploadjs) + - [peertube-watch.js](#peertube-watchjs) - [Server tools](#server-tools) - [parse-log](#parse-log) - [create-transcoding-job.js](#create-transcoding-jobjs) @@ -26,9 +26,40 @@ -## CLI wrapper +## Remote Tools + +You need at least 512MB RAM to run the script. +Scripts can be launched directly from a PeerTube server, or from a separate server, even a desktop PC. +You need to follow all the following steps even if you are on a PeerTube server (including cloning the git repository in a different directory than your production installation because the scripts utilize non-production dependencies). + +### Dependencies + +Install the [PeerTube dependencies](dependencies.md). + +### Installation + +Clone the PeerTube repo to get the latest version (even if you are on your PeerTube server): + +``` +$ git clone https://github.com/Chocobozzz/PeerTube.git +$ CLONE="$(pwd)/PeerTube" +``` + +Run ``yarn install --pure-lockfile`` +``` +$ cd ${CLONE} +$ yarn install --pure-lockfile +``` + +Build server tools: +``` +$ cd ${CLONE} +$ npm run build:server +``` + +### CLI wrapper -The wrapper provides a convenient interface to most scripts, and requires the [same dependencies](#dependencies). You can access it as `peertube` via an alias in your `.bashrc` like `alias peertube="node ${PEERTUBE_PATH}/dist/server/tools/peertube.js"`: +The wrapper provides a convenient interface to the following scripts. You can access it as `peertube` via an alias in your `.bashrc` like `alias peertube="node /your/peertube/directory/dist/server/tools/peertube.js"`: ``` Usage: peertube [command] [options] @@ -72,38 +103,7 @@ And now that your video is online, you can watch it from the confort of your ter $ peertube watch https://peertube.cpy.re/videos/watch/e8a1af4e-414a-4d58-bfe6-2146eed06d10 ``` -## Remote Tools - -You need at least 512MB RAM to run the script. -Scripts can be launched directly from a PeerTube server, or from a separate server, even a desktop PC. -You need to follow all the following steps even if you are on a PeerTube server (including cloning the git repository in a different directory than your production installation because the scripts utilize non-production dependencies). - -### Dependencies - -Install the [PeerTube dependencies](dependencies.md). - -### Installation - -Clone the PeerTube repo to get the latest version (even if you are on your PeerTube server): - -``` -$ git clone https://github.com/Chocobozzz/PeerTube.git -$ CLONE="$(pwd)/PeerTube" -``` - -Run ``yarn install`` -``` -$ cd ${CLONE} -$ yarn install -``` - -Build server tools: -``` -$ cd ${CLONE} -$ npm run build:server -``` - -### peertube-import-videos.js +#### peertube-import-videos.js You can use this script to import videos from all [supported sites of youtube-dl](https://rg3.github.io/youtube-dl/supportedsites.html) into PeerTube. Be sure you own the videos or have the author's authorization to do so. @@ -133,7 +133,7 @@ Already downloaded videos will not be uploaded twice, so you can run and re-run Videos will be publicly available after transcoding (you can see them before that in your account on the web interface). -### peertube-upload.js +#### peertube-upload.js You can use this script to import videos directly from the CLI. @@ -144,7 +144,7 @@ $ cd ${CLONE} $ node dist/server/tools/peertube-upload.js --help ``` -### peertube-watch.js +#### peertube-watch.js You can use this script to play videos directly from the CLI. -- cgit v1.2.3 From 06471769fc29a82446ed5da6c65d2e9219bec73b Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 4 Dec 2018 10:29:28 +0100 Subject: Upgrade client dependencies --- client/package.json | 36 +- client/src/app/core/core.module.ts | 2 +- client/yarn.lock | 1375 ++++++++++++++++++++---------------- 3 files changed, 775 insertions(+), 638 deletions(-) diff --git a/client/package.json b/client/package.json index 3761a641a..62ae47184 100644 --- a/client/package.json +++ b/client/package.json @@ -63,26 +63,26 @@ "setupTestFrameworkScriptFile": "/src/setupJest.ts" }, "devDependencies": { - "@angular-devkit/build-angular": "~0.10.0", - "@angular/animations": "~7.0.2", - "@angular/cli": "~7.0.4", - "@angular/common": "~7.0.2", - "@angular/compiler": "~7.0.2", - "@angular/compiler-cli": "~7.0.2", - "@angular/core": "~7.0.2", - "@angular/forms": "~7.0.2", - "@angular/http": "~7.0.2", - "@angular/language-service": "~7.0.2", - "@angular/platform-browser": "~7.0.2", - "@angular/platform-browser-dynamic": "~7.0.2", - "@angular/router": "~7.0.2", - "@angular/service-worker": "~7.0.2", + "@angular-devkit/build-angular": "~0.11.1", + "@angular/animations": "~7.1.1", + "@angular/cli": "~7.1.1", + "@angular/common": "~7.1.1", + "@angular/compiler": "~7.1.1", + "@angular/compiler-cli": "~7.1.1", + "@angular/core": "~7.1.1", + "@angular/forms": "~7.1.1", + "@angular/http": "~7.1.1", + "@angular/language-service": "~7.1.1", + "@angular/platform-browser": "~7.1.1", + "@angular/platform-browser-dynamic": "~7.1.1", + "@angular/router": "~7.1.1", + "@angular/service-worker": "~7.1.1", "@angularclass/hmr": "^2.1.3", "@neos21/bootstrap3-glyphicons": "^1.0.1", "@ng-bootstrap/ng-bootstrap": "^4.0.0", - "@ngx-loading-bar/core": "^2.2.0", - "@ngx-loading-bar/http-client": "^2.2.0", - "@ngx-loading-bar/router": "^2.2.0", + "@ngx-loading-bar/core": "^3.0.0", + "@ngx-loading-bar/http-client": "^3.0.0", + "@ngx-loading-bar/router": "^3.0.0", "@ngx-meta/core": "^6.0.0-rc.1", "@ngx-translate/i18n-polyfill": "^1.0.0", "@types/core-js": "^2.5.0", @@ -132,7 +132,7 @@ "node-sass": "^4.9.3", "npm-font-source-sans-pro": "^1.0.2", "path-browserify": "^1.0.0", - "primeng": "^6.1.2", + "primeng": "^7.0.0", "process": "^0.11.10", "protractor": "^5.3.2", "purify-css": "^1.2.5", diff --git a/client/src/app/core/core.module.ts b/client/src/app/core/core.module.ts index df2ec696d..8a6654aa1 100644 --- a/client/src/app/core/core.module.ts +++ b/client/src/app/core/core.module.ts @@ -29,7 +29,7 @@ import { CheatSheetComponent } from '@app/core/hotkeys' LoadingBarHttpClientModule, LoadingBarRouterModule, - LoadingBarModule.forRoot(), + LoadingBarModule, HotkeyModule.forRoot({ cheatSheetCloseEsc: true diff --git a/client/yarn.lock b/client/yarn.lock index 928dec01e..98a30941e 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -2,26 +2,26 @@ # yarn lockfile v1 -"@angular-devkit/architect@0.10.6": - version "0.10.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.10.6.tgz#7007e7591be21eeb478951106c84c83802ca21a4" - integrity sha512-IygpkXNn946vVUFFWKWEDxRqRy888vOAUWcmkZzqPEBYkuwWt7WnLfe8Sjw4fH/+HLWEMS8RXbdSTHiiaP9qOg== +"@angular-devkit/architect@0.11.1": + version "0.11.1" + resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.11.1.tgz#fb8429b583d4d7efafe5ff551ffdd30a705b9ab0" + integrity sha512-MdcZ5KclwL2SBXCQSn8uI2hakBX58EyuAwFWsM/pKrNt9j8RqIk93l4amd2OkaMtZRFP5zWodyf/3qOwacjuQg== dependencies: - "@angular-devkit/core" "7.0.6" + "@angular-devkit/core" "7.1.1" rxjs "6.3.3" -"@angular-devkit/build-angular@~0.10.0": - version "0.10.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.10.6.tgz#9c713a786de89a68063bd9e86516eb450f2dac72" - integrity sha512-Lbx6rjIGB2mMmkTCaolrQ86OfPxO/qfb4l2RvPiSyx06MEZfmFWKGeJzqCYKBRQajziX3Yc3AFzAPecoCkbIGA== - dependencies: - "@angular-devkit/architect" "0.10.6" - "@angular-devkit/build-optimizer" "0.10.6" - "@angular-devkit/build-webpack" "0.10.6" - "@angular-devkit/core" "7.0.6" - "@ngtools/webpack" "7.0.6" +"@angular-devkit/build-angular@~0.11.1": + version "0.11.1" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.11.1.tgz#a828797d9177227aee70a65bb06d4b189b1404cd" + integrity sha512-hA/3GVMmRwOPXWhImrBG9gZTdERr937NMuedKhTXuNj6TNMNjk9XQ+q2erd0LZVbgfhL/nC0wHnpy0dUWXu8jA== + dependencies: + "@angular-devkit/architect" "0.11.1" + "@angular-devkit/build-optimizer" "0.11.1" + "@angular-devkit/build-webpack" "0.11.1" + "@angular-devkit/core" "7.1.1" + "@ngtools/webpack" "7.1.1" ajv "6.5.3" - autoprefixer "9.1.5" + autoprefixer "9.3.1" circular-dependency-plugin "5.0.2" clean-css "4.2.1" copy-webpack-plugin "4.5.4" @@ -34,7 +34,7 @@ less-loader "4.1.0" license-webpack-plugin "2.0.2" loader-utils "1.1.0" - mini-css-extract-plugin "0.4.3" + mini-css-extract-plugin "0.4.4" minimatch "3.0.4" opn "5.3.0" parse5 "4.0.0" @@ -48,45 +48,45 @@ semver "5.5.1" source-map-loader "0.2.4" source-map-support "0.5.9" - speed-measure-webpack-plugin "^1.2.3" + speed-measure-webpack-plugin "1.2.3" stats-webpack-plugin "0.7.0" - style-loader "0.23.0" + style-loader "0.23.1" stylus "0.54.5" stylus-loader "3.0.2" terser-webpack-plugin "1.1.0" tree-kill "1.2.0" - webpack "4.19.1" - webpack-dev-middleware "3.3.0" - webpack-dev-server "3.1.8" + webpack "4.23.1" + webpack-dev-middleware "3.4.0" + webpack-dev-server "3.1.10" webpack-merge "4.1.4" - webpack-sources "1.2.0" + webpack-sources "1.3.0" webpack-subresource-integrity "1.1.0-rc.6" optionalDependencies: - node-sass "4.9.3" + node-sass "4.10.0" -"@angular-devkit/build-optimizer@0.10.6": - version "0.10.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.10.6.tgz#ca7db9b3d5378b2759509692f02a5fb5af273dd0" - integrity sha512-oedg8F++8zZTmoTt141k3nlyPtrSSsQUZI9TFbSdfR1D5WDflwOlkLyRb5WoC53HSoQnagKxY2qzd7khVah//Q== +"@angular-devkit/build-optimizer@0.11.1": + version "0.11.1" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.11.1.tgz#1079737a44b26b39e35cea7f966a39cd11bbbf48" + integrity sha512-pyFP6ykZf8Iq8nRkgP2XKq8knpIG6ye0qYklnBC9815AC5RAO126Y4fmtd6tnH+5p1mQxnt5HegG0j5xOCgDRw== dependencies: loader-utils "1.1.0" source-map "0.5.6" typescript "3.1.6" webpack-sources "1.2.0" -"@angular-devkit/build-webpack@0.10.6": - version "0.10.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.10.6.tgz#d3acb781f97406a49a3e3adfcc49a8518d33e291" - integrity sha512-tPv23KKw3iAGCTF6noD7zdHbufny4A3d+mlX1VoJDiAa6jqmuFxhY2fALymc11MRY4HVtMF5J1kQy9BLGCDbQg== +"@angular-devkit/build-webpack@0.11.1": + version "0.11.1" + resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.11.1.tgz#bd98ff3dea633c5b77671b471e72cf6c91f6c679" + integrity sha512-p7fPHOi2Wfq2VPtnRVowg3n99MujghpOp6zW0gBJQD1TQhGVzPK6AX42S0NA4d05ahNBCDU2n7Y+5TjNJRIGJw== dependencies: - "@angular-devkit/architect" "0.10.6" - "@angular-devkit/core" "7.0.6" + "@angular-devkit/architect" "0.11.1" + "@angular-devkit/core" "7.1.1" rxjs "6.3.3" -"@angular-devkit/core@7.0.6": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.0.6.tgz#26c4cd4d271e8cd03f6e50b4ec30cbc606f3346e" - integrity sha512-RPSXUtLrpYDTqAEL0rCyDKxES76EomsPBvUUZTD6UkE2pihoh9ZIxkzhzlE+HU/xdqm28+smQYFhvvEAXFWwSQ== +"@angular-devkit/core@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.1.1.tgz#ce0a674f16188072988502cc3f073b15efcfe194" + integrity sha512-rODqECpOiV6vX+L1qd63GLiF3SG+V1O+d8WYtnKPOxnsMM9yWpWmqmroHtXfisjucu/zwoqj8HoO/noJZCfynw== dependencies: ajv "6.5.3" chokidar "2.0.4" @@ -94,48 +94,47 @@ rxjs "6.3.3" source-map "0.7.3" -"@angular-devkit/schematics@7.0.6": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.0.6.tgz#97fca028bd937e2319d9d34c12b82e8d1d99de23" - integrity sha512-S/3CrBDoh/BD4mBq8RNGQ8sgNFDsveCuFHDkOyct8+NDg2wcRkEGigyq8eZwVN/iVKCwjxc0I/bC336edoNMIQ== +"@angular-devkit/schematics@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.1.1.tgz#328ec6071c5ef3b1588a9f4bc97f5edfc3620b09" + integrity sha512-yjzTw8ZWMPg0Fc9VQCHNpUCAH7aiNxrUDs0IbhdC0CyKTBoqH+cx2xP4Z6ECf4uNwceLKJlE0l3ot42Ypnlziw== dependencies: - "@angular-devkit/core" "7.0.6" + "@angular-devkit/core" "7.1.1" rxjs "6.3.3" -"@angular/animations@~7.0.2": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-7.0.4.tgz#f53fc9f1bce3bf1afe60dcbc08b6863472f519e4" - integrity sha512-QfFikT0FzYNMjdVg0LWTBijdu9JDJyzejnhCFlXxv+KR4zolpRK98/rU7CFW1Fg2jjL3/yL9PT1sf5I0fTJZYA== +"@angular/animations@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-7.1.1.tgz#8fecbd19417364946a9ea40c8fdf32462110232f" + integrity sha512-iTNxhPPraCZsE4rgM23lguT1kDV4mfYAr+Bsi5J0+v9ZJA+VaKvi6eRW8ZGrx4/rDz6hzTnBn1jgPppHFbsOcw== dependencies: tslib "^1.9.0" -"@angular/cli@~7.0.4": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-7.0.6.tgz#f97bc9ca92785c7ce2e5f20819c48265a1da5b53" - integrity sha512-f76kq8AQMkloeojIffeT7DYLXT/J4DRhYoAPQR4E09V7lkigFCILiYzQs5RtCAX6EjlPxlrZKkdfnBn0OUPnig== - dependencies: - "@angular-devkit/architect" "0.10.6" - "@angular-devkit/core" "7.0.6" - "@angular-devkit/schematics" "7.0.6" - "@schematics/angular" "7.0.6" - "@schematics/update" "0.10.6" +"@angular/cli@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-7.1.1.tgz#c5dd2b92c5c3391f20262b5e530813e4e2d31777" + integrity sha512-lPVKsk035T5Ls0Mf83OngrNoLZu/ucZSjRLN/GWZK1O/YYVmb/dTgVl/a7HC+G480tWQ34nlqnCRbrP7sE9v7g== + dependencies: + "@angular-devkit/architect" "0.11.1" + "@angular-devkit/core" "7.1.1" + "@angular-devkit/schematics" "7.1.1" + "@schematics/angular" "7.1.1" + "@schematics/update" "0.11.1" inquirer "6.2.0" opn "5.3.0" - rxjs "6.3.3" semver "5.5.1" symbol-observable "1.2.0" -"@angular/common@~7.0.2": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@angular/common/-/common-7.0.4.tgz#aafb26ce59c967daa5b122393e1933208a247f72" - integrity sha512-akQojdqY/RBlItkDWAPI3k0Llk1wnbAp+f47yySi3cgQz9SaZ1/RLNWZV84I/cKrksb4ehorT/lTqRBojsAD1A== +"@angular/common@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular/common/-/common-7.1.1.tgz#f78f884614ef81ab2fd648f1aa3e83aae370a6c8" + integrity sha512-SngekFx9v39sjgi9pON0Wehxpu+NdUk7OEebw4Fa8dKqTgydTkuhmnNH+9WQe264asoeCt51oufPRjIqMLNohA== dependencies: tslib "^1.9.0" -"@angular/compiler-cli@~7.0.2": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-7.0.4.tgz#f96fc1c0aec27ee97ec5f13a8eb72bc8b964db97" - integrity sha512-kvhWt6OTb1Uduns9Vm+Dwd/UUBNSEU6Jgu+QOPeHr7lg+4NTyr9uQLU0DtfBP0ljOlds8esmfii5IIFTeUQw1Q== +"@angular/compiler-cli@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-7.1.1.tgz#c5f6225fb72b56f42fa78c332fdee9755c64604e" + integrity sha512-4NXlkDhOEQgaP3Agigqw93CvXJvsfnXa0xiglq9e/wjL+6XbtM9WcDb5lfRQz41N9RSkO3pEHGvKMweKZGgogA== dependencies: canonical-path "1.0.0" chokidar "^1.4.2" @@ -149,64 +148,64 @@ tslib "^1.9.0" yargs "9.0.1" -"@angular/compiler@~7.0.2": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-7.0.4.tgz#df91dab990c46b464705b0901d70d1cfdfd190e1" - integrity sha512-ExDhH1cJkuJkUsgNRZyZBse0a7wWkQyG5O8HONi3Rzig9dalFEuve9jD04zfA1Jx1GTXhovqtGnF72x4kw0V8Q== +"@angular/compiler@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-7.1.1.tgz#4efbcad27ab43d4cd36d936a8df2e073f6d02d0a" + integrity sha512-oJvBe8XZ+DXF/W/DxWBTbBcixJTuPeZWdkcZIGWhJoQP7K5GnGnj8ffP9Lp6Dh4TKv85awtC6OfIKhbHxa650Q== dependencies: tslib "^1.9.0" -"@angular/core@~7.0.2": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@angular/core/-/core-7.0.4.tgz#98340a1bdb53f0bbecfcfc9831a7a22a1540d79b" - integrity sha512-17SSmCz1wQoZKnVHF/T8UkWYPpDm5kPyoc1okkTTv8ZA2EAMMuZFFnRSAxEL5i7mNB9z5CvRqF2tRx/DbgbIRA== +"@angular/core@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular/core/-/core-7.1.1.tgz#9748b0103cd86226554e1ccbd0f43dd8c46f1ed1" + integrity sha512-Osig5SRgDRQ+Hec/liN7nq/BCJieB+4/pqRh9rFbOXezb2ptgRZqdXOXN8P17i4AwPVf308Mh55V0niJ5Eu3Rw== dependencies: tslib "^1.9.0" -"@angular/forms@~7.0.2": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-7.0.4.tgz#5f2328d297f5c7f9f3af81e1f76a13e1546c743f" - integrity sha512-W3nN9n1VY9On9+9f7PDRbzJUg+mMq1bjkhWsk/b7DfaYdmlzpG+Wd6OfArob2edsqGqH1dvTM8q8aGbWiFZ7dA== +"@angular/forms@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-7.1.1.tgz#d16ef10a901c007062fd19144cd77917ef55ee24" + integrity sha512-yCWuPjpu23Wc3XUw7v/ACNn/e249oT0bYlM8aaMQ1F5OwrmmC4NJC12Rpl9Ihza61RIHIKzNcHVEgzc7WhcSag== dependencies: tslib "^1.9.0" -"@angular/http@~7.0.2": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@angular/http/-/http-7.0.4.tgz#445d6a812d25ea1656fc3e3381ef82b3f98fccb4" - integrity sha512-oUGT7xS7FZYajuHq0DP6MgahacB5sJTRgxiUU4uhQ/mqV7aREODVJJgw7oHDhM7Cnyzzo0B9D0zpEljKmeCLWQ== +"@angular/http@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular/http/-/http-7.1.1.tgz#f19f17ad42e7f3cdabcf1250ca757640d0f02219" + integrity sha512-pRk+c/kz9aJ8te5xzCxlPLpFnwB0d/E9YkOo3/ydaXF9vZw13RTzk00YyzJ41PDzJf8oPDdXtueTQ+vtJ7Srtw== dependencies: tslib "^1.9.0" -"@angular/language-service@~7.0.2": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-7.0.4.tgz#db221f183725ff54c1188aec7acb2948e29f4c50" - integrity sha512-CuJ2Ii97sNoN1HOZOLxG1lEHsQFi8K/RSB/k2suWPKzdM53ldSkKoYRac38zW/uqNABYItgvxb7w0Vi7HhxLsg== +"@angular/language-service@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-7.1.1.tgz#6bbe35b2430ad54618a1803f881efb5894b296c9" + integrity sha512-X+5g20PMtNRGZIa3svMv4PLJdJehn4wqrS8nwOtzH5XkSn5vA3IxjsJVdSzAy2AN0/sKKJK5jmQorPtKO4saJg== -"@angular/platform-browser-dynamic@~7.0.2": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.0.4.tgz#69abb8c784bb71a660a0c824ca4a1a4960811a33" - integrity sha512-k1I53zIg8YWhtQizLfq/tWrUUdY5vHV8pGHyt0/UTGDqat5TORd6LDFfzCSux0r3qZujCOGNi9f4/AbyV8B9lw== +"@angular/platform-browser-dynamic@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.1.1.tgz#6945298446173338782f437a996226110cda0d3e" + integrity sha512-ZIu48Vn4S6gjD7CMbGlKGaPQ8v9rYkWzlNYi4vTYzgiqKKNC3hqLsVESU3mSvr5oeQBxSIBidTdHSyafHFrA2w== dependencies: tslib "^1.9.0" -"@angular/platform-browser@~7.0.2": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-7.0.4.tgz#57dfaa23f8a3d678bad6ca110051e3ac6622ff3d" - integrity sha512-4brYZZgsCJk1/a6JoSwaiVWO9+/T4iyE27dAgstao1nOf/jrBNKW2HnZtkWZmCCBK0WIk15wlB0Xr87OZbjNVA== +"@angular/platform-browser@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-7.1.1.tgz#a6bd408f656dc43ee5a2d8af3dfaa786c7c1dfca" + integrity sha512-I6OPjecynGJSbPtzu0gvEgSmIR6X6/xEAhg4L9PycW1ryjzptTC9klWRTWIqsIBqMxhVnY44uKLeRNrDwMOwyA== dependencies: tslib "^1.9.0" -"@angular/router@~7.0.2": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@angular/router/-/router-7.0.4.tgz#ae2c32cc6a29bfe6eb909b9c63257d187075f4ff" - integrity sha512-nt1jJsxN+JmYZ6URamMdULUpH4aHdnNVKjWtjDI0OpdZvPx7PMFD8cfc92q0tavy2KqqexcceIb4BIC965gtpA== +"@angular/router@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular/router/-/router-7.1.1.tgz#80a4cdffc03a529b73485c2ad63a30ec435364ea" + integrity sha512-jbnqEq/1iDBkeH8Vn13hauGPTzhwllWM+MLfmdNGTiMzGRx4pmkWa57seDOeBF/GNYBL9JjkWTCrkKFAc2FJKw== dependencies: tslib "^1.9.0" -"@angular/service-worker@~7.0.2": - version "7.0.4" - resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-7.0.4.tgz#be274843ae29cb69ac969c078edd8ae5b25e3e61" - integrity sha512-vBA9T1xeCP6QesOYhMyVpXTUVdXU4eMYdoZItHncyom8AxS2a26FB8zLW72VXdEfZ7xnJgcDtsYzYzVi+3DXsQ== +"@angular/service-worker@~7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-7.1.1.tgz#c9e6f0265d7e102d8271483519cf09a180f0e08b" + integrity sha512-xX00x0XMW47jEfYTZLwdJCqkmPE7+mdtlSeOGpjaKv6Y2hqZodz80RYgH5JltM4RKEzOvQolR6KmdKcw1ANs9Q== dependencies: tslib "^1.9.0" @@ -223,11 +222,11 @@ "@babel/highlight" "^7.0.0" "@babel/generator@^7.0.0", "@babel/generator@^7.1.6": - version "7.1.6" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.1.6.tgz#001303cf87a5b9d093494a4bf251d7b5d03d3999" - integrity sha512-brwPBtVvdYdGxtenbQgfCdDPmtkmUBZPjUoK5SXJEBuHaA5BCubh9ly65fzXz7R6o5rA76Rs22ES8Z+HCc0YIQ== + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.2.0.tgz#eaf3821fa0301d9d4aef88e63d4bcc19b73ba16c" + integrity sha512-BA75MVfRlFQG2EZgFYIwyT1r6xSkwfP2bdkY/kLZusEYWiJs4xCowab/alaEaT0wSvmVuXGqiefeBlP+7V1yKg== dependencies: - "@babel/types" "^7.1.6" + "@babel/types" "^7.2.0" jsesc "^2.5.1" lodash "^4.17.10" source-map "^0.5.0" @@ -266,14 +265,14 @@ js-tokens "^4.0.0" "@babel/parser@^7.0.0", "@babel/parser@^7.1.2", "@babel/parser@^7.1.6": - version "7.1.6" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.1.6.tgz#16e97aca1ec1062324a01c5a6a7d0df8dd189854" - integrity sha512-dWP6LJm9nKT6ALaa+bnL247GHHMWir3vSlZ2+IHgHgktZQx0L3Uvq2uAWcuzIe+fujRsYWBW2q622C5UvGK9iQ== + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.2.0.tgz#02d01dbc330b6cbf36b76ac93c50752c69027065" + integrity sha512-M74+GvK4hn1eejD9lZ7967qAwvqTZayQa3g10ag4s9uewgR7TKjeaT0YMyoq+gVfKYABiWZ4MQD701/t5e1Jhg== "@babel/runtime@^7.0.0": - version "7.1.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.1.5.tgz#4170907641cf1f61508f563ece3725150cc6fe39" - integrity sha512-xKnPpXG/pvK1B90JkwwxSGii90rQGKtzcMt2gI5G6+M0REXaq6rOHsGC2ay6/d0Uje7zzvSzjEzfR3ENhFlrfA== + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.2.0.tgz#b03e42eeddf5898e00646e4c840fa07ba8dcad7f" + integrity sha512-oouEibCbHMVdZSDlJBO6bZmID/zA/G/Qx3H1d3rSNPTD+L8UNKvCat7aKWSJ74zYbm5zWGh0GQN0hKj8zYFTCg== dependencies: regenerator-runtime "^0.12.0" @@ -301,10 +300,10 @@ globals "^11.1.0" lodash "^4.17.10" -"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.6": - version "7.1.6" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.1.6.tgz#0adb330c3a281348a190263aceb540e10f04bcce" - integrity sha512-DMiUzlY9DSjVsOylJssxLHSgj6tWM9PRFJOGW/RaOglVOK9nzTxoOMfTfRQXGUCUQ/HmlG2efwC+XqUEJ5ay4w== +"@babel/types@^7.0.0", "@babel/types@^7.1.2", "@babel/types@^7.1.6", "@babel/types@^7.2.0": + version "7.2.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.2.0.tgz#7941c5b2d8060e06f9601d6be7c223eef906d5d8" + integrity sha512-b4v7dyfApuKDvmPb+O488UlGuR1WbwMXFsO/cyqMrnfvRAChZKJAYeeglWTjUO1b9UghKKgepAQM5tsvBJca6A== dependencies: esutils "^2.0.2" lodash "^4.17.10" @@ -322,38 +321,38 @@ dependencies: tslib "^1.9.0" -"@ngtools/webpack@7.0.6": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-7.0.6.tgz#cc4f4189765f6743417b4eee946fb69590f93ce1" - integrity sha512-lOHpVqr30QXPuaOxSRasHv6ybDj4a1jVwSOk+W4aGqVlLi0bsngt9HrvgR+FALEoG9P520bytz16wma81Y2Aeg== +"@ngtools/webpack@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-7.1.1.tgz#c418e1cb0d70a77d06e8c32500fe2e92e606ea52" + integrity sha512-XW/YDjiDZlwOYK4YvGAIKIVEkqtdwPLwTWAmDbnfpEHQc8UALsBrzGdjze0jSfXQdQxkbmXo0aolZgNc7uL/wQ== dependencies: - "@angular-devkit/core" "7.0.6" + "@angular-devkit/core" "7.1.1" enhanced-resolve "4.1.0" rxjs "6.3.3" tree-kill "1.2.0" webpack-sources "1.2.0" -"@ngx-loading-bar/core@2.2.0", "@ngx-loading-bar/core@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ngx-loading-bar/core/-/core-2.2.0.tgz#ad313bbbd69e4c52cc2d6f0a8b5911272371d16a" - integrity sha512-0jcnEzuhqE/c+4iAumJ/0D4GBWm4RRVas0+qXpX4Wm225SJoE5KupUOlMrvLnJNK2bn8NW31dEj80kJ+UzhE5A== +"@ngx-loading-bar/core@3.0.0", "@ngx-loading-bar/core@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@ngx-loading-bar/core/-/core-3.0.0.tgz#86c6d036b5ad50950b5ea526db585f39d44f396a" + integrity sha512-DBH+bKf8M9uSk2791HbtN/JvcEmBxEbUCiOJ6PYrjbginH6dUn2NsSxnv3myu0lpx+7K3MusXLNImkB5JUh2QA== dependencies: tslib "^1.7.1" -"@ngx-loading-bar/http-client@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ngx-loading-bar/http-client/-/http-client-2.2.0.tgz#4b5443feed5c53bc5b5f06119f771edbe89799f4" - integrity sha512-+eilxs10KncQWg7DQJLK2AoWnmTPidhVHNxfTOPHJVnmcyAFmTtk+lQbf5Ke3aC4d/KXZklkRyBizqDfvRvc9w== +"@ngx-loading-bar/http-client@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@ngx-loading-bar/http-client/-/http-client-3.0.0.tgz#2fce2f60da37a48f2173ef4f08189eecf98d9215" + integrity sha512-7AHM3tmA2FDFXsKbL09vnRqqxdztpjilkP3U9zXB5Lkv3XtlJnZoQKFCSbmEusw30k3oAmY5id/ZE9X83uekZg== dependencies: - "@ngx-loading-bar/core" "2.2.0" + "@ngx-loading-bar/core" "3.0.0" tslib "^1.7.1" -"@ngx-loading-bar/router@^2.2.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ngx-loading-bar/router/-/router-2.2.0.tgz#c13c1a05c620a9da102102322685b671d3c9a1ba" - integrity sha512-/lrWc0ZwGcpmuoa26/h0rC7SRVKgCtsikhy0mVXwrb1VVJ+sRU8vNKbq7aidcvEY5vdi3l0Z7DcVq9+JV/i/BQ== +"@ngx-loading-bar/router@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@ngx-loading-bar/router/-/router-3.0.0.tgz#627e73be406dfdff48175f75c110bebd4f6fa588" + integrity sha512-UL3GaFyFfHwgGeAdSEG800Rl3GuBfKydPp21lD/paqdsrUT2Z1cBLAiVFw7U4QdnSLaPzngYr9bzgDFdy4GqYQ== dependencies: - "@ngx-loading-bar/core" "2.2.0" + "@ngx-loading-bar/core" "3.0.0" tslib "^1.7.1" "@ngx-meta/core@^6.0.0-rc.1": @@ -372,23 +371,25 @@ tslib "^1.9.0" yargs "10.0.3" -"@schematics/angular@7.0.6": - version "7.0.6" - resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.0.6.tgz#1173c201d118cf38d1afdb382e9a916e4b540a17" - integrity sha512-jOHL+vSu1cqAo3kRNDmgkq/GR2EDkJx5/h0VXGlbtdEpq892LipKHtyPgXa269AABgPKb3TSNBwZls6g2L9FCw== +"@schematics/angular@7.1.1": + version "7.1.1" + resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.1.1.tgz#4ee17a17d221eaf48009db0b991766d1074d0b4f" + integrity sha512-jMaj8y3rNTQQXuH38uoWfAOmwYjtzqo1RelNfACnT54mfO/Dat+k7WasBLHWuvzvnN4/Ga3kXL7sJpkeMciiIg== dependencies: - "@angular-devkit/core" "7.0.6" - "@angular-devkit/schematics" "7.0.6" + "@angular-devkit/core" "7.1.1" + "@angular-devkit/schematics" "7.1.1" typescript "3.1.6" -"@schematics/update@0.10.6": - version "0.10.6" - resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.10.6.tgz#616e6c321cd51468eacda7fc8a0306b37f8b4ca2" - integrity sha512-Yy/M4JosrVDb5tbpmi+v1uTHSmBYISOiuFVuxtpMN5DWdDNq/JTBEw2jy3quelGWHCU06rbGo578Ml3azGZ+9g== - dependencies: - "@angular-devkit/core" "7.0.6" - "@angular-devkit/schematics" "7.0.6" - npm-registry-client "8.6.0" +"@schematics/update@0.11.1": + version "0.11.1" + resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.11.1.tgz#5129a800043dc38ee1f1c879865e0df82ddac7ed" + integrity sha512-IzPXamoMpDb2eY2zSW4fPuuH+7RfJLte9XVzQM2y3ZTBhlJQFLqx7qJtOXdcXUboonC6o61KCayNDERFnDUdPg== + dependencies: + "@angular-devkit/core" "7.1.1" + "@angular-devkit/schematics" "7.1.1" + "@yarnpkg/lockfile" "1.1.0" + ini "1.3.5" + pacote "9.1.1" rxjs "6.3.3" semver "5.5.1" semver-intersect "1.4.0" @@ -405,10 +406,15 @@ resolved "https://registry.yarnpkg.com/@types/core-js/-/core-js-2.5.0.tgz#35cc282488de6f10af1d92902899a3b8ca3fbc47" integrity sha512-qjkHL3wF0JMHMqgm/kmL8Pf8rIiqvueEiZ0g6NVTcBX1WN46GWDr+V5z+gsHUeL0n8TfAmXnYmF7ajsxmBp4PQ== -"@types/jasmine@*", "@types/jasmine@^2.8.7": - version "2.8.11" - resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.11.tgz#0b5eba9e02616736b1a189112eacc163c3773b7b" - integrity sha512-ITPYT5rkV9S0BcucyBwXIUzqzSODVhvAzhOGV0bwZMuqWJeU0Kfdd6IJeJjGI8Gob+lDyAtKaWUfhG6QXJIPRg== +"@types/jasmine@*": + version "3.3.1" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.3.1.tgz#b6c4f356013364e98b583647c7b3b6de6fccd2cc" + integrity sha512-JnKB+cEIFuQZXizZP6N0zxma+JlvowkjefWuL61otVmXN7Ebbs4ka3IbDVIz1pc+TCiT00q925jANz3gQJ9qXw== + +"@types/jasmine@^2.8.7": + version "2.8.12" + resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-2.8.12.tgz#dfe606b07686c977f54d17cb8ebe6cae2e26f8ff" + integrity sha512-eE+xeiGBPgQsNcyg61JBqQS6NtxC+s2yfOikMCnc0Z4NqKujzmSahmtjLCKVQU/AyrTEQ76TOwQBnr8wGP2bmA== "@types/jasminewd2@^2.0.3": version "2.0.6" @@ -418,9 +424,9 @@ "@types/jasmine" "*" "@types/jest@^23.3.1": - version "23.3.9" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.9.tgz#c16b55186ee73ae65e001fbee69d392c51337ad1" - integrity sha512-wNMwXSUcwyYajtbayfPp55tSayuDVU6PfY5gzvRSj80UvxdXEJOVPnUVajaOp7NgXLm+1e2ZDLULmpsU9vDvQw== + version "23.3.10" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-23.3.10.tgz#4897974cc317bf99d4fe6af1efa15957fa9c94de" + integrity sha512-DC8xTuW/6TYgvEg3HEXS7cu9OijFqprVDXXiOcdOKZCU/5PJNLZU37VVvmZHdtMiGOa8wAA/We+JzbdxFzQTRQ== "@types/jschannel@^1.0.0": version "1.0.1" @@ -457,9 +463,9 @@ integrity sha512-Jn2cF8X6RAMiSmJaATGjf2r3GzIfpZQpvnQhKprQ5sAbMaNXc7hc9sA2XHdMl3bEMEQhTV79JVW7n4Pgg7sjtg== "@types/node@*", "@types/node@^10.9.2": - version "10.12.8" - resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.8.tgz#d0a3ab5a6e61458c492304e2776ac136b81db927" - integrity sha512-INamyRZG4rW3lDCUmwVd5Xho/bXvQm/v1yP8V0UN1RuInU7RoWoaO570b+yLX4Ia/0szsx1wa8VzcsVlsvbWLA== + version "10.12.12" + resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.12.tgz#e15a9d034d9210f00320ef718a50c4a799417c47" + integrity sha512-Pr+6JRiKkfsFvmU/LK68oBRCQeEg36TyAbPhc2xpez24OOZZCuoIhWGTd39VZy6nGafSbxzGouFPTFD/rR1A0A== "@types/node@^6.0.46": version "6.14.2" @@ -532,6 +538,15 @@ url-toolkit "^2.1.3" video.js "^6.8.0 || ^7.0.0" +"@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/ast@1.7.11": version "1.7.11" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" @@ -541,45 +556,42 @@ "@webassemblyjs/helper-wasm-bytecode" "1.7.11" "@webassemblyjs/wast-parser" "1.7.11" -"@webassemblyjs/ast@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.6.tgz#3ef8c45b3e5e943a153a05281317474fef63e21e" - integrity sha512-8nkZS48EVsMUU0v6F1LCIOw4RYWLm2plMtbhFTjNgeXmsTNLuU3xTRtnljt9BFQB+iPbLRobkNrCWftWnNC7wQ== - dependencies: - "@webassemblyjs/helper-module-context" "1.7.6" - "@webassemblyjs/helper-wasm-bytecode" "1.7.6" - "@webassemblyjs/wast-parser" "1.7.6" - mamacro "^0.0.3" +"@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/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/floating-point-hex-parser@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.6.tgz#7cb37d51a05c3fe09b464ae7e711d1ab3837801f" - integrity sha512-VBOZvaOyBSkPZdIt5VBMg3vPWxouuM13dPXGWI1cBh3oFLNcFJ8s9YA7S9l4mPI7+Q950QqOmqj06oa83hNWBA== +"@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-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-api-error@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.6.tgz#99b7e30e66f550a2638299a109dda84a622070ef" - integrity sha512-SCzhcQWHXfrfMSKcj8zHg1/kL9kb3aa5TN4plc/EREOs5Xop0ci5bdVBApbk2yfVi8aL+Ly4Qpp3/TRAUInjrg== +"@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-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-buffer@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.6.tgz#ba0648be12bbe560c25c997e175c2018df39ca3e" - integrity sha512-1/gW5NaGsEOZ02fjnFiU8/OEEXU1uVbv2um0pQ9YVL3IHSkyk6xOwokzyqqO1qDZQUAllb+V8irtClPWntbVqw== +"@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-code-frame@1.7.11": version "1.7.11" @@ -588,44 +600,45 @@ dependencies: "@webassemblyjs/wast-printer" "1.7.11" -"@webassemblyjs/helper-code-frame@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.6.tgz#5a94d21b0057b69a7403fca0c253c3aaca95b1a5" - integrity sha512-+suMJOkSn9+vEvDvgyWyrJo5vJsWSDXZmJAjtoUq4zS4eqHyXImpktvHOZwXp1XQjO5H+YQwsBgqTQEc0J/5zg== - dependencies: - "@webassemblyjs/wast-printer" "1.7.6" +"@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-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-fsm@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.6.tgz#ae1741c6f6121213c7a0b587fb964fac492d3e49" - integrity sha512-HCS6KN3wgxUihGBW7WFzEC/o8Eyvk0d56uazusnxXthDPnkWiMv+kGi9xXswL2cvfYfeK5yiM17z2K5BVlwypw== +"@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-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-module-context@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.6.tgz#116d19a51a6cebc8900ad53ca34ff8269c668c23" - integrity sha512-e8/6GbY7OjLM+6OsN7f2krC2qYVNaSr0B0oe4lWdmq5sL++8dYDD1TFbD1TdAdWMRTYNr/Qq7ovXWzia2EbSjw== - dependencies: - mamacro "^0.0.3" +"@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-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-bytecode@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.6.tgz#98e515eaee611aa6834eb5f6a7f8f5b29fefb6f1" - integrity sha512-PzYFCb7RjjSdAOljyvLWVqd6adAOabJW+8yRT+NWhXuf1nNZWH+igFZCUK9k7Cx7CsBbzIfXjJc7u56zZgFj9Q== +"@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/helper-wasm-section@1.7.11": version "1.7.11" @@ -637,15 +650,12 @@ "@webassemblyjs/helper-wasm-bytecode" "1.7.11" "@webassemblyjs/wasm-gen" "1.7.11" -"@webassemblyjs/helper-wasm-section@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.6.tgz#783835867bdd686df7a95377ab64f51a275e8333" - integrity sha512-3GS628ppDPSuwcYlQ7cDCGr4W2n9c4hLzvnRKeuz+lGsJSmc/ADVoYpm1ts2vlB1tGHkjtQMni+yu8mHoMlKlA== +"@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== dependencies: - "@webassemblyjs/ast" "1.7.6" - "@webassemblyjs/helper-buffer" "1.7.6" - "@webassemblyjs/helper-wasm-bytecode" "1.7.6" - "@webassemblyjs/wasm-gen" "1.7.6" + "@xtuc/ieee754" "^1.2.0" "@webassemblyjs/ieee754@1.7.11": version "1.7.11" @@ -654,12 +664,12 @@ dependencies: "@xtuc/ieee754" "^1.2.0" -"@webassemblyjs/ieee754@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.6.tgz#c34fc058f2f831fae0632a8bb9803cf2d3462eb1" - integrity sha512-V4cIp0ruyw+hawUHwQLn6o2mFEw4t50tk530oKsYXQhEzKR+xNGDxs/SFFuyTO7X3NzEu4usA3w5jzhl2RYyzQ== +"@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== dependencies: - "@xtuc/ieee754" "^1.2.0" + "@xtuc/long" "4.2.1" "@webassemblyjs/leb128@1.7.11": version "1.7.11" @@ -668,22 +678,29 @@ dependencies: "@xtuc/long" "4.2.1" -"@webassemblyjs/leb128@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.6.tgz#197f75376a29f6ed6ace15898a310d871d92f03b" - integrity sha512-ojdlG8WpM394lBow4ncTGJoIVZ4aAtNOWHhfAM7m7zprmkVcKK+2kK5YJ9Bmj6/ketTtOn7wGSHCtMt+LzqgYQ== - 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/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/utf8@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.6.tgz#eb62c66f906af2be70de0302e29055d25188797d" - integrity sha512-oId+tLxQ+AeDC34ELRYNSqJRaScB0TClUU6KQfpB8rNT6oelYlz8axsPhf6yPTg7PBJ/Z5WcXmUYiHEWgbbHJw== +"@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-edit@1.7.11": version "1.7.11" @@ -699,19 +716,16 @@ "@webassemblyjs/wasm-parser" "1.7.11" "@webassemblyjs/wast-printer" "1.7.11" -"@webassemblyjs/wasm-edit@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.6.tgz#fa41929160cd7d676d4c28ecef420eed5b3733c5" - integrity sha512-pTNjLO3o41v/Vz9VFLl+I3YLImpCSpodFW77pNoH4agn5I6GgSxXHXtvWDTvYJFty0jSeXZWLEmbaSIRUDlekg== +"@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.6" - "@webassemblyjs/helper-buffer" "1.7.6" - "@webassemblyjs/helper-wasm-bytecode" "1.7.6" - "@webassemblyjs/helper-wasm-section" "1.7.6" - "@webassemblyjs/wasm-gen" "1.7.6" - "@webassemblyjs/wasm-opt" "1.7.6" - "@webassemblyjs/wasm-parser" "1.7.6" - "@webassemblyjs/wast-printer" "1.7.6" + "@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-gen@1.7.11": version "1.7.11" @@ -724,16 +738,15 @@ "@webassemblyjs/leb128" "1.7.11" "@webassemblyjs/utf8" "1.7.11" -"@webassemblyjs/wasm-gen@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.6.tgz#695ac38861ab3d72bf763c8c75e5f087ffabc322" - integrity sha512-mQvFJVumtmRKEUXMohwn8nSrtjJJl6oXwF3FotC5t6e2hlKMh8sIaW03Sck2MDzw9xPogZD7tdP5kjPlbH9EcQ== +"@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.6" - "@webassemblyjs/helper-wasm-bytecode" "1.7.6" - "@webassemblyjs/ieee754" "1.7.6" - "@webassemblyjs/leb128" "1.7.6" - "@webassemblyjs/utf8" "1.7.6" + "@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-opt@1.7.11": version "1.7.11" @@ -745,15 +758,17 @@ "@webassemblyjs/wasm-gen" "1.7.11" "@webassemblyjs/wasm-parser" "1.7.11" -"@webassemblyjs/wasm-opt@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.6.tgz#fbafa78e27e1a75ab759a4b658ff3d50b4636c21" - integrity sha512-go44K90fSIsDwRgtHhX14VtbdDPdK2sZQtZqUcMRvTojdozj5tLI0VVJAzLCfz51NOkFXezPeVTAYFqrZ6rI8Q== +"@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.6" - "@webassemblyjs/helper-buffer" "1.7.6" - "@webassemblyjs/wasm-gen" "1.7.6" - "@webassemblyjs/wasm-parser" "1.7.6" + "@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/wasm-parser@1.7.11": version "1.7.11" @@ -767,17 +782,17 @@ "@webassemblyjs/leb128" "1.7.11" "@webassemblyjs/utf8" "1.7.11" -"@webassemblyjs/wasm-parser@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.6.tgz#84eafeeff405ad6f4c4b5777d6a28ae54eed51fe" - integrity sha512-t1T6TfwNY85pDA/HWPA8kB9xA4sp9ajlRg5W7EKikqrynTyFo+/qDzIpvdkOkOGjlS6d4n4SX59SPuIayR22Yg== +"@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.6" - "@webassemblyjs/helper-api-error" "1.7.6" - "@webassemblyjs/helper-wasm-bytecode" "1.7.6" - "@webassemblyjs/ieee754" "1.7.6" - "@webassemblyjs/leb128" "1.7.6" - "@webassemblyjs/utf8" "1.7.6" + "@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" + "@xtuc/long" "4.2.1" "@webassemblyjs/wast-parser@1.7.11": version "1.7.11" @@ -791,18 +806,14 @@ "@webassemblyjs/helper-fsm" "1.7.11" "@xtuc/long" "4.2.1" -"@webassemblyjs/wast-parser@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.6.tgz#ca4d20b1516e017c91981773bd7e819d6bd9c6a7" - integrity sha512-1MaWTErN0ziOsNUlLdvwS+NS1QWuI/kgJaAGAMHX8+fMJFgOJDmN/xsG4h/A1Gtf/tz5VyXQciaqHZqp2q0vfg== +"@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== dependencies: - "@webassemblyjs/ast" "1.7.6" - "@webassemblyjs/floating-point-hex-parser" "1.7.6" - "@webassemblyjs/helper-api-error" "1.7.6" - "@webassemblyjs/helper-code-frame" "1.7.6" - "@webassemblyjs/helper-fsm" "1.7.6" + "@webassemblyjs/ast" "1.7.10" + "@webassemblyjs/wast-parser" "1.7.10" "@xtuc/long" "4.2.1" - mamacro "^0.0.3" "@webassemblyjs/wast-printer@1.7.11": version "1.7.11" @@ -813,15 +824,6 @@ "@webassemblyjs/wast-parser" "1.7.11" "@xtuc/long" "4.2.1" -"@webassemblyjs/wast-printer@1.7.6": - version "1.7.6" - resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.6.tgz#a6002c526ac5fa230fe2c6d2f1bdbf4aead43a5e" - integrity sha512-vHdHSK1tOetvDcl1IV1OdDeGNe/NDDQ+KzuZHMtqTVP1xO/tZ/IKNpj5BaGk1OYFdsDWQqb31PIwdEyPntOWRQ== - dependencies: - "@webassemblyjs/ast" "1.7.6" - "@webassemblyjs/wast-parser" "1.7.6" - "@xtuc/long" "4.2.1" - "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -832,6 +834,19 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.1.tgz#5c85d662f76fa1d34575766c5dcd6615abcd30d8" integrity sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g== +"@yarnpkg/lockfile@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + +JSONStream@^1.3.4: + version "1.3.5" + resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" + integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== + dependencies: + jsonparse "^1.2.0" + through ">=2.2.7 <3" + abab@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.0.tgz#aba0ab4c5eee2d4c79d3487d85450fb2376ebb0f" @@ -909,13 +924,20 @@ after@0.8.2: resolved "https://registry.yarnpkg.com/after/-/after-0.8.2.tgz#fedb394f9f0e02aa9768e702bda23b505fae7e1f" integrity sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8= -agent-base@^4.1.0: +agent-base@4, agent-base@^4.1.0, agent-base@~4.2.0: version "4.2.1" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" integrity sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg== dependencies: es6-promisify "^5.0.0" +agentkeepalive@^3.4.1: + version "3.5.2" + resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz#a113924dd3fa24a0bc3b78108c450c2abee00f67" + integrity sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ== + dependencies: + humanize-ms "^1.2.1" + ajv-errors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" @@ -944,7 +966,7 @@ ajv@^4.11.2: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^5.0.0, ajv@^5.1.0: +ajv@^5.0.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" integrity sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU= @@ -955,9 +977,9 @@ ajv@^5.0.0, ajv@^5.1.0: json-schema-traverse "^0.3.0" ajv@^6.1.0, ajv@^6.5.5: - version "6.5.5" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.5.tgz#cf97cdade71c6399a92c6d6c4177381291b781a1" - integrity sha512-7q7gtRQDJSyuEHjuVgHoUa2VuemFiCMrfQc9Tc08XTAc4Zj/5U1buQJ0HU6i7fKjXU09SVgSmxa4sLvuvS8Iyg== + version "6.6.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.6.1.tgz#6360f5ed0d80f232cc2b294c362d5dc2e538dd61" + integrity sha512-ZoJjft5B+EJBjUyu9C9Hc0OZyPZSSlOF+plzouTrg6UlA8f+e/n8NIgBFG/9tppJtpPWfthHakK7juJdNDODww== dependencies: fast-deep-equal "^2.0.1" fast-json-stable-stringify "^2.0.0" @@ -983,9 +1005,9 @@ angular2-notifications@^1.0.2: integrity sha512-DjazfwXtLY8BNXKIEw1oEEMy7G6fmldpzP1FYwyVGUwEtZPLQyYGu9MQYCjtVlZMljxpa3qvnv8l9ZUfXAarNA== ansi-colors@^3.0.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.1.tgz#9638047e4213f3428a11944a7d4b31cba0a3ff95" - integrity sha512-Xt+zb6nqgvV9SWAVp0EG3lRsHcbq5DDgqjPPz6pwgtj6RKz65zGXMNa82oJfOSBA/to6GmRP7Dr+6o+kbApTzQ== + version "3.2.2" + resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.2.tgz#e49349137dbeb6d381b91e607c189915e53265ba" + integrity sha512-kJmcp4PrviBBEx95fC3dYRiC/QSN3EBd0GU1XoNEk/IuUa92rsB6o90zP3w5VAyNznR38Vkc9i8vk5zK6T7TxA== ansi-escapes@^3.0.0: version "3.1.0" @@ -1112,9 +1134,9 @@ array-flatten@1.1.1: integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= array-flatten@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.1.tgz#426bb9da84090c1838d812c8150af20a8331e296" - integrity sha1-Qmu52oQJDBg42BLIFQryCoMx4pY= + version "2.1.2" + resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== array-slice@^0.2.3: version "0.2.3" @@ -1238,17 +1260,17 @@ atob@^2.1.1: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== -autoprefixer@9.1.5: - version "9.1.5" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.1.5.tgz#8675fd8d1c0d43069f3b19a2c316f3524e4f6671" - integrity sha512-kk4Zb6RUc58ld7gdosERHMF3DzIYJc2fp5sX46qEsGXQQy5bXsu8qyLjoxuY1NuQ/cJuCYnx99BfjwnRggrYIw== +autoprefixer@9.3.1: + version "9.3.1" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.3.1.tgz#71b622174de2b783d5fd99f9ad617b7a3c78443e" + integrity sha512-DY9gOh8z3tnCbJ13JIWaeQsoYncTGdsrgCceBaQSIL4nvdrLxgbRSBPevg2XbX7u4QCSfLheSJEEIUUSlkbx6Q== dependencies: - browserslist "^4.1.0" - caniuse-lite "^1.0.30000884" + browserslist "^4.3.3" + caniuse-lite "^1.0.30000898" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^7.0.2" - postcss-value-parser "^3.2.3" + postcss "^7.0.5" + postcss-value-parser "^3.3.1" awesome-typescript-loader@5.2.1: version "5.2.1" @@ -1269,7 +1291,7 @@ aws-sign2@~0.7.0: resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= -aws4@^1.6.0, aws4@^1.8.0: +aws4@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.8.0.tgz#f0e003d9ca9e7f59c7a508945d7b2ef9a04a542f" integrity sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ== @@ -1631,7 +1653,7 @@ blocking-proxy@^1.0.0: dependencies: minimist "^1.2.0" -bluebird@^3.3.0, bluebird@^3.5.1: +bluebird@^3.3.0, bluebird@^3.5.1, bluebird@^3.5.2: version "3.5.3" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== @@ -1800,14 +1822,14 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^4.1.0: - version "4.3.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.4.tgz#4477b737db6a1b07077275b24791e680d4300425" - integrity sha512-u5iz+ijIMUlmV8blX82VGFrB9ecnUg5qEt55CMZ/YJEhha+d8qpBfOFuutJ6F/VKRXjZoD33b6uvarpPxcl3RA== +browserslist@^4.3.3: + version "4.3.5" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.5.tgz#1a917678acc07b55606748ea1adf9846ea8920f7" + integrity sha512-z9ZhGc3d9e/sJ9dIx5NFXkKoaiQTnrvrMsN3R1fGb1tkWWNSz12UewJn9TNxGo1l7J23h0MRaPmk7jfeTZYs1w== dependencies: - caniuse-lite "^1.0.30000899" - electron-to-chromium "^1.3.82" - node-releases "^1.0.1" + caniuse-lite "^1.0.30000912" + electron-to-chromium "^1.3.86" + node-releases "^1.0.5" browserstack@^1.5.1: version "1.5.1" @@ -1931,7 +1953,7 @@ cacache@^10.0.4: unique-filename "^1.1.0" y18n "^4.0.0" -cacache@^11.0.2: +cacache@^11.0.1, cacache@^11.0.2, cacache@^11.2.0: version "11.3.1" resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.1.tgz#d09d25f6c4aca7a6d305d141ae332613aa1d515f" integrity sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA== @@ -2014,10 +2036,15 @@ camelcase@^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.30000884, caniuse-lite@^1.0.30000899: - version "1.0.30000907" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000907.tgz#0b9899bde53fb1c30e214fb12402361e02ff5c42" - integrity sha512-No5sQ/OB2Nmka8MNOOM6nJx+Hxt6MQ6h7t7kgJFu9oTuwjykyKRSBP/+i/QAyFHxeHB+ddE0Da1CG5ihx9oehQ== +camelcase@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" + integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== + +caniuse-lite@^1.0.30000898, caniuse-lite@^1.0.30000912: + version "1.0.30000914" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000914.tgz#f802b4667c24d0255f54a95818dcf8e1aa41f624" + integrity sha512-qqj0CL1xANgg6iDOybiPTIxtsmAnfIky9mBC35qgWrnK4WwmhqfpmkDYMYgwXJ8LRZ3/2jXlCntulO8mBaAgSg== canonical-path@1.0.0: version "1.0.0" @@ -2276,7 +2303,7 @@ combine-lists@^1.0.0: dependencies: lodash "^4.5.0" -combined-stream@^1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6: +combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.7.tgz#2d1d24317afb8abe95d6d2c0b07b57813539d828" integrity sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w== @@ -2355,7 +2382,7 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -concat-stream@^1.5.0, concat-stream@^1.5.2: +concat-stream@^1.5.0: version "1.6.2" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw== @@ -2622,6 +2649,14 @@ css-selector-tokenizer@^0.7.0: fastparse "^1.1.1" regexpu-core "^1.0.0" +css-tree@^1.0.0-alpha.29: + version "1.0.0-alpha.29" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" + integrity sha512-sRNb1XydwkW9IOci6iB2xmy8IGCj6r/fr+JWitvJ2JxQRPzN3T4AGGVWCMlVmVwM1gtgALJRmGIlWv5ppnGGkg== + dependencies: + mdn-data "~1.1.0" + source-map "^0.5.3" + css-what@2.1: version "2.1.2" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.2.tgz#c0876d9d0480927d7d4920dcd72af3595649554d" @@ -2718,28 +2753,28 @@ debug@*, debug@^4.0.1, debug@^4.1.0: dependencies: ms "^2.1.1" -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== dependencies: ms "2.0.0" -debug@=3.1.0, debug@~3.1.0: +debug@3.1.0, debug@=3.1.0, debug@~3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g== dependencies: ms "2.0.0" -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: +decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= @@ -3106,10 +3141,10 @@ ejs@^2.6.1: resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== -electron-to-chromium@^1.3.82: - version "1.3.84" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.84.tgz#2e55df59e818f150a9f61b53471ebf4f0feecc65" - integrity sha512-IYhbzJYOopiTaNWMBp7RjbecUBsbnbDneOP86f3qvS0G0xfzwNSvMJpTrvi5/Y1gU7tg2NAgeg8a8rCYvW9Whw== +electron-to-chromium@^1.3.86: + version "1.3.88" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.88.tgz#f36ab32634f49ef2b0fdc1e82e2d1cc17feb29e7" + integrity sha512-UPV4NuQMKeUh1S0OWRvwg0PI8ASHN9kBC8yDTk1ROXLC85W5GnhTRu/MZu3Teqx3JjlQYuckuHYXSUSgtb3J+A== elliptic@^6.0.0: version "6.4.1" @@ -3134,6 +3169,13 @@ encodeurl@~1.0.1, encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= +encoding@^0.1.11: + version "0.1.12" + resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.12.tgz#538b66f3ee62cd1ab51ec323829d1f9480c74beb" + integrity sha1-U4tm8+5izRq1HsMjgp0flIDHS+s= + dependencies: + iconv-lite "~0.4.13" + end-of-stream@^1.0.0, end-of-stream@^1.1.0: version "1.4.1" resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" @@ -3200,6 +3242,11 @@ entities@^1.1.1, entities@~1.1.1: resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== +err-code@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-1.1.2.tgz#06e0116d3028f6aef4806849eb0ea6a748ae6960" + integrity sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA= + errno@^0.1.1, errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" @@ -3384,12 +3431,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" @@ -3544,7 +3591,7 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0, extend@~3.0.1, extend@~3.0.2: +extend@^3.0.0, extend@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== @@ -3631,7 +3678,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= @@ -3645,7 +3692,7 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" -figgy-pudding@^3.1.0, figgy-pudding@^3.5.1: +figgy-pudding@^3.1.0, figgy-pudding@^3.4.1, 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== @@ -3780,6 +3827,11 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +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" @@ -3799,9 +3851,9 @@ focus-visible@^4.1.5: integrity sha512-yo/njtk/BB4Z2euzaZe3CZrg4u5s5uEi7ZwbHBJS2quHx51N0mmcx9nTIiImUGlgy+vf26d0CcQluahBBBL/Fw== follow-redirects@^1.0.0: - version "1.5.9" - resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.9.tgz#c9ed9d748b814a39535716e531b9196a845d89c6" - integrity sha512-Bh65EZI/RU8nx0wbYF9shkFZlqLP+6WT/5FnA3cE/djNSuKNHJEinGGZgu/cQEkeeb2GdFOgenAmn8qaqYke2w== + version "1.5.10" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.5.10.tgz#7b7a9f9aea2fdff36786a94ff643ed07f4ff5e2a" + integrity sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ== dependencies: debug "=3.1.0" @@ -3841,7 +3893,7 @@ forever-agent@~0.6.1: resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= -form-data@~2.3.1, form-data@~2.3.2: +form-data@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ== @@ -3969,6 +4021,11 @@ gaze@^1.0.0: dependencies: globule "^1.0.0" +genfun@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" + integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== + get-browser-rtc@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.0.2.tgz#bbcd40c8451a7ed4ef5c373b8169a409dd1d11d9" @@ -3994,6 +4051,13 @@ get-stream@^3.0.0: resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= +get-stream@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" + integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== + dependencies: + pump "^3.0.0" + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -4053,7 +4117,7 @@ glob@7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" -glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: +glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@~7.1.1: version "7.1.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== @@ -4077,9 +4141,9 @@ glob@^5.0.15: path-is-absolute "^1.0.0" global-modules-path@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.0.tgz#b0e2bac6beac39745f7db5c59d26a36a0b94f7dc" - integrity sha512-HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag== + version "2.3.1" + resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.1.tgz#e541f4c800a1a8514a990477b267ac67525b9931" + integrity sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg== global@4.3.2, global@^4.3.0, global@^4.3.1, global@^4.3.2, global@~4.3.0: version "4.3.2" @@ -4182,14 +4246,6 @@ har-schema@^2.0.0: resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= -har-validator@~5.0.3: - version "5.0.3" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" - integrity sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0= - dependencies: - ajv "^5.1.0" - har-schema "^2.0.0" - har-validator@~5.1.0: version "5.1.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz#1ef89ebd3e4996557675eed9893110dc350fa080" @@ -4284,9 +4340,9 @@ hash-base@^3.0.0: safe-buffer "^5.0.1" hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.5" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.5.tgz#e38ab4b85dfb1e0c40fe9265c0e9b54854c23812" - integrity sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA== + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== dependencies: inherits "^2.0.3" minimalistic-assert "^1.0.1" @@ -4382,7 +4438,7 @@ html-webpack-plugin@^3.2.0: toposort "^1.0.0" util.promisify "1.0.0" -htmlparser2@^3.9.0: +htmlparser2@^3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.0.tgz#5f5e422dcf6119c0d983ed36260ce9ded0bee464" integrity sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ== @@ -4404,6 +4460,11 @@ htmlparser2@~3.3.0: domutils "1.1" readable-stream "1.0" +http-cache-semantics@^3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" + integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== + http-deceiver@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz#fa7168944ab9a519d337cb0bec7284dc3e723d87" @@ -4424,6 +4485,14 @@ 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-agent@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" + integrity sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg== + dependencies: + agent-base "4" + debug "3.1.0" + 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" @@ -4465,6 +4534,13 @@ https-proxy-agent@^2.2.1: agent-base "^4.1.0" debug "^3.1.0" +humanize-ms@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" + integrity sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0= + dependencies: + ms "^2.0.0" + iconv-lite@0.4.23: version "0.4.23" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" @@ -4472,7 +4548,7 @@ iconv-lite@0.4.23: dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: +iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -4603,7 +4679,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.5, 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== @@ -5640,7 +5716,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.1, json-parse-better-errors@^1.0.2: +json-parse-better-errors@^1.0.0, 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== @@ -5701,6 +5777,11 @@ jsonify@~0.0.0: resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= +jsonparse@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" + integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA= + jsprim@^1.2.2: version "1.4.1" resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" @@ -5796,9 +5877,9 @@ karma-source-map-support@1.3.0: source-map-support "^0.5.5" karma@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/karma/-/karma-3.1.1.tgz#94c8edd20fb9597ccde343326da009737fb0423a" - integrity sha512-NetT3wPCQMNB36uiL9LLyhrOt8SQwrEKt0xD3+KpTCfm0VxVyUJdPL5oTq2Ic5ouemgL/Iz4wqXEbF3zea9kQQ== + 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" @@ -5810,11 +5891,12 @@ karma@^3.0.0: 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" @@ -5826,7 +5908,7 @@ karma@^3.0.0: socket.io "2.1.1" source-map "^0.6.1" tmp "0.0.33" - useragent "2.2.1" + useragent "2.3.0" killable@^1.0.0: version "1.0.1" @@ -5939,9 +6021,9 @@ lie@~3.1.0: immediate "~3.0.5" linkify-it@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.0.3.tgz#d94a4648f9b1c179d64fa97291268bdb6ce9434f" - integrity sha1-2UpGSPmxwXnWT6lykSaL22zpQ08= + version "2.1.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.1.0.tgz#c4caf38a6cd7ac2212ef3c7d2bde30a91561f9db" + integrity sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg== dependencies: uc.micro "^1.0.1" @@ -6061,7 +6143,7 @@ lodash.isstring@^4.0.1: resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= -lodash.mergewith@^4.6.0: +lodash.mergewith@^4.6.0, 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== @@ -6119,7 +6201,7 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.3.1: dependencies: js-tokens "^3.0.0 || ^4.0.0" -loud-rejection@^1.0.0, loud-rejection@^1.6.0: +loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" integrity sha1-W0b4AUft7leIcPCG0Eghz5mOVR8= @@ -6132,15 +6214,10 @@ lower-case@^1.1.1: resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz#9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac" integrity sha1-miyr0bno4K6ZOkv31YdcOcQujqw= -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.0.1, lru-cache@^4.1.1, lru-cache@^4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" - integrity sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA== +lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache@^4.1.3: + 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" @@ -6184,6 +6261,23 @@ make-error@1.x: resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== +make-fetch-happen@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz#141497cb878f243ba93136c83d8aba12c216c083" + integrity sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ== + dependencies: + agentkeepalive "^3.4.1" + cacache "^11.0.1" + http-cache-semantics "^3.8.1" + http-proxy-agent "^2.1.0" + https-proxy-agent "^2.2.1" + lru-cache "^4.1.2" + mississippi "^3.0.0" + node-fetch-npm "^2.0.2" + promise-retry "^1.1.1" + socks-proxy-agent "^4.0.0" + ssri "^6.0.0" + makeerror@1.0.x: version "1.0.11" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" @@ -6191,11 +6285,6 @@ makeerror@1.0.x: dependencies: tmpl "1.0.x" -mamacro@^0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/mamacro/-/mamacro-0.0.3.tgz#ad2c9576197c9f1abf308d0787865bd975a3f3e4" - integrity sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA== - map-age-cleaner@^0.1.1: version "0.1.3" resolved "https://registry.yarnpkg.com/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz#7d583a7306434c055fe474b0f45078e6e1b4b92a" @@ -6245,6 +6334,11 @@ md5.js@^1.3.4: inherits "^2.0.1" safe-buffer "^5.1.2" +mdn-data@~1.1.0: + version "1.1.4" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.1.4.tgz#50b5d4ffc4575276573c4eedb8780812a8419f01" + integrity sha512-FSYbp3lyKjyj3E7fMl6rYvUdX0FBXaluGqlFoYESWQlyUTq8R+wp0rkFxoYFqZlHCvsUXGjyJmLQSnXToYhOSA== + mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -6400,9 +6494,9 @@ mime@^1.4.1: integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== mime@^2.2.0, mime@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.3.1.tgz#b1621c54d63b97c47d3cfe7f7215f7d64517c369" - integrity sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg== + version "2.4.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.0.tgz#e051fd881358585f3279df333fe694da0bcffdd6" + integrity sha512-ikBcWwyqXQSHKtciCcctu9YfPbFYZ4+gbHEmE0Q8jzcTYQg5dHCr3g2wwAZjPoJfQVXZq6KXAjpXOTf5/cjT7w== mimic-fn@^1.0.0: version "1.2.0" @@ -6421,10 +6515,10 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" -mini-css-extract-plugin@0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz#98d60fcc5d228c3e36a9bd15a1d6816d6580beb8" - integrity sha512-Mxs0nxzF1kxPv4TRi2NimewgXlJqh0rGE30vviCU2WHrpbta6wklnUV9dr9FUtoAHmB3p3LeXEC+ZjgHvB0Dzg== +mini-css-extract-plugin@0.4.4: + version "0.4.4" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz#c10410a004951bd3cedac1da69053940fccb625d" + integrity sha512-o+Jm+ocb0asEngdM6FsZWtZsRzA8koFUudIDwYUfl94M3PejPHG7Vopw5hN9V8WsMkSFpm3tZP3Fesz89EyrfQ== dependencies: loader-utils "^1.1.0" schema-utils "^1.0.0" @@ -6462,7 +6556,7 @@ minimist@~0.0.1: resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8= -minipass@^2.2.1, minipass@^2.3.4: +minipass@^2.2.1, minipass@^2.3.4, minipass@^2.3.5: version "2.3.5" resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.3.5.tgz#cacebe492022497f656b0f0f51e2682a9ed2d848" integrity sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA== @@ -6582,7 +6676,7 @@ ms@2.0.0: resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= -ms@^2.1.1: +ms@^2.0.0, ms@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== @@ -6735,6 +6829,15 @@ no-case@^2.2.0: dependencies: lower-case "^1.1.1" +node-fetch-npm@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz#7258c9046182dca345b4208eda918daf33697ff7" + integrity sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw== + dependencies: + encoding "^0.1.11" + json-parse-better-errors "^1.0.0" + safe-buffer "^5.1.1" + node-forge@0.7.5: version "0.7.5" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.5.tgz#6c152c345ce11c52f465c2abd957e8639cd674df" @@ -6823,39 +6926,14 @@ node-pre-gyp@^0.10.0: semver "^5.3.0" tar "^4" -node-releases@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.3.tgz#3414ed84595096459c251699bfcb47d88324a9e4" - integrity sha512-ZaZWMsbuDcetpHmYeKWPO6e63pSXLb50M7lJgCbcM2nC/nQC3daNifmtp5a2kp7EWwYfhuvH6zLPWkrF8IiDdw== +node-releases@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.5.tgz#a641adcc968b039a27345d92ef10b093e5cbd41d" + integrity sha512-Ky7q0BO1BBkG/rQz6PkEZ59rwo+aSfhczHP1wwq8IowoVdN/FpiP7qp0XW0P2+BVCWe5fQUBozdbVd54q1RbCQ== dependencies: semver "^5.3.0" -node-sass@4.9.3: - version "4.9.3" - resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.9.3.tgz#f407cf3d66f78308bb1e346b24fa428703196224" - integrity sha512-XzXyGjO+84wxyH7fV6IwBOTrEBe2f0a6SBze9QWWYR/cL74AcQUks2AsqcCZenl/Fp/JVbuEaLpgrLtocwBUww== - dependencies: - async-foreach "^0.1.3" - chalk "^1.1.1" - cross-spawn "^3.0.0" - gaze "^1.0.0" - get-stdin "^4.0.1" - glob "^7.0.3" - in-publish "^2.0.0" - lodash.assign "^4.2.0" - lodash.clonedeep "^4.3.2" - lodash.mergewith "^4.6.0" - meow "^3.7.0" - mkdirp "^0.5.1" - nan "^2.10.0" - node-gyp "^3.8.0" - npmlog "^4.0.0" - request "2.87.0" - sass-graph "^2.2.4" - stdout-stream "^1.4.0" - "true-case-path" "^1.0.2" - -node-sass@^4.9.3: +node-sass@4.10.0, node-sass@^4.9.3: version "4.10.0" resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.10.0.tgz#dcc2b364c0913630945ccbf7a2bbf1f926effca4" integrity sha512-fDQJfXszw6vek63Fe/ldkYXmRYK/QS6NbvM3i5oEo9ntPDy4XX7BcKZyTKv+/kSSxRtXXc7l+MSwEmYc0CSy6Q== @@ -6895,7 +6973,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@~1.0.1 || ^2.0.0": +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, normalize-package-data@^2.4.0: 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== @@ -6927,7 +7005,7 @@ npm-font-source-sans-pro@^1.0.2: resolved "https://registry.yarnpkg.com/npm-font-source-sans-pro/-/npm-font-source-sans-pro-1.0.2.tgz#c55c8ae368eebdbcaca65425a0d7e1f9a192a03e" integrity sha1-xVyK42juvbysplQloNfh+aGSoD4= -"npm-package-arg@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0": +npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA== @@ -6937,7 +7015,7 @@ npm-font-source-sans-pro@^1.0.2: semver "^5.5.0" validate-npm-package-name "^3.0.0" -npm-packlist@^1.1.6: +npm-packlist@^1.1.12, npm-packlist@^1.1.6: version "1.1.12" resolved "https://registry.yarnpkg.com/npm-packlist/-/npm-packlist-1.1.12.tgz#22bde2ebc12e72ca482abd67afc51eb49377243a" integrity sha512-WJKFOVMeAlsU/pjXuqVdzU0WfgtIBCupkEVwn+1Y0ERAbUfWw8R4GjgVbaKnUjRoD2FoQbHOCbOyT5Mbs9Lw4g== @@ -6945,24 +7023,26 @@ npm-packlist@^1.1.6: ignore-walk "^3.0.1" npm-bundled "^1.0.1" -npm-registry-client@8.6.0: - version "8.6.0" - resolved "https://registry.yarnpkg.com/npm-registry-client/-/npm-registry-client-8.6.0.tgz#7f1529f91450732e89f8518e0f21459deea3e4c4" - integrity sha512-Qs6P6nnopig+Y8gbzpeN/dkt+n7IyVd8f45NTMotGk6Qo7GfBmzwYx6jRLoOOgKiMnaQfYxsuyQlD8Mc3guBhg== +npm-pick-manifest@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz#32111d2a9562638bb2c8f2bf27f7f3092c8fae40" + integrity sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA== dependencies: - concat-stream "^1.5.2" - graceful-fs "^4.1.6" - normalize-package-data "~1.0.1 || ^2.0.0" - npm-package-arg "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" - once "^1.3.3" - request "^2.74.0" - retry "^0.10.0" - safe-buffer "^5.1.1" - semver "2 >=2.2.1 || 3.x || 4 || 5" - slide "^1.1.3" - ssri "^5.2.4" - optionalDependencies: - npmlog "2 || ^3.1.0 || ^4.0.0" + figgy-pudding "^3.5.1" + npm-package-arg "^6.0.0" + semver "^5.4.1" + +npm-registry-fetch@^3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/npm-registry-fetch/-/npm-registry-fetch-3.8.0.tgz#aa7d9a7c92aff94f48dba0984bdef4bd131c88cc" + integrity sha512-hrw8UMD+Nob3Kl3h8Z/YjmKamb1gf7D1ZZch2otrIXM3uFLB5vjEY6DhMlq80z/zZet6eETLbOXcuQudCB3Zpw== + dependencies: + JSONStream "^1.3.4" + bluebird "^3.5.1" + figgy-pudding "^3.4.1" + lru-cache "^4.1.3" + make-fetch-happen "^4.0.1" + npm-package-arg "^6.1.0" npm-run-path@^2.0.0: version "2.0.2" @@ -6971,7 +7051,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -"npmlog@0 || 1 || 2 || 3 || 4", "npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.0.0, npmlog@^4.0.2: +"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg== @@ -7008,11 +7088,6 @@ nwsapi@^2.0.7: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.0.9.tgz#77ac0cdfdcad52b6a1151a84e73254edc33ed016" integrity sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ== -oauth-sign@~0.8.2: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= - oauth-sign@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" @@ -7152,7 +7227,7 @@ optionator@^0.8.1: type-check "~0.3.2" wordwrap "~1.0.0" -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== @@ -7272,10 +7347,43 @@ package-json-versionify@^1.0.2: dependencies: browserify-package-json "^1.0.0" +pacote@9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.1.1.tgz#25091f75a25021de8be8d34cc6408728fca3579b" + integrity sha512-f28Rq5ozzKAA9YwIKw61/ipwAatUZseYmVssDbHHaexF0wRIVotapVEZPAjOT7Eu3LYVqEp0NVpNizoAnYBUaA== + dependencies: + bluebird "^3.5.2" + cacache "^11.2.0" + figgy-pudding "^3.5.1" + get-stream "^4.1.0" + glob "^7.1.3" + lru-cache "^4.1.3" + make-fetch-happen "^4.0.1" + minimatch "^3.0.4" + minipass "^2.3.5" + mississippi "^3.0.0" + mkdirp "^0.5.1" + normalize-package-data "^2.4.0" + npm-package-arg "^6.1.0" + npm-packlist "^1.1.12" + npm-pick-manifest "^2.1.0" + npm-registry-fetch "^3.8.0" + osenv "^0.1.5" + promise-inflight "^1.0.1" + promise-retry "^1.1.1" + protoduck "^5.0.1" + rimraf "^2.6.2" + safe-buffer "^5.1.2" + semver "^5.6.0" + ssri "^6.0.1" + tar "^4.4.6" + unique-filename "^1.1.1" + which "^1.3.1" + pako@~1.0.2, pako@~1.0.5: - version "1.0.6" - resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" - integrity sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg== + version "1.0.7" + resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.7.tgz#2473439021b57f1516c82f58be7275ad8ef1bb27" + integrity sha512-3HNK5tW4x8o5mO8RuHZp3Ydw9icZXx0RANAOMzlMzx7LVXhMJ4mo3MOBpzyd7r/+RUu8BmndP47LXT+vzjtWcQ== parallel-transform@^1.1.0: version "1.1.0" @@ -7543,9 +7651,9 @@ portfinder@1.0.17: mkdirp "0.5.x" portfinder@^1.0.9: - version "1.0.19" - resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.19.tgz#07e87914a55242dcda5b833d42f018d6875b595f" - integrity sha512-23aeQKW9KgHe6citUrG3r9HjeX6vls0h713TAa+CwTKZwNIr/pD2ApaxYF4Um3ZZyq4ar+Siv3+fhoHaIwSOSw== + version "1.0.20" + resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" + integrity sha512-Yxe4mTyDzTd59PZJY4ojZR8F+E5e97iq2ZOHPz3HDgSvYC5siNad2tLooQ5y5QHyQhc3xVqvyk/eNA3wuoa7Sw== dependencies: async "^1.5.2" debug "^2.2.0" @@ -7615,12 +7723,12 @@ postcss-modules-values@^1.3.0: icss-replace-symbols "^1.1.0" postcss "^6.0.1" -postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0: +postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0, postcss-value-parser@^3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== -postcss@7.0.5, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.2: +postcss@7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.5.tgz#70e6443e36a6d520b0fd4e7593fcca3635ee9f55" integrity sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ== @@ -7629,7 +7737,7 @@ postcss@7.0.5, postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.2: source-map "^0.6.1" supports-color "^5.5.0" -postcss@^6.0.1, postcss@^6.0.14, postcss@^6.0.23: +postcss@^6.0.1, postcss@^6.0.23: version "6.0.23" resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== @@ -7638,6 +7746,15 @@ postcss@^6.0.1, postcss@^6.0.14, postcss@^6.0.23: source-map "^0.6.1" supports-color "^5.4.0" +postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.5: + version "7.0.6" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.6.tgz#6dcaa1e999cdd4a255dcd7d4d9547f4ca010cdc2" + integrity sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.5.0" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -7664,10 +7781,10 @@ pretty-format@^23.6.0: ansi-regex "^3.0.0" ansi-styles "^3.2.0" -primeng@^6.1.2: - version "6.1.6" - resolved "https://registry.yarnpkg.com/primeng/-/primeng-6.1.6.tgz#3a699a02507fcd5befb2fb9fe18fcc5d385f810e" - integrity sha512-9QYkXfBuSwx5zZej5QiEWhdAFJPc+f9h6PXuFtw4PzUfOhPmnoUxR5K04xeFreCNP13WwP3Uh/U3o7mY0PZtQA== +primeng@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/primeng/-/primeng-7.0.0.tgz#3a189568069a31544c9ed952328e221daad9b9b1" + integrity sha512-PrEEnp0VPbzsUQdpB/4KtUdRxaWwpprHy+IpUi09C42OAI2zqdTVIC0AaW81gDAGQyW7XraCP9EFI8KT4nC9GA== private@^0.1.8, private@~0.1.5: version "0.1.8" @@ -7699,6 +7816,14 @@ promise-inflight@^1.0.1: resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= +promise-retry@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/promise-retry/-/promise-retry-1.1.1.tgz#6739e968e3051da20ce6497fb2b50f6911df3d6d" + integrity sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0= + dependencies: + err-code "^1.0.0" + retry "^0.10.0" + promise@^7.1.1: version "7.3.1" resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" @@ -7722,6 +7847,13 @@ prop-types@^15.6.2: loose-envify "^1.3.1" object-assign "^4.1.1" +protoduck@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/protoduck/-/protoduck-5.0.1.tgz#03c3659ca18007b69a50fd82a7ebcc516261151f" + integrity sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg== + dependencies: + genfun "^5.0.0" + protractor@^5.3.2: version "5.4.1" resolved "https://registry.yarnpkg.com/protractor/-/protractor-5.4.1.tgz#011a99e38df7aa45d22455b889ffbb13a6ce0bd9" @@ -7762,7 +7894,7 @@ pseudomap@^1.0.2: resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= -psl@^1.1.24: +psl@^1.1.24, psl@^1.1.28: version "1.1.29" resolved "https://registry.yarnpkg.com/psl/-/psl-1.1.29.tgz#60f580d360170bb722a797cc704411e6da850c67" integrity sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ== @@ -7814,7 +7946,7 @@ punycode@^1.2.4, punycode@^1.4.1: resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= -punycode@^2.1.0: +punycode@^2.1.0, punycode@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== @@ -7863,7 +7995,7 @@ qrcode@^0.8.2: isarray "^2.0.1" pngjs "^2.3.1" -qs@6.5.2, qs@~6.5.1, qs@~6.5.2: +qs@6.5.2, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== @@ -8241,33 +8373,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@2.87.0: - version "2.87.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.87.0.tgz#32f00235cd08d482b4d0d68db93a829c0ed5756e" - integrity sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw== - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.6.0" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.1" - forever-agent "~0.6.1" - form-data "~2.3.1" - har-validator "~5.0.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.17" - oauth-sign "~0.8.2" - performance-now "^2.1.0" - qs "~6.5.1" - safe-buffer "^5.1.1" - tough-cookie "~2.3.3" - tunnel-agent "^0.6.0" - uuid "^3.1.0" - -request@^2.74.0, request@^2.83.0, request@^2.87.0, request@^2.88.0: +request@^2.83.0, request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -8335,7 +8441,7 @@ resolve@1.1.7, resolve@1.1.x: resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2: +resolve@1.x, resolve@^1.1.6, resolve@^1.1.7, resolve@^1.3.2: version "1.8.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== @@ -8482,20 +8588,20 @@ sane@^2.0.0: fsevents "^1.2.3" sanitize-html@^1.18.4: - version "1.19.1" - resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.19.1.tgz#e8b33c69578054d6ee4f57ea152d6497f3f6fb7d" - integrity sha512-zNYr6FvBn4bZukr9x2uny6od/9YdjCLwF+FqxivqI0YOt/m9GIxfX+tWhm52tBAPUXiTTb4bJTGVagRz5b06bw== + version "1.19.2" + resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-1.19.2.tgz#c03fffe2bf96cd582968ece9792cbca32e64dde0" + integrity sha512-7fNb3/N0sZ/nkshMRBoxLz6K1dlMSVF/eQHX1Bof9sRT7cZJvmrDGfXEn544MXJnpY29vux1A599g9UrcHTBXA== dependencies: - chalk "^2.3.0" - htmlparser2 "^3.9.0" + chalk "^2.4.1" + css-tree "^1.0.0-alpha.29" + htmlparser2 "^3.10.0" lodash.clonedeep "^4.5.0" lodash.escaperegexp "^4.1.2" lodash.isplainobject "^4.0.6" lodash.isstring "^4.0.1" - lodash.mergewith "^4.6.0" - postcss "^6.0.14" + lodash.mergewith "^4.6.1" srcset "^1.0.0" - xtend "^4.0.0" + xtend "^4.0.1" sass-graph@^2.2.4: version "2.2.4" @@ -8547,9 +8653,9 @@ sax@>=0.6.0, sax@^1.2.4: integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== scheduler@^0.11.2: - version "0.11.2" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.11.2.tgz#a8db5399d06eba5abac51b705b7151d2319d33d3" - integrity sha512-+WCP3s3wOaW4S7C1tl3TEXp4l9lJn0ZK8G3W3WKRWmw77Z2cIFUW2MiNTMHn5sCjxN+t7N43HAOOgMjyAg5hlg== + version "0.11.3" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.11.3.tgz#b5769b90cf8b1464f3f3cfcafe8e3cd7555a2d6b" + integrity sha512-i9X9VRRVZDd3xZw10NY5Z2cVMbdYg6gqFecfj79USv1CFN+YrJ3gIPRKf1qlY+Sxly4djoKdfx1T+m9dnRB8kQ== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -8622,7 +8728,7 @@ semver-intersect@1.4.0: dependencies: semver "^5.0.0" -"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", semver@^5.0.0, semver@^5.3.0, semver@^5.5, semver@^5.5.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5, 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== @@ -8820,10 +8926,10 @@ slash@^1.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" integrity sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU= -slide@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= +smart-buffer@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.0.1.tgz#07ea1ca8d4db24eb4cac86537d7d18995221ace3" + integrity sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg== snapdragon-node@^2.0.1: version "2.1.1" @@ -8901,17 +9007,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" @@ -8921,6 +9027,22 @@ sockjs@0.3.19: faye-websocket "^0.10.0" uuid "^3.0.1" +socks-proxy-agent@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz#5936bf8b707a993079c6f37db2091821bffa6473" + integrity sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw== + dependencies: + agent-base "~4.2.0" + socks "~2.2.0" + +socks@~2.2.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/socks/-/socks-2.2.2.tgz#f061219fc2d4d332afb4af93e865c84d3fa26e2b" + integrity sha512-g6wjBnnMOZpE0ym6e0uHSddz9p3a+WsBaaYQaBaSCJYvrC4IXykQR9MNGjLQf38e9iIIhp3b1/Zk8YZI3KGJ0Q== + dependencies: + ip "^1.1.5" + smart-buffer "^4.0.1" + source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" @@ -9012,9 +9134,9 @@ source-map@~0.2.0: amdefine ">=0.0.4" sourcemap-codec@^1.4.1: - version "1.4.3" - resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.3.tgz#0ba615b73ec35112f63c2f2d9e7c3f87282b0e33" - integrity sha512-vFrY/x/NdsD7Yc8mpTJXuao9S8lq08Z/kOITHz6b7YbfI9xL8Spe5EvSQUHOI7SbpY8bRPr0U3kKSsPuqEGSfA== + version "1.4.4" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" + integrity sha512-CYAPYdBu34781kLHkaW3m6b/uUSyMOC2R61gcYMWooeuaGtjof86ZA/8T+qVPPt7np1085CR9hmMGrySwEc8Xg== spdx-correct@^3.0.0: version "3.0.2" @@ -9067,7 +9189,7 @@ spdy@^3.4.1: select-hose "^2.0.0" spdy-transport "^2.0.18" -speed-measure-webpack-plugin@^1.2.3: +speed-measure-webpack-plugin@1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.2.3.tgz#de170b5cefbfa1c039d95e639edd3ad50cfc7c48" integrity sha512-p+taQ69VkRUXYMoZOx2nxV/Tz8tt79ahctoZJyJDHWP7fEYvwFNf5Pd73k5kZ6auu0pTsPNLEUwWpM8mCk85Zw== @@ -9133,7 +9255,7 @@ ssri@^5.2.4: dependencies: safe-buffer "^5.1.1" -ssri@^6.0.0: +ssri@^6.0.0, 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== @@ -9293,10 +9415,10 @@ string2compact@^1.1.1, string2compact@^1.2.5: addr-to-ip-port "^1.0.1" ipaddr.js "^1.0.1" -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" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== +string_decoder@^1.0.0, string_decoder@^1.1.1: + version "1.2.0" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.2.0.tgz#fe86e738b19544afe70469243b2a1ee9240eae8d" + integrity sha512-6YqyX6ZWEYguAxgZzHGL7SsCeGx3V2TtOTqZz1xSTSWnqsbWwbptafNyvf/ACquZUXV3DANr5BDIwNYe1mN42w== dependencies: safe-buffer "~5.1.0" @@ -9305,6 +9427,13 @@ string_decoder@~0.10.x: resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ= +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + strip-ansi@^3.0.0, strip-ansi@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" @@ -9348,13 +9477,13 @@ strip-json-comments@~2.0.1: resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= -style-loader@0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.0.tgz#8377fefab68416a2e05f1cabd8c3a3acfcce74f1" - integrity sha512-uCcN7XWHkqwGVt7skpInW6IGO1tG6ReyFQ1Cseh0VcN6VdcFQi62aG/2F3Y9ueA8x4IVlfaSUxpmQXQD9QrEuQ== +style-loader@0.23.1: + version "0.23.1" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-0.23.1.tgz#cb9154606f3e771ab6c4ab637026a1049174d925" + integrity sha512-XK+uv9kWwhZMZ1y7mysB+zoihsEj4wneFWAS5qoiLwzW0WzSqMrrsIy+a3zkQJq0ipFtBpX5W3MqyRIBF/WFGg== dependencies: loader-utils "^1.1.0" - schema-utils "^0.4.5" + schema-utils "^1.0.0" stylus-loader@3.0.2: version "3.0.2" @@ -9407,9 +9536,9 @@ symbol-tree@^3.2.2: integrity sha1-rifbOPZgp64uHDt9G8KQgZuFGeY= tapable@^1.0.0, tapable@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.0.tgz#0d076a172e3d9ba088fd2272b2668fb8d194b78c" - integrity sha512-IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA== + version "1.1.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.1.tgz#4d297923c5a72a42360de2ab52dadfaaec00018e" + integrity sha512-9I2ydhj8Z9veORCw5PRm4u9uebCn0mcCa6scWoNcbZ6dAtoo2618u9UUzxgmsCOreJpqDDuv61LvwofW7hLcBA== tar@^2.0.0: version "2.2.1" @@ -9420,7 +9549,7 @@ tar@^2.0.0: fstream "^1.0.2" inherits "2" -tar@^4: +tar@^4, tar@^4.4.6: version "4.4.8" resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== @@ -9448,9 +9577,9 @@ terser-webpack-plugin@1.1.0, terser-webpack-plugin@^1.1.0: worker-farm "^1.5.2" terser@^3.8.1: - version "3.10.11" - resolved "https://registry.yarnpkg.com/terser/-/terser-3.10.11.tgz#e063da74b194dde9faf0a561f3a438c549d2da3f" - integrity sha512-iruZ7j14oBbRYJC5cP0/vTU7YOWjN+J1ZskEGoF78tFzXdkK2hbCL/3TRZN8XB+MuvFhvOHMp7WkOCBO4VEL5g== + version "3.11.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-3.11.0.tgz#60782893e1f4d6788acc696351f40636d0e37af0" + integrity sha512-5iLMdhEPIq3zFWskpmbzmKwMQixKmTYwY3Ox9pjtSklBLnHiuQ0GKJLhL1HSYtyffHM3/lDIFBnb82m9D7ewwQ== dependencies: commander "~2.17.1" source-map "~0.6.1" @@ -9485,7 +9614,7 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@2, through@X.X.X, through@^2.3.6, through@~2.3.6: +through@2, "through@>=2.2.7 <3", through@X.X.X, through@^2.3.6, through@~2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= @@ -9586,7 +9715,15 @@ torrent-piece@^2.0.0: resolved "https://registry.yarnpkg.com/torrent-piece/-/torrent-piece-2.0.0.tgz#6598ae67d93699e887f178db267ba16d89d7ec9b" integrity sha512-H/Z/yCuvZJj1vl1IQHI8dvF2QrUuXRJoptT5DW5967/dsLpXlCg+uyhFR5lfNj5mNaYePUbKtnL+qKWZGXv4Nw== -tough-cookie@>=2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.4.3: +tough-cookie@>=2.3.3, tough-cookie@^2.3.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g== + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + +tough-cookie@~2.4.3: version "2.4.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.4.3.tgz#53f36da3f47783b0925afa06ff9f3b165280f781" integrity sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ== @@ -9594,13 +9731,6 @@ tough-cookie@>=2.3.3, tough-cookie@^2.3.4, tough-cookie@~2.4.3: psl "^1.1.24" punycode "^1.4.1" -tough-cookie@~2.3.3: - version "2.3.4" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" - integrity sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA== - dependencies: - punycode "^1.4.1" - tr46@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" @@ -9641,9 +9771,9 @@ tryer@^1.0.0: integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== ts-jest@^23.1.4: - version "23.10.4" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.10.4.tgz#a7a953f55c9165bcaa90ff91014a178e87fe0df8" - integrity sha512-oV/wBwGUS7olSk/9yWMiSIJWbz5xO4zhftnY3gwv6s4SMg6WHF1m8XZNBvQOKQRiTAexZ9754Z13dxBq3Zgssw== + version "23.10.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-23.10.5.tgz#cdb550df4466a30489bf70ba867615799f388dd5" + integrity sha512-MRCs9qnGoyKgFc8adDEntAOP64fWK1vZKnOYU1o2HxaqjdJvGqmkLCPCnVq1/If4zkUmEjKPnCiUisTrlX2p2A== dependencies: bs-logger "0.x" buffer-from "1.x" @@ -9651,6 +9781,7 @@ ts-jest@^23.1.4: json5 "2.x" make-error "1.x" mkdirp "0.x" + resolve "1.x" semver "^5.5" yargs-parser "10.x" @@ -9721,9 +9852,9 @@ tsutils@^2.27.2: tslib "^1.8.1" tsutils@^3.0.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.5.0.tgz#42602f7df241e753a2105cc3627a664abf11f745" - integrity sha512-/FZ+pEJQixWruFejFxNPRSwg+iF6aw7PYZVRqUscJ7EnzV3zieI8byfZziUR7QjCuJFulq8SEe9JcGflO4ze4Q== + version "3.5.2" + resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.5.2.tgz#6fd3c2d5a731e83bb21b070a173ec0faf3a8f6d3" + integrity sha512-qIlklNuI/1Dzfm+G+kJV5gg3gimZIX5haYtIVQe7qGyKd7eu8T1t1DY6pz4Sc2CGXAj9s1izycctm9Zfl9sRuQ== dependencies: tslib "^1.8.1" @@ -9838,7 +9969,7 @@ uniq@^1.0.1: resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" integrity sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8= -unique-filename@^1.1.0: +unique-filename@^1.1.0, 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== @@ -9897,12 +10028,7 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-join@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.0.tgz#4d3340e807d3773bda9991f8305acdcc2a665d2a" - integrity sha1-TTNA6AfTdzvamZH4MFrNzCpmXSo= - -url-parse@^1.1.8, url-parse@^1.4.3: +url-parse@^1.4.3: version "1.4.4" resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.4.tgz#cac1556e95faa0303691fec5cf9d5a1bc34648f8" integrity sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg== @@ -9928,12 +10054,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" ut_metadata@^3.3.0: @@ -10222,35 +10348,20 @@ webpack-core@^0.6.8: source-list-map "~0.1.7" source-map "~0.4.1" -webpack-dev-middleware@3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.2.0.tgz#a20ceef194873710052da678f3c6ee0aeed92552" - integrity sha512-YJLMF/96TpKXaEQwaLEo+Z4NDK8aV133ROF6xp9pe3gQoS7sxfpXh4Rv9eC+8vCvWfmDjRQaMSlRPbO+9G6jgA== - dependencies: - loud-rejection "^1.6.0" - memory-fs "~0.4.1" - mime "^2.3.1" - path-is-absolute "^1.0.0" - range-parser "^1.0.3" - url-join "^4.0.0" - webpack-log "^2.0.0" - -webpack-dev-middleware@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.3.0.tgz#8104daf4d4f65defe06ee2eaaeea612a7c541462" - integrity sha512-5C5gXtOo1I6+0AEg4UPglYEtu3Rai6l5IiO6aUu65scHXz29dc3oIWMiRwvcNLXgL0HwRkRxa9N02ZjFt4hY8w== +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: - loud-rejection "^1.6.0" memory-fs "~0.4.1" mime "^2.3.1" range-parser "^1.0.3" - url-join "^4.0.0" webpack-log "^2.0.0" -webpack-dev-server@3.1.8: - version "3.1.8" - resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.8.tgz#eb7a95945d1108170f902604fb3b939533d9daeb" - integrity sha512-c+tcJtDqnPdxCAzEEZKdIPmg3i5i7cAHe+B+0xFNK0BlCc2HF/unYccbU7xTgfGc5xxhCztCQzFmsqim+KhI+A== +webpack-dev-server@3.1.10: + version "3.1.10" + resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz#507411bee727ee8d2fdffdc621b66a64ab3dea2b" + integrity sha512-RqOAVjfqZJtQcB0LmrzJ5y4Jp78lv9CK0MZ1YJDTaTmedMZ9PU9FLMQNrMCfVu8hHzaVLVOJKBlGEHMN10z+ww== dependencies: ansi-html "0.0.7" bonjour "^3.5.0" @@ -10273,11 +10384,11 @@ webpack-dev-server@3.1.8: selfsigned "^1.9.1" serve-index "^1.7.2" sockjs "0.3.19" - sockjs-client "1.1.5" + sockjs-client "1.3.0" spdy "^3.4.1" strip-ansi "^3.0.0" supports-color "^5.1.0" - webpack-dev-middleware "3.2.0" + webpack-dev-middleware "3.4.0" webpack-log "^2.0.0" yargs "12.0.2" @@ -10314,6 +10425,14 @@ webpack-sources@1.2.0: source-list-map "^2.0.0" source-map "~0.6.1" +webpack-sources@1.3.0, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" + integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + webpack-sources@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-0.1.5.tgz#aa1f3abf0f0d74db7111c40e500b84f966640750" @@ -10322,14 +10441,6 @@ webpack-sources@^0.1.4: source-list-map "~0.1.7" source-map "~0.5.3" -webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" - integrity sha512-OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA== - dependencies: - source-list-map "^2.0.0" - source-map "~0.6.1" - webpack-subresource-integrity@1.1.0-rc.6: version "1.1.0-rc.6" resolved "https://registry.yarnpkg.com/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz#37f6f1264e1eb378e41465a98da80fad76ab8886" @@ -10337,15 +10448,15 @@ webpack-subresource-integrity@1.1.0-rc.6: dependencies: webpack-core "^0.6.8" -webpack@4.19.1: - version "4.19.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.19.1.tgz#096674bc3b573f8756c762754366e5b333d6576f" - integrity sha512-j7Q/5QqZRqIFXJvC0E59ipLV5Hf6lAnS3ezC3I4HMUybwEDikQBVad5d+IpPtmaQPQArvgUZLXIN6lWijHBn4g== +webpack@4.23.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.6" - "@webassemblyjs/helper-module-context" "1.7.6" - "@webassemblyjs/wasm-edit" "1.7.6" - "@webassemblyjs/wasm-parser" "1.7.6" + "@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" ajv "^6.1.0" @@ -10365,12 +10476,12 @@ webpack@4.19.1: tapable "^1.1.0" uglifyjs-webpack-plugin "^1.2.4" watchpack "^1.5.0" - webpack-sources "^1.2.0" + webpack-sources "^1.3.0" webpack@^4.17.1: - version "4.25.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.25.1.tgz#4f459fbaea0f93440dc86c89f771bb3a837cfb6d" - integrity sha512-T0GU/3NRtO4tMfNzsvpdhUr8HnzA4LTdP2zd+e5zd6CdOH5vNKHnAlO+DvzccfhPdzqRrALOFcjYxx7K5DWmvA== + version "4.26.1" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.26.1.tgz#ff3a9283d363c07b3494dfa702d08f4f2ef6cb39" + integrity sha512-i2oOvEvuvLLSuSCkdVrknaxAhtUZ9g+nLSoHCWV0gDzqGX2DXaCrMmMUpbRsTSSLrUqAI56PoEiyMUZIZ1msug== dependencies: "@webassemblyjs/ast" "1.7.11" "@webassemblyjs/helper-module-context" "1.7.11" @@ -10393,7 +10504,7 @@ webpack@^4.17.1: node-libs-browser "^2.0.0" schema-utils "^0.4.4" 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" @@ -10468,9 +10579,9 @@ whatwg-fetch@^3.0.0: integrity sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q== whatwg-mimetype@^2.1.0, whatwg-mimetype@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.2.0.tgz#a3d58ef10b76009b042d03e25591ece89b88d171" - integrity sha512-5YSO1nMd5D1hY3WzAQV3PzZL83W3YeyR1yW9PcH26Weh1t+Vzh9B6XkDh7aXm83HBZ4nSMvkjvN2H2ySWIvBgw== + version "2.3.0" + resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== whatwg-url@^6.4.1: version "6.5.0" @@ -10505,7 +10616,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@1, which@^1.1.1, which@^1.2.1, which@^1.2.12, which@^1.2.9, which@^1.3.0: +which@1, which@^1.1.1, which@^1.2.1, which@^1.2.12, which@^1.2.9, which@^1.3.0, which@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== @@ -10566,9 +10677,9 @@ ws@^5.2.0: async-limiter "~1.0.0" ws@^6.0.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.0.tgz#119a9dbf92c54e190ec18d10e871d55c95cf9373" - integrity sha512-H3dGVdGvW2H8bnYpIDc3u3LH8Wue3Qh+Zto6aXXFzvESkTVT6rAfKR6tR/+coaUvxs8yHtmNV0uioBF62ZGSTg== + version "6.1.2" + resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8" + integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw== dependencies: async-limiter "~1.0.0" @@ -10640,9 +10751,9 @@ yallist@^2.1.2: integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= yallist@^3.0.0, yallist@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.2.tgz#8452b4bb7e83c7c188d8041c1a837c773d6d8bb9" - integrity sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k= + version "3.0.3" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.0.3.tgz#b4b049e314be545e3ce802236d6cd22cd91c3de9" + integrity sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A== yargs-parser@10.x, yargs-parser@^10.1.0: version "10.1.0" @@ -10651,6 +10762,14 @@ yargs-parser@10.x, yargs-parser@^10.1.0: dependencies: camelcase "^4.1.0" +yargs-parser@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-11.1.1.tgz#879a0865973bca9f6bab5cbdf3b1c67ec7d3bcf4" + integrity sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-5.0.0.tgz#275ecf0d7ffe05c77e64e7c86e4cd94bf0e1228a" @@ -10697,7 +10816,7 @@ yargs@10.0.3: y18n "^3.2.1" yargs-parser "^8.0.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== @@ -10752,6 +10871,24 @@ yargs@^11.0.0: y18n "^3.2.1" yargs-parser "^9.0.2" +yargs@^12.0.2: + version "12.0.5" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-12.0.5.tgz#05f5997b609647b64f66b81e3b4b10a368e7ad13" + integrity sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw== + dependencies: + cliui "^4.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^1.0.1" + os-locale "^3.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1 || ^4.0.0" + yargs-parser "^11.1.1" + yargs@^7.0.0: version "7.1.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-7.1.0.tgz#6ba318eb16961727f5d284f8ea003e8d6154d0c8" -- cgit v1.2.3 From 2beb98952a4c5939f33ea2dc77f0bd053bffbb5a Mon Sep 17 00:00:00 2001 From: Rigel Kent Date: Tue, 4 Dec 2018 13:50:50 +0100 Subject: change type of languageOneOf query parameter --- support/doc/api/openapi.yaml | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/support/doc/api/openapi.yaml b/support/doc/api/openapi.yaml index 9848c93ee..cb6ba9af5 100644 --- a/support/doc/api/openapi.yaml +++ b/support/doc/api/openapi.yaml @@ -1434,6 +1434,8 @@ components: - type: array items: type: number + style: form + explode: false tagsOneOf: name: tagsOneOf in: query @@ -1445,6 +1447,8 @@ components: - type: array items: type: string + style: form + explode: false tagsAllOf: name: tagsAllOf in: query @@ -1456,6 +1460,8 @@ components: - type: array items: type: string + style: form + explode: false languageOneOf: name: languageOneOf in: query @@ -1463,10 +1469,12 @@ components: description: language id of the video schema: oneOf: - - type: number + - type: string - type: array items: - type: number + type: string + style: form + explode: false licenceOneOf: name: licenceOneOf in: query @@ -1478,6 +1486,8 @@ components: - type: array items: type: number + style: form + explode: false nsfw: name: nsfw in: query -- cgit v1.2.3 From 745778256ced65415b04a9817fc49db70d4b6681 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 4 Dec 2018 15:12:54 +0100 Subject: Fix thumbnail processing --- server/helpers/image-utils.ts | 14 ++++++-------- server/helpers/requests.ts | 4 ++-- server/lib/activitypub/process/process-update.ts | 2 +- server/lib/activitypub/videos.ts | 21 +++++++++++++-------- .../lib/job-queue/handlers/activitypub-refresher.ts | 3 ++- server/tests/cli/index.ts | 1 + 6 files changed, 25 insertions(+), 20 deletions(-) diff --git a/server/helpers/image-utils.ts b/server/helpers/image-utils.ts index da3285b13..e43ea3f1d 100644 --- a/server/helpers/image-utils.ts +++ b/server/helpers/image-utils.ts @@ -1,6 +1,7 @@ import 'multer' import * as sharp from 'sharp' -import { move, remove } from 'fs-extra' +import { readFile, remove } from 'fs-extra' +import { logger } from './logger' async function processImage ( physicalFile: { path: string }, @@ -11,14 +12,11 @@ async function processImage ( throw new Error('Sharp needs an input path different that the output path.') } - const sharpInstance = sharp(physicalFile.path) - const metadata = await sharpInstance.metadata() + logger.debug('Processing image %s to %s.', physicalFile.path, destination) - // No need to resize - if (metadata.width === newSize.width && metadata.height === newSize.height) { - await move(physicalFile.path, destination, { overwrite: true }) - return - } + // Avoid sharp cache + const buf = await readFile(physicalFile.path) + const sharpInstance = sharp(buf) await remove(destination) diff --git a/server/helpers/requests.ts b/server/helpers/requests.ts index 805930a9f..5760ad1c1 100644 --- a/server/helpers/requests.ts +++ b/server/helpers/requests.ts @@ -3,6 +3,7 @@ import { createWriteStream } from 'fs-extra' import * as request from 'request' import { ACTIVITY_PUB } from '../initializers' import { processImage } from './image-utils' +import { extname } from 'path' function doRequest ( requestOptions: request.CoreOptions & request.UriOptions & { activityPub?: boolean } @@ -29,8 +30,7 @@ function doRequestAndSaveToFile (requestOptions: request.CoreOptions & request.U } async function downloadImage (url: string, destPath: string, size: { width: number, height: number }) { - const tmpPath = destPath + '.tmp' - + const tmpPath = destPath + '.tmp' + extname(destPath) await doRequestAndSaveToFile({ method: 'GET', uri: url }, tmpPath) await processImage({ path: tmpPath }, destPath, size) diff --git a/server/lib/activitypub/process/process-update.ts b/server/lib/activitypub/process/process-update.ts index 03831a00e..c6b42d846 100644 --- a/server/lib/activitypub/process/process-update.ts +++ b/server/lib/activitypub/process/process-update.ts @@ -51,7 +51,7 @@ async function processUpdateVideo (actor: ActorModel, activity: ActivityUpdate) return undefined } - const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: videoObject.id }) + const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: videoObject.id, allowRefresh: false }) const channelActor = await getOrCreateVideoChannelFromVideoObject(videoObject) const updateOptions = { diff --git a/server/lib/activitypub/videos.ts b/server/lib/activitypub/videos.ts index 998f90330..a5d649391 100644 --- a/server/lib/activitypub/videos.ts +++ b/server/lib/activitypub/videos.ts @@ -158,25 +158,30 @@ async function syncVideoExternalAttributes (video: VideoModel, fetchedVideo: Vid async function getOrCreateVideoAndAccountAndChannel (options: { videoObject: VideoTorrentObject | string, syncParam?: SyncParam, - fetchType?: VideoFetchByUrlType + fetchType?: VideoFetchByUrlType, + allowRefresh?: boolean // true by default }) { // Default params const syncParam = options.syncParam || { likes: true, dislikes: true, shares: true, comments: true, thumbnail: true, refreshVideo: false } const fetchType = options.fetchType || 'all' + const allowRefresh = options.allowRefresh !== false // Get video url const videoUrl = getAPUrl(options.videoObject) let videoFromDatabase = await fetchVideoByUrl(videoUrl, fetchType) if (videoFromDatabase) { - const refreshOptions = { - video: videoFromDatabase, - fetchedType: fetchType, - syncParam - } - if (syncParam.refreshVideo === true) videoFromDatabase = await refreshVideoIfNeeded(refreshOptions) - else await JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'video', videoUrl: videoFromDatabase.url } }) + if (allowRefresh === true) { + const refreshOptions = { + video: videoFromDatabase, + fetchedType: fetchType, + syncParam + } + + if (syncParam.refreshVideo === true) videoFromDatabase = await refreshVideoIfNeeded(refreshOptions) + else await JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'video', videoUrl: videoFromDatabase.url } }) + } return { video: videoFromDatabase } } diff --git a/server/lib/job-queue/handlers/activitypub-refresher.ts b/server/lib/job-queue/handlers/activitypub-refresher.ts index 7752b3b40..671b0f487 100644 --- a/server/lib/job-queue/handlers/activitypub-refresher.ts +++ b/server/lib/job-queue/handlers/activitypub-refresher.ts @@ -10,7 +10,8 @@ export type RefreshPayload = { async function refreshAPObject (job: Bull.Job) { const payload = job.data as RefreshPayload - logger.info('Processing AP refresher in job %d.', job.id) + + logger.info('Processing AP refresher in job %d for video %s.', job.id, payload.videoUrl) if (payload.type === 'video') return refreshAPVideo(payload.videoUrl) } diff --git a/server/tests/cli/index.ts b/server/tests/cli/index.ts index 6201314ce..c6b7ec078 100644 --- a/server/tests/cli/index.ts +++ b/server/tests/cli/index.ts @@ -1,6 +1,7 @@ // Order of the tests we want to execute import './create-import-video-file-job' import './create-transcoding-job' +import './optimize-old-videos' import './peertube' import './reset-password' import './update-host' -- cgit v1.2.3 From 6040f87d143a5fa01db79867ece8197c3ce7be47 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 4 Dec 2018 16:02:49 +0100 Subject: Add tmp and redundancy directories --- config/default.yaml | 4 +++- config/production.yaml.example | 4 +++- config/test-1.yaml | 2 ++ config/test-2.yaml | 2 ++ config/test-3.yaml | 2 ++ config/test-4.yaml | 2 ++ config/test-5.yaml | 2 ++ config/test-6.yaml | 2 ++ config/test.yaml | 2 +- server/controllers/api/users/me.ts | 4 ++-- server/controllers/api/video-channel.ts | 2 +- server/controllers/api/videos/import.ts | 6 +++--- server/controllers/api/videos/index.ts | 10 +++++----- server/controllers/static.ts | 9 +++++++-- server/helpers/requests.ts | 9 +++++---- server/helpers/utils.ts | 6 +++--- server/helpers/webtorrent.ts | 6 +++--- server/helpers/youtube-dl.ts | 4 ++-- server/initializers/checker-before-init.ts | 1 + server/initializers/constants.ts | 2 ++ server/lib/activitypub/actor.ts | 4 +--- server/lib/activitypub/videos.ts | 3 +-- server/lib/job-queue/handlers/video-import.ts | 9 ++++----- server/lib/job-queue/handlers/video-views.ts | 4 +--- server/lib/redis.ts | 9 ++++++++- support/docker/production/config/production.yaml | 2 ++ 26 files changed, 70 insertions(+), 42 deletions(-) diff --git a/config/default.yaml b/config/default.yaml index 257ec7ed1..d95fdc57b 100644 --- a/config/default.yaml +++ b/config/default.yaml @@ -45,8 +45,10 @@ smtp: # From the project root directory storage: + tmp: 'storage/tmp/' # Used to download data (imports etc), store uploaded files before processing... avatars: 'storage/avatars/' videos: 'storage/videos/' + redundancy: 'storage/redundancy/' logs: 'storage/logs/' previews: 'storage/previews/' thumbnails: 'storage/thumbnails/' @@ -75,7 +77,7 @@ trending: redundancy: videos: check_interval: '1 hour' # How often you want to check new videos to cache - strategies: + strategies: # Just uncomment strategies you want # - # size: '10GB' # # Minimum time the video must remain in the cache. Only accept values > 10 hours (to not overload remote instances) diff --git a/config/production.yaml.example b/config/production.yaml.example index ac15fc736..4c50a550b 100644 --- a/config/production.yaml.example +++ b/config/production.yaml.example @@ -46,8 +46,10 @@ smtp: # From the project root directory storage: + tmp: '/var/www/peertube/storage/tmp/' # Used to download data (imports etc), store uploaded files before processing... avatars: '/var/www/peertube/storage/avatars/' videos: '/var/www/peertube/storage/videos/' + redundancy: '/var/www/peertube/storage/videos/' logs: '/var/www/peertube/storage/logs/' previews: '/var/www/peertube/storage/previews/' thumbnails: '/var/www/peertube/storage/thumbnails/' @@ -76,7 +78,7 @@ trending: redundancy: videos: check_interval: '1 hour' # How often you want to check new videos to cache - strategies: + strategies: # Just uncomment strategies you want # - # size: '10GB' # # Minimum time the video must remain in the cache. Only accept values > 10 hours (to not overload remote instances) diff --git a/config/test-1.yaml b/config/test-1.yaml index 503bbc661..8f4f66d2a 100644 --- a/config/test-1.yaml +++ b/config/test-1.yaml @@ -10,8 +10,10 @@ database: # From the project root directory storage: + tmp: 'test1/tmp/' avatars: 'test1/avatars/' videos: 'test1/videos/' + redundancy: 'test1/redundancy/' logs: 'test1/logs/' previews: 'test1/previews/' thumbnails: 'test1/thumbnails/' diff --git a/config/test-2.yaml b/config/test-2.yaml index 8c77bf581..a80ec6e54 100644 --- a/config/test-2.yaml +++ b/config/test-2.yaml @@ -10,8 +10,10 @@ database: # From the project root directory storage: + tmp: 'test2/tmp/' avatars: 'test2/avatars/' videos: 'test2/videos/' + redundancy: 'test2/redundancy/' logs: 'test2/logs/' previews: 'test2/previews/' thumbnails: 'test2/thumbnails/' diff --git a/config/test-3.yaml b/config/test-3.yaml index 82d89567a..934401eb0 100644 --- a/config/test-3.yaml +++ b/config/test-3.yaml @@ -10,8 +10,10 @@ database: # From the project root directory storage: + tmp: 'test3/tmp/' avatars: 'test3/avatars/' videos: 'test3/videos/' + redundancy: 'test3/redundancy/' logs: 'test3/logs/' previews: 'test3/previews/' thumbnails: 'test3/thumbnails/' diff --git a/config/test-4.yaml b/config/test-4.yaml index 1aa56d041..ee99b250b 100644 --- a/config/test-4.yaml +++ b/config/test-4.yaml @@ -10,8 +10,10 @@ database: # From the project root directory storage: + tmp: 'test4/tmp/' avatars: 'test4/avatars/' videos: 'test4/videos/' + redundancy: 'test4/redundancy/' logs: 'test4/logs/' previews: 'test4/previews/' thumbnails: 'test4/thumbnails/' diff --git a/config/test-5.yaml b/config/test-5.yaml index 5f1c2f583..e2662bdd9 100644 --- a/config/test-5.yaml +++ b/config/test-5.yaml @@ -10,8 +10,10 @@ database: # From the project root directory storage: + tmp: 'test5/tmp/' avatars: 'test5/avatars/' videos: 'test5/videos/' + redundancy: 'test5/redundancy/' logs: 'test5/logs/' previews: 'test5/previews/' thumbnails: 'test5/thumbnails/' diff --git a/config/test-6.yaml b/config/test-6.yaml index 719629844..ad39c6a9f 100644 --- a/config/test-6.yaml +++ b/config/test-6.yaml @@ -10,8 +10,10 @@ database: # From the project root directory storage: + tmp: 'test6/tmp/' avatars: 'test6/avatars/' videos: 'test6/videos/' + redundancy: 'test6/redundancy/' logs: 'test6/logs/' previews: 'test6/previews/' thumbnails: 'test6/thumbnails/' diff --git a/config/test.yaml b/config/test.yaml index 9c051fabc..51a77e2fd 100644 --- a/config/test.yaml +++ b/config/test.yaml @@ -67,4 +67,4 @@ import: enabled: true instance: - default_nsfw_policy: 'display' \ No newline at end of file + default_nsfw_policy: 'display' diff --git a/server/controllers/api/users/me.ts b/server/controllers/api/users/me.ts index 82299747d..47f2c9ec7 100644 --- a/server/controllers/api/users/me.ts +++ b/server/controllers/api/users/me.ts @@ -42,7 +42,7 @@ import { AccountModel } from '../../../models/account/account' const auditLogger = auditLoggerFactory('users-me') -const reqAvatarFile = createReqFiles([ 'avatarfile' ], IMAGE_MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.AVATARS_DIR }) +const reqAvatarFile = createReqFiles([ 'avatarfile' ], IMAGE_MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.TMP_DIR }) const meRouter = express.Router() @@ -348,7 +348,7 @@ async function updateMe (req: express.Request, res: express.Response, next: expr return res.sendStatus(204) } -async function updateMyAvatar (req: express.Request, res: express.Response, next: express.NextFunction) { +async function updateMyAvatar (req: express.Request, res: express.Response) { const avatarPhysicalFile = req.files[ 'avatarfile' ][ 0 ] const user: UserModel = res.locals.oauth.token.user const oldUserAuditView = new UserAuditView(user.toFormattedJSON()) diff --git a/server/controllers/api/video-channel.ts b/server/controllers/api/video-channel.ts index 9bf3c5fd8..63240dfa1 100644 --- a/server/controllers/api/video-channel.ts +++ b/server/controllers/api/video-channel.ts @@ -32,7 +32,7 @@ import { resetSequelizeInstance } from '../../helpers/database-utils' import { UserModel } from '../../models/account/user' const auditLogger = auditLoggerFactory('channels') -const reqAvatarFile = createReqFiles([ 'avatarfile' ], IMAGE_MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.AVATARS_DIR }) +const reqAvatarFile = createReqFiles([ 'avatarfile' ], IMAGE_MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.TMP_DIR }) const videoChannelRouter = express.Router() diff --git a/server/controllers/api/videos/import.ts b/server/controllers/api/videos/import.ts index 398fd5a7f..f27d648c7 100644 --- a/server/controllers/api/videos/import.ts +++ b/server/controllers/api/videos/import.ts @@ -37,9 +37,9 @@ const reqVideoFileImport = createReqFiles( [ 'thumbnailfile', 'previewfile', 'torrentfile' ], Object.assign({}, TORRENT_MIMETYPE_EXT, IMAGE_MIMETYPE_EXT), { - thumbnailfile: CONFIG.STORAGE.THUMBNAILS_DIR, - previewfile: CONFIG.STORAGE.PREVIEWS_DIR, - torrentfile: CONFIG.STORAGE.TORRENTS_DIR + thumbnailfile: CONFIG.STORAGE.TMP_DIR, + previewfile: CONFIG.STORAGE.TMP_DIR, + torrentfile: CONFIG.STORAGE.TMP_DIR } ) diff --git a/server/controllers/api/videos/index.ts b/server/controllers/api/videos/index.ts index 3d1b2e1a2..4e4697ef4 100644 --- a/server/controllers/api/videos/index.ts +++ b/server/controllers/api/videos/index.ts @@ -67,17 +67,17 @@ const reqVideoFileAdd = createReqFiles( [ 'videofile', 'thumbnailfile', 'previewfile' ], Object.assign({}, VIDEO_MIMETYPE_EXT, IMAGE_MIMETYPE_EXT), { - videofile: CONFIG.STORAGE.VIDEOS_DIR, - thumbnailfile: CONFIG.STORAGE.THUMBNAILS_DIR, - previewfile: CONFIG.STORAGE.PREVIEWS_DIR + videofile: CONFIG.STORAGE.TMP_DIR, + thumbnailfile: CONFIG.STORAGE.TMP_DIR, + previewfile: CONFIG.STORAGE.TMP_DIR } ) const reqVideoFileUpdate = createReqFiles( [ 'thumbnailfile', 'previewfile' ], IMAGE_MIMETYPE_EXT, { - thumbnailfile: CONFIG.STORAGE.THUMBNAILS_DIR, - previewfile: CONFIG.STORAGE.PREVIEWS_DIR + thumbnailfile: CONFIG.STORAGE.TMP_DIR, + previewfile: CONFIG.STORAGE.TMP_DIR } ) diff --git a/server/controllers/static.ts b/server/controllers/static.ts index 75e30353c..f16a7d72b 100644 --- a/server/controllers/static.ts +++ b/server/controllers/static.ts @@ -34,12 +34,17 @@ staticRouter.use( ) // Videos path for webseeding -const videosPhysicalPath = CONFIG.STORAGE.VIDEOS_DIR staticRouter.use( STATIC_PATHS.WEBSEED, cors(), - express.static(videosPhysicalPath) + express.static(CONFIG.STORAGE.VIDEOS_DIR) ) +staticRouter.use( + STATIC_PATHS.WEBSEED, + cors(), + express.static(CONFIG.STORAGE.REDUNDANCY_DIR, { fallthrough: false }) // 404, because we don't have this video +) + staticRouter.use( STATIC_DOWNLOAD_PATHS.VIDEOS + ':id-:resolution([0-9]+).:extension', asyncMiddleware(videosGetValidator), diff --git a/server/helpers/requests.ts b/server/helpers/requests.ts index 5760ad1c1..3fc776f1a 100644 --- a/server/helpers/requests.ts +++ b/server/helpers/requests.ts @@ -1,9 +1,9 @@ import * as Bluebird from 'bluebird' import { createWriteStream } from 'fs-extra' import * as request from 'request' -import { ACTIVITY_PUB } from '../initializers' +import { ACTIVITY_PUB, CONFIG } from '../initializers' import { processImage } from './image-utils' -import { extname } from 'path' +import { join } from 'path' function doRequest ( requestOptions: request.CoreOptions & request.UriOptions & { activityPub?: boolean } @@ -29,10 +29,11 @@ function doRequestAndSaveToFile (requestOptions: request.CoreOptions & request.U }) } -async function downloadImage (url: string, destPath: string, size: { width: number, height: number }) { - const tmpPath = destPath + '.tmp' + extname(destPath) +async function downloadImage (url: string, destDir: string, destName: string, size: { width: number, height: number }) { + const tmpPath = join(CONFIG.STORAGE.TMP_DIR, 'pending-' + destName) await doRequestAndSaveToFile({ method: 'GET', uri: url }, tmpPath) + const destPath = join(destDir, destName) await processImage({ path: tmpPath }, destPath, size) } diff --git a/server/helpers/utils.ts b/server/helpers/utils.ts index 5c9d6fe2f..9b89e3e61 100644 --- a/server/helpers/utils.ts +++ b/server/helpers/utils.ts @@ -46,11 +46,11 @@ const getServerActor = memoizee(async function () { return actor }) -function generateVideoTmpPath (target: string | ParseTorrent) { +function generateVideoImportTmpPath (target: string | ParseTorrent) { const id = typeof target === 'string' ? target : target.infoHash const hash = sha256(id) - return join(CONFIG.STORAGE.VIDEOS_DIR, hash + '-import.mp4') + return join(CONFIG.STORAGE.TMP_DIR, hash + '-import.mp4') } function getSecureTorrentName (originalName: string) { @@ -103,6 +103,6 @@ export { getSecureTorrentName, getServerActor, getServerCommit, - generateVideoTmpPath, + generateVideoImportTmpPath, getUUIDFromFilename } diff --git a/server/helpers/webtorrent.ts b/server/helpers/webtorrent.ts index ce35b87da..3c9a0b96a 100644 --- a/server/helpers/webtorrent.ts +++ b/server/helpers/webtorrent.ts @@ -1,5 +1,5 @@ import { logger } from './logger' -import { generateVideoTmpPath } from './utils' +import { generateVideoImportTmpPath } from './utils' import * as WebTorrent from 'webtorrent' import { createWriteStream, ensureDir, remove } from 'fs-extra' import { CONFIG } from '../initializers' @@ -9,10 +9,10 @@ async function downloadWebTorrentVideo (target: { magnetUri: string, torrentName const id = target.magnetUri || target.torrentName let timer - const path = generateVideoTmpPath(id) + const path = generateVideoImportTmpPath(id) logger.info('Importing torrent video %s', id) - const directoryPath = join(CONFIG.STORAGE.VIDEOS_DIR, 'import') + const directoryPath = join(CONFIG.STORAGE.TMP_DIR, 'webtorrent') await ensureDir(directoryPath) return new Promise((res, rej) => { diff --git a/server/helpers/youtube-dl.ts b/server/helpers/youtube-dl.ts index 2a5663042..b74351b42 100644 --- a/server/helpers/youtube-dl.ts +++ b/server/helpers/youtube-dl.ts @@ -1,7 +1,7 @@ import { truncate } from 'lodash' import { CONSTRAINTS_FIELDS, VIDEO_CATEGORIES } from '../initializers' import { logger } from './logger' -import { generateVideoTmpPath } from './utils' +import { generateVideoImportTmpPath } from './utils' import { join } from 'path' import { root } from './core-utils' import { ensureDir, writeFile, remove } from 'fs-extra' @@ -40,7 +40,7 @@ function getYoutubeDLInfo (url: string, opts?: string[]): Promise } function downloadYoutubeDLVideo (url: string, timeout: number) { - const path = generateVideoTmpPath(url) + const path = generateVideoImportTmpPath(url) let timer logger.info('Importing youtubeDL video %s', url) diff --git a/server/initializers/checker-before-init.ts b/server/initializers/checker-before-init.ts index 9dfb5d68c..b51c7cfba 100644 --- a/server/initializers/checker-before-init.ts +++ b/server/initializers/checker-before-init.ts @@ -12,6 +12,7 @@ function checkMissedConfig () { 'database.hostname', 'database.port', 'database.suffix', 'database.username', 'database.password', 'database.pool.max', 'smtp.hostname', 'smtp.port', 'smtp.username', 'smtp.password', 'smtp.tls', 'smtp.from_address', 'storage.avatars', 'storage.videos', 'storage.logs', 'storage.previews', 'storage.thumbnails', 'storage.torrents', 'storage.cache', + 'storage.redundancy', 'storage.tmp', 'log.level', 'user.video_quota', 'user.video_quota_daily', 'cache.previews.size', 'admin.email', diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 8a8bcd126..876aa1cf5 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -185,9 +185,11 @@ const CONFIG = { FROM_ADDRESS: config.get('smtp.from_address') }, STORAGE: { + TMP_DIR: buildPath(config.get('storage.tmp')), AVATARS_DIR: buildPath(config.get('storage.avatars')), LOG_DIR: buildPath(config.get('storage.logs')), VIDEOS_DIR: buildPath(config.get('storage.videos')), + REDUNDANCY_DIR: buildPath(config.get('storage.redundancy')), THUMBNAILS_DIR: buildPath(config.get('storage.thumbnails')), PREVIEWS_DIR: buildPath(config.get('storage.previews')), CAPTIONS_DIR: buildPath(config.get('storage.captions')), diff --git a/server/lib/activitypub/actor.ts b/server/lib/activitypub/actor.ts index 504263c99..bbe48833d 100644 --- a/server/lib/activitypub/actor.ts +++ b/server/lib/activitypub/actor.ts @@ -178,9 +178,7 @@ async function fetchAvatarIfExists (actorJSON: ActivityPubActor) { const extension = IMAGE_MIMETYPE_EXT[actorJSON.icon.mediaType] const avatarName = uuidv4() + extension - const destPath = join(CONFIG.STORAGE.AVATARS_DIR, avatarName) - - await downloadImage(actorJSON.icon.url, destPath, AVATARS_SIZE) + await downloadImage(actorJSON.icon.url, CONFIG.STORAGE.AVATARS_DIR, avatarName, AVATARS_SIZE) return avatarName } diff --git a/server/lib/activitypub/videos.ts b/server/lib/activitypub/videos.ts index a5d649391..3d17e6846 100644 --- a/server/lib/activitypub/videos.ts +++ b/server/lib/activitypub/videos.ts @@ -95,9 +95,8 @@ function fetchRemoteVideoStaticFile (video: VideoModel, path: string, reject: Fu function generateThumbnailFromUrl (video: VideoModel, icon: ActivityIconObject) { const thumbnailName = video.getThumbnailName() - const thumbnailPath = join(CONFIG.STORAGE.THUMBNAILS_DIR, thumbnailName) - return downloadImage(icon.url, thumbnailPath, THUMBNAILS_SIZE) + return downloadImage(icon.url, CONFIG.STORAGE.THUMBNAILS_DIR, thumbnailName, THUMBNAILS_SIZE) } function getOrCreateVideoChannelFromVideoObject (videoObject: VideoTorrentObject) { diff --git a/server/lib/job-queue/handlers/video-import.ts b/server/lib/job-queue/handlers/video-import.ts index 4de901c0c..51a0b5faf 100644 --- a/server/lib/job-queue/handlers/video-import.ts +++ b/server/lib/job-queue/handlers/video-import.ts @@ -7,7 +7,7 @@ import { getDurationFromVideoFile, getVideoFileFPS, getVideoFileResolution } fro import { extname, join } from 'path' import { VideoFileModel } from '../../../models/video/video-file' import { CONFIG, PREVIEWS_SIZE, sequelizeTypescript, THUMBNAILS_SIZE, VIDEO_IMPORT_TIMEOUT } from '../../../initializers' -import { doRequestAndSaveToFile, downloadImage } from '../../../helpers/requests' +import { downloadImage } from '../../../helpers/requests' import { VideoState } from '../../../../shared' import { JobQueue } from '../index' import { federateVideoIfNeeded } from '../../activitypub' @@ -109,6 +109,7 @@ async function processFile (downloader: () => Promise, videoImport: Vide let tempVideoPath: string let videoDestFile: string let videoFile: VideoFileModel + try { // Download video from youtubeDL tempVideoPath = await downloader() @@ -144,8 +145,7 @@ async function processFile (downloader: () => Promise, videoImport: Vide // Process thumbnail if (options.downloadThumbnail) { if (options.thumbnailUrl) { - const destThumbnailPath = join(CONFIG.STORAGE.THUMBNAILS_DIR, videoImport.Video.getThumbnailName()) - await downloadImage(options.thumbnailUrl, destThumbnailPath, THUMBNAILS_SIZE) + await downloadImage(options.thumbnailUrl, CONFIG.STORAGE.THUMBNAILS_DIR, videoImport.Video.getThumbnailName(), THUMBNAILS_SIZE) } else { await videoImport.Video.createThumbnail(videoFile) } @@ -156,8 +156,7 @@ async function processFile (downloader: () => Promise, videoImport: Vide // Process preview if (options.downloadPreview) { if (options.thumbnailUrl) { - const destPreviewPath = join(CONFIG.STORAGE.PREVIEWS_DIR, videoImport.Video.getPreviewName()) - await downloadImage(options.thumbnailUrl, destPreviewPath, PREVIEWS_SIZE) + await downloadImage(options.thumbnailUrl, CONFIG.STORAGE.PREVIEWS_DIR, videoImport.Video.getPreviewName(), PREVIEWS_SIZE) } else { await videoImport.Video.createPreview(videoFile) } diff --git a/server/lib/job-queue/handlers/video-views.ts b/server/lib/job-queue/handlers/video-views.ts index 038ef43e2..fa1fd13b3 100644 --- a/server/lib/job-queue/handlers/video-views.ts +++ b/server/lib/job-queue/handlers/video-views.ts @@ -23,9 +23,7 @@ async function processVideosViews () { for (const videoId of videoIds) { try { const views = await Redis.Instance.getVideoViews(videoId, hour) - if (isNaN(views)) { - logger.error('Cannot process videos views of video %d in hour %d: views number is NaN (%s).', videoId, hour, views) - } else { + if (views) { logger.debug('Adding %d views to video %d in hour %d.', views, videoId, hour) try { diff --git a/server/lib/redis.ts b/server/lib/redis.ts index abd75d512..3e25e6a2c 100644 --- a/server/lib/redis.ts +++ b/server/lib/redis.ts @@ -121,7 +121,14 @@ class Redis { const key = this.generateVideoViewKey(videoId, hour) const valueString = await this.getValue(key) - return parseInt(valueString, 10) + const valueInt = parseInt(valueString, 10) + + if (isNaN(valueInt)) { + logger.error('Cannot get videos views of video %d in hour %d: views number is NaN (%s).', videoId, hour, valueString) + return undefined + } + + return valueInt } async getVideosIdViewed (hour: number) { diff --git a/support/docker/production/config/production.yaml b/support/docker/production/config/production.yaml index 4970bbcca..846c838e8 100644 --- a/support/docker/production/config/production.yaml +++ b/support/docker/production/config/production.yaml @@ -32,8 +32,10 @@ redis: # From the project root directory storage: + tmp: '../data/tmp/' avatars: '../data/avatars/' videos: '../data/videos/' + redundancy: '../data/redundancy/' logs: '../data/logs/' previews: '../data/previews/' thumbnails: '../data/thumbnails/' -- cgit v1.2.3 From b9fffa297f49a84df8ffd0d7b842599bc88a8e3e Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 4 Dec 2018 17:08:55 +0100 Subject: Create redundancy endpoint --- server/controllers/static.ts | 6 ++--- server/initializers/constants.ts | 1 + .../lib/schedulers/videos-redundancy-scheduler.ts | 4 ++-- server/models/redundancy/video-redundancy.ts | 4 ++-- server/models/video/video.ts | 10 ++++++-- server/tests/api/redundancy/redundancy.ts | 27 ++++++++++++---------- support/nginx/peertube | 9 ++++++-- 7 files changed, 38 insertions(+), 23 deletions(-) diff --git a/server/controllers/static.ts b/server/controllers/static.ts index f16a7d72b..55e7392a1 100644 --- a/server/controllers/static.ts +++ b/server/controllers/static.ts @@ -37,12 +37,12 @@ staticRouter.use( staticRouter.use( STATIC_PATHS.WEBSEED, cors(), - express.static(CONFIG.STORAGE.VIDEOS_DIR) + express.static(CONFIG.STORAGE.VIDEOS_DIR, { fallthrough: false }) // 404 because we don't have this video ) staticRouter.use( - STATIC_PATHS.WEBSEED, + STATIC_PATHS.REDUNDANCY, cors(), - express.static(CONFIG.STORAGE.REDUNDANCY_DIR, { fallthrough: false }) // 404, because we don't have this video + express.static(CONFIG.STORAGE.REDUNDANCY_DIR, { fallthrough: false }) // 404 because we don't have this video ) staticRouter.use( diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts index 876aa1cf5..7195ae6c5 100644 --- a/server/initializers/constants.ts +++ b/server/initializers/constants.ts @@ -571,6 +571,7 @@ const STATIC_PATHS = { THUMBNAILS: '/static/thumbnails/', TORRENTS: '/static/torrents/', WEBSEED: '/static/webseed/', + REDUNDANCY: '/static/redundancy/', AVATARS: '/static/avatars/', VIDEO_CAPTIONS: '/static/video-captions/' } diff --git a/server/lib/schedulers/videos-redundancy-scheduler.ts b/server/lib/schedulers/videos-redundancy-scheduler.ts index 8b7f33539..2a99a665d 100644 --- a/server/lib/schedulers/videos-redundancy-scheduler.ts +++ b/server/lib/schedulers/videos-redundancy-scheduler.ts @@ -145,13 +145,13 @@ export class VideosRedundancyScheduler extends AbstractScheduler { const tmpPath = await downloadWebTorrentVideo({ magnetUri }, VIDEO_IMPORT_TIMEOUT) - const destPath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename(file)) + const destPath = join(CONFIG.STORAGE.REDUNDANCY_DIR, video.getVideoFilename(file)) await rename(tmpPath, destPath) const createdModel = await VideoRedundancyModel.create({ expiresOn: this.buildNewExpiration(redundancy.minLifetime), url: getVideoCacheFileActivityPubUrl(file), - fileUrl: video.getVideoFileUrl(file, CONFIG.WEBSERVER.URL), + fileUrl: video.getVideoRedundancyUrl(file, CONFIG.WEBSERVER.URL), strategy: redundancy.strategy, videoFileId: file.id, actorId: serverActor.id diff --git a/server/models/redundancy/video-redundancy.ts b/server/models/redundancy/video-redundancy.ts index 9de4356b4..dd37dad22 100644 --- a/server/models/redundancy/video-redundancy.ts +++ b/server/models/redundancy/video-redundancy.ts @@ -15,7 +15,7 @@ import { import { ActorModel } from '../activitypub/actor' import { getVideoSort, throwIfNotValid } from '../utils' import { isActivityPubUrlValid, isUrlValid } from '../../helpers/custom-validators/activitypub/misc' -import { CONFIG, CONSTRAINTS_FIELDS, VIDEO_EXT_MIMETYPE } from '../../initializers' +import { CONFIG, CONSTRAINTS_FIELDS, STATIC_PATHS, VIDEO_EXT_MIMETYPE } from '../../initializers' import { VideoFileModel } from '../video/video-file' import { getServerActor } from '../../helpers/utils' import { VideoModel } from '../video/video' @@ -124,7 +124,7 @@ export class VideoRedundancyModel extends Model { const logIdentifier = `${videoFile.Video.uuid}-${videoFile.resolution}` logger.info('Removing duplicated video file %s.', logIdentifier) - videoFile.Video.removeFile(videoFile) + videoFile.Video.removeFile(videoFile, true) .catch(err => logger.error('Cannot delete %s files.', logIdentifier, { err })) return undefined diff --git a/server/models/video/video.ts b/server/models/video/video.ts index 0f18d9f0c..e8cb5aa88 100644 --- a/server/models/video/video.ts +++ b/server/models/video/video.ts @@ -1538,8 +1538,10 @@ export class VideoModel extends Model { .catch(err => logger.warn('Cannot delete preview %s.', previewPath, { err })) } - removeFile (videoFile: VideoFileModel) { - const filePath = join(CONFIG.STORAGE.VIDEOS_DIR, this.getVideoFilename(videoFile)) + removeFile (videoFile: VideoFileModel, isRedundancy = false) { + const baseDir = isRedundancy ? CONFIG.STORAGE.REDUNDANCY_DIR : CONFIG.STORAGE.VIDEOS_DIR + + const filePath = join(baseDir, this.getVideoFilename(videoFile)) return remove(filePath) .catch(err => logger.warn('Cannot delete file %s.', filePath, { err })) } @@ -1617,6 +1619,10 @@ export class VideoModel extends Model { return baseUrlHttp + STATIC_PATHS.WEBSEED + this.getVideoFilename(videoFile) } + getVideoRedundancyUrl (videoFile: VideoFileModel, baseUrlHttp: string) { + return baseUrlHttp + STATIC_PATHS.REDUNDANCY + this.getVideoFilename(videoFile) + } + getVideoFileDownloadUrl (videoFile: VideoFileModel, baseUrlHttp: string) { return baseUrlHttp + STATIC_DOWNLOAD_PATHS.VIDEOS + this.getVideoFilename(videoFile) } diff --git a/server/tests/api/redundancy/redundancy.ts b/server/tests/api/redundancy/redundancy.ts index a8a2f305f..5b29a503a 100644 --- a/server/tests/api/redundancy/redundancy.ts +++ b/server/tests/api/redundancy/redundancy.ts @@ -136,7 +136,7 @@ async function check2Webseeds (strategy: VideoRedundancyStrategy, videoUUID?: st if (!videoUUID) videoUUID = video1Server2UUID const webseeds = [ - 'http://localhost:9001/static/webseed/' + videoUUID, + 'http://localhost:9001/static/redundancy/' + videoUUID, 'http://localhost:9002/static/webseed/' + videoUUID ] @@ -148,20 +148,23 @@ async function check2Webseeds (strategy: VideoRedundancyStrategy, videoUUID?: st for (const file of video.files) { checkMagnetWebseeds(file, webseeds, server) - // Only servers 1 and 2 have the video - if (server.serverNumber !== 3) { - await makeGetRequest({ - url: server.url, - statusCodeExpected: 200, - path: '/static/webseed/' + `${videoUUID}-${file.resolution.id}.mp4`, - contentType: null - }) - } + await makeGetRequest({ + url: servers[0].url, + statusCodeExpected: 200, + path: '/static/redundancy/' + `${videoUUID}-${file.resolution.id}.mp4`, + contentType: null + }) + await makeGetRequest({ + url: servers[1].url, + statusCodeExpected: 200, + path: '/static/webseed/' + `${videoUUID}-${file.resolution.id}.mp4`, + contentType: null + }) } } - for (const directory of [ 'test1', 'test2' ]) { - const files = await readdir(join(root(), directory, 'videos')) + for (const directory of [ 'test1/redundancy', 'test2/videos' ]) { + const files = await readdir(join(root(), directory)) expect(files).to.have.length.at.least(4) for (const resolution of [ 240, 360, 480, 720 ]) { diff --git a/support/nginx/peertube b/support/nginx/peertube index b00031133..e0b006088 100644 --- a/support/nginx/peertube +++ b/support/nginx/peertube @@ -105,7 +105,7 @@ server { } # Bypass PeerTube for performance reasons. Could be removed - location /static/webseed { + location ~ ^/static/(webseed|redundancy)/ { # Clients usually have 4 simultaneous webseed connections, so the real limit is 3MB/s per client limit_rate 800k; @@ -128,7 +128,12 @@ server { access_log off; } - alias /var/www/peertube/storage/videos; + root /var/www/peertube/storage; + + rewrite ^/static/webseed/(.*)$ /videos/$1 break; + rewrite ^/static/redundancy/(.*)$ /redundancy/$1 break; + + try_files $uri /; } # Websocket tracker -- cgit v1.2.3 From 9024bece9a51d3bc666ba94f272aaec186e3c278 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nathana=C3=ABl=20J?= Date: Tue, 4 Dec 2018 14:23:28 +0100 Subject: Use `'` instead of `'` for passwords in the documentation (see #1453) --- support/doc/tools.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/support/doc/tools.md b/support/doc/tools.md index 5a1f212b1..98048ec41 100644 --- a/support/doc/tools.md +++ b/support/doc/tools.md @@ -82,7 +82,7 @@ The wrapper provides a convenient interface to the following scripts. You can ac The wrapper can keep track of instances you have an account on. We limit to one account per instance for now. ```bash -$ peertube auth add -u "PEERTUBE_URL" -U "PEERTUBE_USER" --password "PEERTUBE_PASSWORD" +$ peertube auth add -u "PEERTUBE_URL" -U "PEERTUBE_USER" --password 'PEERTUBE_PASSWORD' $ peertube auth list ┌──────────────────────────────┬──────────────────────────────┐ │ instance │ login │ @@ -112,7 +112,7 @@ Be sure you own the videos or have the author's authorization to do so. $ node dist/server/tools/peertube-import-videos.js \ -u "PEERTUBE_URL" \ -U "PEERTUBE_USER" \ - --password "PEERTUBE_PASSWORD" \ + --password 'PEERTUBE_PASSWORD' \ -t "TARGET_URL" ``` -- cgit v1.2.3 From 5b036b8ef2f15c30afe6cddfe9bcfc5816b08bba Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 4 Dec 2018 17:19:44 +0100 Subject: Better tools.md doc --- support/doc/tools.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/support/doc/tools.md b/support/doc/tools.md index 98048ec41..69d68464a 100644 --- a/support/doc/tools.md +++ b/support/doc/tools.md @@ -82,12 +82,12 @@ The wrapper provides a convenient interface to the following scripts. You can ac The wrapper can keep track of instances you have an account on. We limit to one account per instance for now. ```bash -$ peertube auth add -u "PEERTUBE_URL" -U "PEERTUBE_USER" --password 'PEERTUBE_PASSWORD' +$ peertube auth add -u 'PEERTUBE_URL' -U 'PEERTUBE_USER' --password 'PEERTUBE_PASSWORD' $ peertube auth list ┌──────────────────────────────┬──────────────────────────────┐ │ instance │ login │ ├──────────────────────────────┼──────────────────────────────┤ -│ "PEERTUBE_URL" │ "PEERTUBE_USER" │ +│ 'PEERTUBE_URL' │ 'PEERTUBE_USER' │ └──────────────────────────────┴──────────────────────────────┘ ``` @@ -110,15 +110,15 @@ Be sure you own the videos or have the author's authorization to do so. ```sh $ node dist/server/tools/peertube-import-videos.js \ - -u "PEERTUBE_URL" \ - -U "PEERTUBE_USER" \ + -u 'PEERTUBE_URL' \ + -U 'PEERTUBE_USER' \ --password 'PEERTUBE_PASSWORD' \ - -t "TARGET_URL" + -t 'TARGET_URL' ``` * `PEERTUBE_URL` : the full URL of your PeerTube server where you want to import, eg: https://peertube.cpy.re * `PEERTUBE_USER` : your PeerTube account where videos will be uploaded -* `PEERTUBE_PASSWORD` : password of your PeerTube account (if omitted, you will be prompted for it) +* `PEERTUBE_PASSWORD` : password of your PeerTube account (if `PEERTUBE_PASSWORD` is omitted, you will be prompted for it) * `TARGET_URL` : the target url you want to import. Examples: * YouTube: * Channel: https://www.youtube.com/channel/ChannelId -- cgit v1.2.3 From d7aea77bdb989df7df4a9c492f5e5ab033291e07 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Tue, 4 Dec 2018 17:43:24 +0100 Subject: Add ru pl and it translations --- client/src/locale/target/angular_ar_001.xml | 301 ++++++++++ client/src/locale/target/angular_eu_ES.xml | 358 ++++++++++++ client/src/locale/target/angular_it_IT.xml | 141 +++++ client/src/locale/target/angular_oc.xml | 67 +++ client/src/locale/target/angular_pl_PL.xml | 4 + client/src/locale/target/angular_sv_SE.xml | 14 + client/src/locale/target/angular_zh_Hant_TW.xml | 67 +++ client/src/locale/target/iso639_pl_PL.xml | 695 ------------------------ client/src/locale/target/player_ar_001.xml | 2 +- client/src/locale/target/player_it_IT.json | 1 + client/src/locale/target/player_pl_PL.json | 1 + client/src/locale/target/player_pl_PL.xml | 383 ------------- client/src/locale/target/player_ru_RU.json | 1 + client/src/locale/target/server_it_IT.json | 1 + client/src/locale/target/server_pl_PL.json | 1 + client/src/locale/target/server_pl_PL.xml | 147 ----- client/src/locale/target/server_ru_RU.json | 1 + scripts/build/client.sh | 2 +- shared/models/i18n/i18n.ts | 9 +- 19 files changed, 966 insertions(+), 1230 deletions(-) delete mode 100644 client/src/locale/target/iso639_pl_PL.xml create mode 100644 client/src/locale/target/player_it_IT.json create mode 100644 client/src/locale/target/player_pl_PL.json delete mode 100644 client/src/locale/target/player_pl_PL.xml create mode 100644 client/src/locale/target/player_ru_RU.json create mode 100644 client/src/locale/target/server_it_IT.json create mode 100644 client/src/locale/target/server_pl_PL.json delete mode 100644 client/src/locale/target/server_pl_PL.xml create mode 100644 client/src/locale/target/server_ru_RU.json diff --git a/client/src/locale/target/angular_ar_001.xml b/client/src/locale/target/angular_ar_001.xml index 05e55793d..894798226 100644 --- a/client/src/locale/target/angular_ar_001.xml +++ b/client/src/locale/target/angular_ar_001.xml @@ -1804,6 +1804,13 @@ 159 + + Sorry, but something went wrong + عذرا، لقد حدث خلل ما + + 49 + + Update تحديث @@ -1811,6 +1818,13 @@ 92 + + Select the file to upload + اختر الملف الذي تريد ارساله + + 6 + + Scheduled مبرمجة @@ -1916,6 +1930,20 @@ 177 + + Upload thumbnail + تحديث الصورة المصغرة + + 195 + + + + Upload preview + إرسال معاينة + + 202 + + Support الدعم @@ -2032,6 +2060,13 @@ 57 + + Dislike this video + إلغاء الإعجاب بهذه الفيديو + + 64 + + Download the video تنزيل الفيديو @@ -2060,6 +2095,13 @@ 91 + + Blacklist + حجب في القائمة السوداء + + 96 + + Blacklist this video حجب هذه الفيديو @@ -2109,6 +2151,13 @@ 152 + + Friendly Reminder: + تذكير أخوي: + + 208 + + More information المزيد من التفاصيل @@ -2259,6 +2308,13 @@ 1 + + Configuration updated. + تم تحديث الإعدادات + + 1 + + Unlimited بلا حدود @@ -2280,6 +2336,20 @@ 1 + + enabled + مفعّل + + 1 + + + + disabled + خامل + + 1 + + Comment updated. تم تحديث التعليق. @@ -2336,6 +2406,13 @@ 1 + + Ownership accepted + تم قبول الملكية + + 1 + + Password updated. تم تحديث الكلمة السرية. @@ -2343,6 +2420,13 @@ 1 + + You current password is invalid. + كلمتك السرية الحالية غير صالحة. + + 1 + + Are you sure you want to delete your account? This will delete all you data, including channels, videos etc. متأكد أنك تريد حذف حسابك ؟هذا سيحذف بياناتك,قنواتك,فيديوهاتك الخ. @@ -2413,6 +2497,20 @@ 1 + + Published + المنشورة + + 1 + + + + To import + للاستيراد + + 1 + + Channels القنوات @@ -2420,6 +2518,90 @@ 1 + + Subscribe to the account + الاشتراك في الحساب + + 1 + + + + Toggle the left menu + الانتقال إلى القائمة اليسرى + + 1 + + + + Go to the videos overview page + الذهاب إلى صفحة معاينة الفيديوهات + + 1 + + + + Go to the trending videos page + الذهاب إلى صفحة الفيديوهات الشائعة + + 1 + + + + Go to the recently added videos page + الذهاب إلى صفحةالفيديوهات المضافة حديثا + + 1 + + + + Go to the local videos page + الذهاب إلى صفحة الفيديوهات المحلية + + 1 + + + + Go to the videos upload page + الذهاب إلى صفحة إرسال الفيديوهات + + 1 + + + + Toggle Dark theme + التغيير إلى السمة الداكنة + + 1 + + + + Go to my subscriptions + الذهاب إلى اشتراكاتي + + 1 + + + + Go to my videos + الذهاب إلى فيديوهاتي + + 1 + + + + Go to my imports + الذهاب إلى استيراداتي + + 1 + + + + Go to my channels + الذهاب إلى قنواتي + + 1 + + You need to reconnect. يجب عليك إعادة الإتصال. @@ -2434,6 +2616,13 @@ 1 + + Keyboard Shortcuts: + اختصارات لوحة المفاتيح: + + 1 + + Incorrect username or password. اسم المستخدم أو كلمة المرور خاطئة. @@ -2448,6 +2637,13 @@ 1 + + Your password has been successfully reset! + لقد تم إعادة تعيين كلمتك السرية بنجاح! + + 1 + + Today اليوم @@ -2567,6 +2763,62 @@ 1 + + User role is required. + دور المستخدم مطلوب. + + 1 + + + + Display name is required. + عرض الاسم لازم. + + 1 + + + + Description must be at least 3 characters long. + طول الوصف يجب أن يتعدى 3حروف. + + 1 + + + + Report reason is required. + سبب الإبلاغ لازم. + + 1 + + + + Moderation comment is required. + تعليق الإشراف لازم. + + 1 + + + + The channel is required. + القناة لازمة. + + 1 + + + + The username is required. + اسم المستخدم مطلوب. + + 1 + + + + You can only transfer ownership to a local account + لا يمكن نقل الملكية إلى حساب محلي + + 1 + + Name is required. الاسم مطلوب. @@ -2574,6 +2826,13 @@ 1 + + Name cannot be more than 20 characters long. + طول الاسم لا يجب أن يتجاوز 20 حرفا. + + 1 + + Comment is required. التعليق مطلوب. @@ -2595,6 +2854,13 @@ 1 + + A tag should be less than 30 characters long. + طول الوسم لا يجب أن يتجاوز 30 حرفا. + + 1 + + This file is too large. حجم هذا الملف كبير جدًّا. @@ -2917,6 +3183,20 @@ 1 + + Clear + مسح + + 1 + + + + Torrent import + استيراد تورنت + + 1 + + Links الروابط @@ -2980,6 +3260,20 @@ 1 + + Too many attempts, please try again later. + محاولات كثيرة، يرجى العودة لاحقا. + + 1 + + + + Server error. Please retry later. + خطأ على السيرفر. يرجى إعادة المحاولة لاحقا. + + 1 + + Subscribed مشترك @@ -3036,6 +3330,13 @@ 1 + + Video reported. + فيديو تم الإبلاغ عنها. + + 1 + + Like the video الإعجاب بالفيديو diff --git a/client/src/locale/target/angular_eu_ES.xml b/client/src/locale/target/angular_eu_ES.xml index d30351a35..d17189c7a 100644 --- a/client/src/locale/target/angular_eu_ES.xml +++ b/client/src/locale/target/angular_eu_ES.xml @@ -601,6 +601,13 @@ 17 + + I am at least 16 years old and agree to the <a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'>Terms</a> of this instance + 16 urte edo gehiago ditut eta onartzen ditut instantzia honen <a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'>erabilera badintzak</a> + + 55 + + Signup Eman izena @@ -633,6 +640,19 @@ 6 + + + Filters + + + + Iragazkiak + + + + 16 + + No results found @@ -1239,6 +1259,19 @@ Erabiltzaile berriek izena ematea ez da onartzen orain. 83 + + + PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released. + In the meantime, we want to test different ideas related to this issue: + + + PeerTube oso berria da oraindik, eta egonkortzen denerako babes-neurri egokienak ezarri nahi ditugu. + Bitartean, hainbat ideia saiatu nahi ditugu gai honen inguruan: + + + 85 + + Set a limit to the number of peers sent by the tracker Tracker-ak bidaltzen dituen berdin kopurua mugatzea @@ -1984,6 +2017,20 @@ Erabiltzaile berriek izena ematea ez da onartzen orain. 133 + + User's email must be verified to login + Erabiltzailearen e-mail helbidea baieztatu behar da saioa hasi aurretik + + 70 + + + + User's email is verified / User can login without email verification + Erabiltzailearen e-mail helbidea baieztatuta dago / Erabiltzaileak e-mail helbidea baieztatu gabe saioa hasi dezake + + 74 + + Ban reason: Debekatzeko arrazoia: @@ -2465,6 +2512,13 @@ Kanal honetara bideo bat igotzen duzunean, bideoa babesteko eremua testu honekin 3 + + Use WebTorrent to exchange parts of the video with others + Erabili WebTorrent bideoaren zatiak besteekin partekatzeko + + 21 + + Automatically plays video Automatikoki abiatzen du bideoa @@ -2507,6 +2561,13 @@ Kanal honetara bideo bat igotzen duzunean, bideoa babesteko eremua testu honekin 18 + + Once you delete your account, there is no going back. Please be certain. + Behin kontua ezabatuta ez dago atzera egiterik. Ziurtatu hau dela nahi duzuna. + + 2 + + Delete your account Ezabatu zure kontua @@ -2621,6 +2682,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 159 + + Sorry, but something went wrong + Akatsen bat egon da + + 49 + + Congratulations, the video behind will be imported! You can already add information about this video. @@ -2885,6 +2953,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 159 + + Will be created on update + Eguneratzean sortuko da + + 167 + + Cancel create Ezeztatu sorkuntza @@ -2892,6 +2967,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 169 + + Will be deleted on update + Eguneratzean ezabatuko da + + 175 + + Cancel deletion Ezeztatu ezabaketa @@ -2899,6 +2981,17 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 177 + + + No captions for now. + + + Azpititulurik ez oraingoz. + + + 182 + + Captions Azpitituluak @@ -3337,6 +3430,24 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 20 + + You are one step away from commenting + Iruzkina egitetik urrats batera zaude + + 28 + + + + + If you have an account on this instance, you can login: + + + Instantzia honetan kontua baduzu, saioa hasi dezakezu: + + + 32 + + login to comment hasi saioa iruzkinak egiteko @@ -3344,6 +3455,15 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 35 + + + If you have an account on Mastodon or Pleroma, you can open it directly in their interface: + + Mastodon edo Pleroma sareetan kontua baduzu, zuzenean ireki dezakezu hango interfazean: + + 41 + + Highlighted comment Nabarmendutako iruzkina @@ -3596,6 +3716,20 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + Account unmuted by your instance. + kontua zure instantziak desmutututa. + + 1 + + + + Instance unmuted by your instance. + instantzia zure instantziak demutututa. + + 1 + + Comment updated. Iruzkina eguneratua. @@ -3687,6 +3821,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + Set Email as Verified + Ezarri e-maila baieztatua gisa + + 1 + + You cannot ban root. Ezin duzu root debekatu @@ -3694,6 +3835,20 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + Do you really want to unban users? + Ziur erabiltzaileei debekua kendu nahi diozula? + + 1 + + + + users unbanned. + erabiltzaileei debekua kendu zaie. + + 1 + + You cannot delete root. Ezin duzu erroa ezabatu. @@ -3708,6 +3863,34 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + users deleted. + erabiltzaile ezabatuta. + + 1 + + + + users email set as verified. + erabiltzailearen e-mail helbidea baieztatua gisa ezarri da. + + 1 + + + + Account unmuted. + kontua desmutututa. + + 1 + + + + Instance unmuted. + instantzia desmutututa. + + 1 + + Ownership accepted Jabetza onartuta @@ -3722,6 +3905,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + You current password is invalid. + Zure uneko pasahitza baliogabea da. + + 1 + + Are you sure you want to delete your account? This will delete all you data, including channels, videos etc. Ziur kontua ezabatu nahi duzula? Honek zure datu guztiak ezabatuko ditu, kanalak, bideoak eta abar barne. @@ -3932,6 +4122,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + Toggle the left menu + Txandakatu ezkerreko menua + + 1 + + Go to the videos overview page Joan bideoen ikuspegi orokorraren orrira @@ -3939,6 +4136,69 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + Go to the trending videos page + Joan puri-purian dauden bideoen orrira + + 1 + + + + Go to the recently added videos page + Joan gehitutako azken bideoen orrira + + 1 + + + + Go to the local videos page + Joan bideo lokalen orrira + + 1 + + + + Go to the videos upload page + Joan bideoak igotzeko orrira + + 1 + + + + Toggle Dark theme + Txandakatu gai iluna + + 1 + + + + Go to my subscriptions + Joan nire harpidetzetara + + 1 + + + + Go to my videos + Joan nire bideoetara + + 1 + + + + Go to my imports + Joan nire inportazioetara + + 1 + + + + Go to my channels + Joan nire kanaletara + + 1 + + Cannot retrieve OAuth Client credentials: . @@ -3969,6 +4229,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + Keyboard Shortcuts: + Teklatu laster-bideak: + + 1 + + Incorrect username or password. Erabiltzaile-izen edo pasahitz okerra. @@ -4326,6 +4593,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + Description cannot be more than 1000 characters long. + Deskripzioa ezin da 1000 karaktere baino luzeagoa izan. + + 1 + + You must to agree with the instance terms in order to registering on it. Instantziaren baldintzak onartu behar dituzu bertan izena emateko. @@ -5103,6 +5377,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + users banned. + erabiltzaile debekatuta. + + 1 + + User banned. erabiltzailea debekatuta. @@ -5124,6 +5405,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + If you remove this user, you will not be able to create another with the same username! + Erabiltzaile hau kentzen baduzu, ezin izango duzu erabiltzaile-izen bera duen beste bat sortu gero! + + 1 + + User deleted. erabiltzailea ezabatuta. @@ -5131,6 +5419,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + User email set as verified + erabiltzailearen e-mail helbidea baieztatua gisa ezarri da + + 1 + + Account muted. kontua mutututa. @@ -5138,6 +5433,41 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + Instance muted. + instantzia mutututa. + + 1 + + + + Account muted by the instance. + kontua instantziak mutututa. + + 1 + + + + Account unmuted by the instance. + kontua instantziak desmutututa. + + 1 + + + + Instance muted by the instance. + instantzia instantziak mutututa. + + 1 + + + + Instance unmuted by the instance. + kontua instantziak desmutututa. + + 1 + + Mute this account Mututu kontu hau @@ -5278,6 +5608,20 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + Welcome! Now please check your emails to verify your account and complete signup. + Ongi etorri! Egiaztatu zure e-maila kontua baieztatzeko eta izen ematea osatzeko. + + 1 + + + + You are now logged in as ! + gisa hasi duzu saioa! + + 1 + + Video to import updated. Inportatzeko bideoa eguneratuta. @@ -5327,6 +5671,20 @@ Ezin izan dugu bilatzen duzun orria aurkitu. 1 + + Your video quota is exceeded with this video (video size: , used: , quota: ) + Zure bideo-kuota bideo honekin gainditzen da (bideoaren tamaina: , erabilita: , kuota: ) + + 1 + + + + Your daily video quota is exceeded with this video (video size: , used: , quota: ) + Zure eguneko bideo-kuota bideo honekin gainditzen da (bideoaren tamaina: , erabilita: , kuota: ) + + 1 + + Video published. Bideoa argitaratuta. diff --git a/client/src/locale/target/angular_it_IT.xml b/client/src/locale/target/angular_it_IT.xml index dea48b4a7..2f5178484 100644 --- a/client/src/locale/target/angular_it_IT.xml +++ b/client/src/locale/target/angular_it_IT.xml @@ -613,6 +613,19 @@ 6 + + + Filters + + + + Filtri + + + + 16 + + No results found @@ -1646,6 +1659,21 @@ </pre> + + Scrivi direttamente codice CSS .Esempio:<br /> + <pre> + body + background-color: red; + + </pre> + + Precedi con <em>#custom-css</em> per sovrascrivere stili. Esempio: + <pre> + #custom-css .logged-in-email + color: red; + + </pre> + 297 @@ -1901,6 +1929,10 @@ Transcoding is enabled on server. The video quota only take in account original video. At most, this user could use ~ . + + Il Transcoding e abilitato sul server. La quota video considera solo originale video. + In totale, questo utente potrebbe usare ~ . + 65 @@ -2292,6 +2324,8 @@ Short text to tell people how they can support your channel (membership platform...).<br /><br /> When you will upload a video in this channel, the video support field will be automatically filled by this text. + Breve testo per dire alla gente come possono supportare il tuo canale (iscrizione piattaforma...).<br /><br /> +Quando tu carichi un video su questo canale. il campo di supporto per il video verra riempito con questo testo. 52 @@ -2970,6 +3004,9 @@ When you will upload a video in this channel, the video support field will be au The url is not secured (no HTTPS), so the embed video won't work on HTTPS websites (web browsers block non secured HTTP requests on HTTPS websites). + + L'url non è sicuro (no HTTPS), quindi il video "incluso" non funzionerà su siti HTTPS (il browser blocca richieste verso siti HTTP su siti in cui HTTPS è abilitato). + 45 @@ -2992,6 +3029,9 @@ When you will upload a video in this channel, the video support field will be au The video is being imported, it will be available when the import is finished. + + Il video è nella fase di import, sarà disponibile quando l'import sarà completato. + 11 @@ -3028,6 +3068,9 @@ When you will upload a video in this channel, the video support field will be au Published - views + + Pubblicato - visioni + 37 @@ -3297,6 +3340,20 @@ Altri video 1 + + 240p + 240p + + 1 + + + + 360p + 360p + + 1 + + SuccessSuccess 1 @@ -3316,6 +3373,48 @@ Altri video 1 + + 100MB + 100MB + + 1 + + + + 500MB + 500MB + + 1 + + + + 1GB + 1GB + + 1 + + + + 5GB + 5GB + + 1 + + + + 20GB + 20GB + + 1 + + + + 50GB + 50GB + + 1 + + 10MB 10MB @@ -3400,6 +3499,13 @@ Altri video 1 + + enabled + attivato + + 1 + + disabled disabilitato @@ -3421,6 +3527,13 @@ Altri video 1 + + Delete this report + Elimina questa segnalazione + + 1 + + Update moderation comment Modifica commento di moderazione @@ -3442,6 +3555,13 @@ Altri video 1 + + Do you really want to delete this abuse report? + Vuoi veramente eliminare questa segnalazione di abuso? + + 1 + + Abuse deleted.Abuse deleted. 1 @@ -3501,6 +3621,13 @@ Altri video 1 + + users deleted. + utenti eliminati. + + 1 + + Ownership acceptedOwnership accepted 1 @@ -3576,6 +3703,13 @@ Altri video 1 + + This name already exists on this instance. + Questo nome esiste già nell'istanza. + + 1 + + Create Crea @@ -3705,6 +3839,13 @@ Altri video 1 + + Go to the videos overview page + Vai alla pagina di anteprima dei video + + 1 + + Cannot retrieve OAuth Client credentials: . diff --git a/client/src/locale/target/angular_oc.xml b/client/src/locale/target/angular_oc.xml index c353ead7a..26ff5264e 100644 --- a/client/src/locale/target/angular_oc.xml +++ b/client/src/locale/target/angular_oc.xml @@ -1578,6 +1578,17 @@ 198 + + If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.<br /> + If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.<br /><br /> + Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> to see if you instance is whitelisted. + Se vòstra instància es mesa en lista blanca per Twitter, un lector vidèo serà integrat pel fil Twitter sul partatge d’una vidèo PeerTube.<br /> + Se l’instància es pas en lista blanca, utilizam un imatge amb un ligam que mena a l’instància PeerTube.<br /><br /> + Clicatz aquesta bóstia, salvagardatz la configuracion e ensajatz amb l’URL d’una vidèo de vòstra instància (https://exemple.com/videos/watch/blabla) sus <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> per veire se vòstra instància es en lista blanca. + + 199 + + Services Servicis @@ -2022,6 +2033,20 @@ 133 + + User's email must be verified to login + Lo corrièl de l’utilizaire deu èsser verificat abans la connexion + + 70 + + + + User's email is verified / User can login without email verification + Lo corrièl de l’utilizaire es verificat / Pòt se connectar sens verificacion de l’adreça + + 74 + + Ban reason: Rason del bandiment : @@ -2680,6 +2705,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto 159 + + Sorry, but something went wrong + O planhèm, quicòm a trucat + + 49 + + Congratulations, the video behind will be imported! You can already add information about this video. @@ -3836,6 +3868,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto 1 + + Set Email as Verified + Passar l’adreça coma verificada + + 1 + + You cannot ban root. Podètz pas fòrabandir lo root. @@ -3878,6 +3917,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto 1 + + users email set as verified. + adreças d’utilizaires passadas coma verificadas. + + 1 + + Account unmuted. Compte pas mai mut. @@ -5420,6 +5466,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto 1 + + User email set as verified + L’adreça a es passada coma verificada + + 1 + + Account muted. Lo compte es mut. @@ -5602,6 +5655,20 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto 1 + + Welcome! Now please check your emails to verify your account and complete signup. + La benvenguda ! Ara volgatz ben verificar vòstres corrièls per confirmar vòstre compte e acabar l’inscripcion. + + 1 + + + + You are now logged in as ! + Sètz ara connectat coma ! + + 1 + + Video to import updated. Vidèo d’importar actualizada diff --git a/client/src/locale/target/angular_pl_PL.xml b/client/src/locale/target/angular_pl_PL.xml index fd6e03469..e8494997a 100644 --- a/client/src/locale/target/angular_pl_PL.xml +++ b/client/src/locale/target/angular_pl_PL.xml @@ -1601,6 +1601,10 @@ Transcoding is enabled on server. The video quota only take in account original video. At most, this user could use ~ . + + Transcoding is enabled on server. The video quota only take in account original video. + At most, this user could use ~ . + 65 diff --git a/client/src/locale/target/angular_sv_SE.xml b/client/src/locale/target/angular_sv_SE.xml index e30575d80..eadcfa444 100644 --- a/client/src/locale/target/angular_sv_SE.xml +++ b/client/src/locale/target/angular_sv_SE.xml @@ -5550,6 +5550,20 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt 1 + + Welcome! Now please check your emails to verify your account and complete signup. + Välkommen! Kontrollera gärna din e-post för att verifiera ditt konto och fullfölja kontoskapandet. + + 1 + + + + You are now logged in as ! + Du är nu inloggad som ! + + 1 + + Video to import updated. Videon att importera har uppdaterats. diff --git a/client/src/locale/target/angular_zh_Hant_TW.xml b/client/src/locale/target/angular_zh_Hant_TW.xml index 4779d9cc8..028520a6e 100644 --- a/client/src/locale/target/angular_zh_Hant_TW.xml +++ b/client/src/locale/target/angular_zh_Hant_TW.xml @@ -1538,6 +1538,17 @@ 198 + + If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.<br /> + If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.<br /><br /> + Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> to see if you instance is whitelisted. + 如果您的實體在 Twitter 的白名單裡面,PeerTube 的影片分享將會在 Twitter 的推文中嵌入影片播放器。<br /> + 如果實體不在白名單中,我們會使用一張圖片連結卡片並重新導向至您的 PeerTube 實體。<br /><br /> + 在此勾選框打勾,儲存設定並使用您實體的影片 URL (https://example.com/videos/watch/blabla)在 <a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'>https://cards-dev.twitter.com/validator</a> 上測試以檢視您的實體是否在白名單內。 + + 199 + + Services 服務 @@ -1972,6 +1983,20 @@ 133 + + User's email must be verified to login + 使用者的電子郵件必須驗證過才能登入 + + 70 + + + + User's email is verified / User can login without email verification + 使用者的電子郵件已驗證/使用者可以不透過電子郵件驗證登入 + + 74 + + Ban reason: 阻擋理由: @@ -2628,6 +2653,13 @@ When you will upload a video in this channel, the video support field will be au 159 + + Sorry, but something went wrong + 抱歉,不過好像有什麼東西出錯了 + + 49 + + Congratulations, the video behind will be imported! You can already add information about this video. @@ -3778,6 +3810,13 @@ When you will upload a video in this channel, the video support field will be au 1 + + Set Email as Verified + 設定電子郵件為已驗證 + + 1 + + You cannot ban root. 您不能阻擋 root。 @@ -3820,6 +3859,13 @@ When you will upload a video in this channel, the video support field will be au 1 + + users email set as verified. + 個使用者電子郵件設定為已驗證。 + + 1 + + Account unmuted. 帳號 已解除靜音。 @@ -5362,6 +5408,13 @@ When you will upload a video in this channel, the video support field will be au 1 + + User email set as verified + 使用者 的電子郵件設定為已驗證 + + 1 + + Account muted. 帳號 已解除靜音。 @@ -5544,6 +5597,20 @@ When you will upload a video in this channel, the video support field will be au 1 + + Welcome! Now please check your emails to verify your account and complete signup. + 歡迎!現在請檢查您的電子郵件以驗證您的帳號並完成註冊。 + + 1 + + + + You are now logged in as ! + 您現在登入為 + + 1 + + Video to import updated. 要匯入的影片已更新。 diff --git a/client/src/locale/target/iso639_pl_PL.xml b/client/src/locale/target/iso639_pl_PL.xml deleted file mode 100644 index b483f5ce8..000000000 --- a/client/src/locale/target/iso639_pl_PL.xml +++ /dev/null @@ -1,695 +0,0 @@ - - - - - - - Afar - Afar - - - Abkhazian - Abchaski - - - Afrikaans - Afrikaans - - - Akan - Akan - - - Amharic - Amharski - - - Arabic - Arabski - - - Aragonese - - - American Sign Language - Amerykański Język Migowy - - - Assamese - - - Avaric - Awarski - - - Kotava - - - Aymara - - - Azerbaijani - - - Bashkir - Baszkirski - - - Bambara - Bambara - - - Belarusian - Białoruski - - - Bengali - Bengalski - - - British Sign Language - Brytyjski Język Migowy - - - Bislama - Bislama - - - Tibetan - Tybetański - - - Bosnian - Bośniacki - - - Breton - Bretoński - - - Bulgarian - Bułgarski - - - Brazilian Sign Language - - - Catalan - Kataloński - - - Czech - Czeski - - - Chamorro - - - Chechen - - - Chuvash - - - Cornish - Kornijski - - - Corsican - Korsykański - - - Cree - Kri - - - Czech Sign Language - Czeski Język Migowy - - - Chinese Sign Language - Chiński Język Migowy - - - Welsh - Walijski - - - Danish - Duński - - - German - Niemiecki - - - Dhivehi - - - Danish Sign Language - Duński Język Migowy - - - Dzongkha - Dzongkha - - - Modern Greek (1453-) - Nowogrecki (1453-) - - - English - Angielski - - - Esperanto - - - Estonian - Estoński - - - Basque - Baskijski - - - Ewe - Ewe - - - Faroese - - - Persian - Perski - - - Fijian - Fidżyjski - - - Finnish - Fiński - - - French - Francuski - - - Western Frisian - - - French Sign Language - Francuski Język Migowy - - - Fulah - Ful - - - Scottish Gaelic - - - Irish - Irlandzki - - - Galician - Galicyjski - - - Manx - - - Guarani - - - German Sign Language - Niemiecki Język Migowy - - - Gujarati - - - Haitian - - - Hausa - Hausa - - - Serbo-Croatian - Serbsko-Chorwacki - - - Hebrew - - - Herero - - - Hindi - Hindi - - - Hiri Motu - - - Croatian - Chorwacki - - - Hungarian - Węgierski - - - Armenian - Ormański - - - Igbo - Igbo - - - Sichuan Yi - - - Inuktitut - - - Indonesian - Indonezyjski - - - Inupiaq - - - Icelandic - Islandzki - - - Italian - Włoski - - - Javanese - Jawajski - - - Lojban - - - Japanese - Japoński - - - Japanese Sign Language - Japoński Język Migowy - - - Kalaallisut - - - Kannada - - - Kashmiri - - - Georgian - - - Kanuri - - - Kazakh - - - Khmer - - - Kikuyu - - - Kinyarwanda - - - Kirghiz - - - Komi - Komi - - - Kongo - Kongo - - - Korean - Koreański - - - Kuanyama - - - Kurdish - Kurdyjski - - - Lao - Laotański - - - Latvian - Łotewski - - - Limburgan - - - Lingala - - - Lithuanian - Litewski - - - Luxembourgish - Luksemburski - - - Luba-Katanga - - - Ganda - - - Marshallese - - - Malayalam - - - Marathi - - - Macedonian - - - Malagasy - - - Maltese - - - Mongolian - - - Maori - - - Malay (macrolanguage) - - - Burmese - - - Nauru - Naurański - - - Navajo - - - South Ndebele - - - North Ndebele - - - Ndonga - - - Nepali (macrolanguage) - - - Dutch - Holenderski - - - Norwegian Nynorsk - Norweski Nynorsk - - - Norwegian Bokmål - Norweski Bokmål - - - Norwegian - Norweski - - - Nyanja - - - Occitan - - - Ojibwa - - - Oriya (macrolanguage) - - - Oromo - Oromo - - - Ossetian - - - Panjabi - - - Pakistan Sign Language - - - Polish - Polski - - - Portuguese - Portugalski - - - Pushto - Paszto - - - Quechua - - - Romansh - Romansz - - - Romanian - Rumuński - - - Russian Sign Language - Rosyjski Język Migowy - - - Rundi - Rundi - - - Russian - Rosyjski - - - Sango - Sango - - - Saudi Arabian Sign Language - - - South African Sign Language - - - Sinhala - - - Slovak - Słowacki - - - Slovenian - Słoweński - - - Northern Sami - - - Samoan - Samoański - - - Shona - Shona - - - Sindhi - Sindhi - - - Somali - Somalijski - - - Southern Sotho - - - Spanish - Hiszpański - - - Albanian - - - Sardinian - - - Serbian - Serbski - - - Swati - - - Sundanese - - - Swahili (macrolanguage) - - - Swedish - Szwedzki - - - Swedish Sign Language - Szwedzki Język Migowy - - - Tahitian - - - Tamil - Tamilski - - - Tatar - Tatarski - - - Telugu - Telugu - - - Tajik - Tadżycki - - - Tagalog - Tagalski - - - Thai - Tajski - - - Tigrinya - - - Klingon - - - Tonga (Tonga Islands) - - - Tswana - - - Tsonga - - - Turkmen - Turkmeński - - - Turkish - Turecki - - - Twi - Twi - - - Uighur - - - Ukrainian - Ukraiński - - - Urdu - Urdu - - - Uzbek - Uzbecki - - - Venda - Venda - - - Vietnamese - Wietnamski - - - Walloon - Waloński - - - Wolof - Wolof - - - Xhosa - Xhosa - - - Yiddish - Jidysz - - - Yoruba - Joruba - - - Zhuang - Zhuang - - - Chinese - Chiński - - - Zulu - Zulu - - - \ No newline at end of file diff --git a/client/src/locale/target/player_ar_001.xml b/client/src/locale/target/player_ar_001.xml index f81c084d4..4e3a12ad7 100644 --- a/client/src/locale/target/player_ar_001.xml +++ b/client/src/locale/target/player_ar_001.xml @@ -81,7 +81,7 @@ Subtitles - ترجمة + الترجمات subtitles off diff --git a/client/src/locale/target/player_it_IT.json b/client/src/locale/target/player_it_IT.json new file mode 100644 index 000000000..add193bfe --- /dev/null +++ b/client/src/locale/target/player_it_IT.json @@ -0,0 +1 @@ +{"Audio Player":"Riproduttore Audio","Video Player":"Riproduttore Video","Play":"Play","Pause":"Pausa","Replay":"Replay","Current Time":"Posizione attuale","Duration":"Durata","Remaining Time":"Tempo rimanente","Stream Type":"Tipo dello Streaming","LIVE":"LIVE","Loaded":"Caricato","Progress":"Stato","Progress Bar":"Barra di progresso","progress bar timing: currentTime={1} duration={2}":"{1} di {2}","Fullscreen":"Schermo intero","Non-Fullscreen":"Chiudi schermo intero","Mute":"Muto","Unmute":"Audio ","Playback Rate":"Velocità di riproduzione","Subtitles":"Sottotitoli","subtitles off":"Senza sottotitoli","Captions":"Sottotitoli per non udenti","captions off":"Senza sottotitoli per non udenti","Chapters":"Capitoli","Descriptions":"Descrizioni","descriptions off":"Descrizioni disattivate","Audio Track":"Traccia Audio","Volume Level":"Volume","You aborted the media playback":"La riproduzione del filmato è stata interrotta","A network error caused the media download to fail part-way.":"Il download del filmato è stato interrotto a causa di un problema rete.","The media could not be loaded, either because the server or network failed or because the format is not supported.":"Il filmato non può essere caricato a causa di un errore nel server o nella rete o perché il formato non viene supportato.","The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"La riproduzione del filmato è stata interrotta a causa di un file danneggiato o per l’utilizzo di impostazioni non supportate dal browser.","No compatible source was found for this media.":"Non ci sono fonti compatibili per questo filmato.","The media is encrypted and we do not have the keys to decrypt it.":"Il filmato è crittato e non disponiamo delle chiavi per decrittarlo","Play Video":"Riproduci Video","Close":"Chiudi","Close Modal Dialog":"Chiudi finestra di dialogo","Modal Window":"Finestra di dialogo","This is a modal window":"Questa è una finestra di dialogo","This modal can be closed by pressing the Escape key or activating the close button.":"Questa finestra di dialogo può essere chiusa premendo Esc o cliccando sul pulsante chiudi.",", opens captions settings dialog":", apri la finestra delle impostazioni delle didascalie",", opens subtitles settings dialog":", apri la finestra delle impostazioni dei sottotitoli",", opens descriptions settings dialog":", apri la finestra delle impostazioni delle descrizioni",", selected":", selezionati","captions settings":"impostazioni delle didascalie","subtitles settings":"impostazioni dei sottotitoli","descriptions settings":"impostazioni delle descrizioni","Text":"Testo","White":"Bianco","Black":"Nero","Red":"Rosso","Green":"Verde","Blue":"Blu","Yellow":"Giallo","Magenta":"Magenta","Cyan":"Ciano","Background":"Sfondo","Window":"Finestra","Transparent":"Trasparente","Semi-Transparent":"Semi-Trasparente","Opaque":"Opaco","Font Size":"Dimensione del Testo","Text Edge Style":"Stile dei Bordi del Testo","None":"Nessuno","Raised":"In Rilievo","Depressed":"Incavato","Uniform":"Uniforme","Dropshadow":"Ombreggiatura","Font Family":"Stile del Testo","Proportional Sans-Serif":"Senza Grazie Proporzionale","Monospace Sans-Serif":"Senza Grazie Monospazio","Proportional Serif":"Con Grazie Proporzionale","Monospace Serif":"Con Grazie Monospazio","Casual":"Casuale","Script":"Codice","Small Caps":"Maiuscoletto","Reset":"Ripristina","restore all settings to the default values":"ripristina tutte le impostazioni ai valori predefiniti","Done":"Fatto","Caption Settings Dialog":"Finestra delle Impostazioni dei Sottotitoli","Beginning of dialog window. Escape will cancel and close the window.":"Apertura della finestra di dialogo. Premendo ESC si annullerà e si chiuderà la finestra.","End of dialog window.":"Chiusura della finestra di dialogo.","{1} is loading.":"{1} è in caricamento.","Quality":"Qualità","Auto":"Auto","Speed":"Velocità","Subtitles/CC":"Sottotitoli/CC","peers":"nodi","Go to the video page":"Vai alla pagina del video","Settings":"Impostazioni","Uses P2P, others may know you are watching this video.":"Usa P2P, altri potrebbero sapere che stai guardando questo video.","Copy the video URL":"Copia l'URL del video","Copy the video URL at the current time":"Copia l'URL del video della posizione corrente","Copy embed code":"Copia il codice per incorporare"} \ No newline at end of file diff --git a/client/src/locale/target/player_pl_PL.json b/client/src/locale/target/player_pl_PL.json new file mode 100644 index 000000000..2178a137d --- /dev/null +++ b/client/src/locale/target/player_pl_PL.json @@ -0,0 +1 @@ +{"Audio Player":"Odtwarzacz audio","Video Player":"Odtwarzacz wideo","Play":"Odtwórz","Pause":"Wstrzymaj","Replay":"Powtórz","Current Time":"Obecny czas","Duration":"Czas trwania","Remaining Time":"Pozostały czas","Stream Type":"Rodzaj strumienia","LIVE":"NA ŻYWO","Loaded":"Załadowano","Progress":"Postęp","Progress Bar":"Pasek postępu","progress bar timing: currentTime={1} duration={2}":"{1} z {2}","Fullscreen":"Pełny ekran","Non-Fullscreen":"Bez pełnego ekranu","Mute":"Wycisz","Unmute":"Cofnij wyciszenie","Playback Rate":"Szybkość odtwarzania","Subtitles":"Napisy","subtitles off":"napisy są wyłączone","Captions":"CC","captions off":"CC są wyłączone","Chapters":"Rozdziały","Descriptions":"Opisy","descriptions off":"opisy są wyłączone","Audio Track":"Ścieżka dźwiękowa","Volume Level":"Poziom głośności","You aborted the media playback":"Przerwałeś odtwarzanie zawartości mulimedialnej","A network error caused the media download to fail part-way.":"Błąd sieci spowodował, że zawartość multimedialna została pobrana tylko częściowo.","The media could not be loaded, either because the server or network failed or because the format is not supported.":"Nie udało się załadować zawartości multimedialnej z powodu błędy sieci lub serwera lub ponieważ format nie jest obsługiwany.","The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"Odtwarzanie zostało przerwane ze względu na uszkodzenie pliku lub przez brak wsparcia funkcji multimediów przez Twoją przeglądarkę.","No compatible source was found for this media.":"Nie znaleziono kompatybilnego źródła dla tego media.","The media is encrypted and we do not have the keys to decrypt it.":"Zawartość multimedialna jest zaszyfrowana, a klucz do jej odszyfrowania jest nieznany.","Play Video":"Odtwórz film","Close":"Zamknij","Close Modal Dialog":"Zamknij okno modalne","Modal Window":"Okno modalne","This is a modal window":"To jest okno modalne","This modal can be closed by pressing the Escape key or activating the close button.":"To okno może zostać zamknięte klawiszem Escape lub przyciskiem zamykania.",", opens captions settings dialog":", otwiera okno ustawień CC",", opens subtitles settings dialog":", otwiera okno ustawień napisów",", opens descriptions settings dialog":", otwiera okno ustawień opisów",", selected":", zaznaczone","captions settings":"ustawienia CC","subtitles settings":"ustawienia napisów","descriptions settings":"ustawienia opisów","Text":"Tekst","White":"Biały","Black":"Czarny","Red":"Czerwony","Green":"Zielony","Blue":"Niebieski","Yellow":"Żółty","Magenta":"Magenta","Cyan":"Cyjanowy","Background":"Tło","Window":"Okno","Transparent":"Przezroczyste","Semi-Transparent":"Półprzezroczyste","Opaque":"Widoczne","Font Size":"Rozmiar czcionki","Text Edge Style":"Styl krawędzi tekstu","None":"Brak","Raised":"Wypukłe","Depressed":"Wgłębione","Uniform":"Jednolity","Dropshadow":"Cień","Font Family":"Rodzina czcionek","Proportional Sans-Serif":"Proporcjonalne bezszeryfowe","Monospace Sans-Serif":"Bezszeryfowe o stałej szerokości","Proportional Serif":"Proporcjonalne szeryfowe","Monospace Serif":"Szeryfowe o stałej szerokości","Casual":"Ozdobne","Script":"Pismo odręczne","Small Caps":"Kapitaliki","Reset":"Resetuj","restore all settings to the default values":"przywróć wszystkie ustawienia do wartości domyślnych","Done":"Gotowe","Caption Settings Dialog":"Okno ustawień napisów","Beginning of dialog window. Escape will cancel and close the window.":"Początek okna dialogowego. Przycisk Escape anuluje i zamknie okno.","End of dialog window.":"Koniec okna dialogowego.","{1} is loading.":"{1} ładuje się.","Quality":"Jakość","Auto":"Automatyczna","Speed":"Prędkość","Subtitles/CC":"Napisy/CC","peers":"peers","Go to the video page":"Przejdź na stronę filmu","Settings":"Ustawienia","Uses P2P, others may know you are watching this video.":"Korzysta z P2P, inni mogą dowiedzieć się, że oglądasz ten film.","Copy the video URL":"Skopiuj adres URL filmu","Copy the video URL at the current time":"Skopiuj adres URL filmu z obecnym czasem","Copy embed code":"Skopiuj kod do osadzenia"} \ No newline at end of file diff --git a/client/src/locale/target/player_pl_PL.xml b/client/src/locale/target/player_pl_PL.xml deleted file mode 100644 index 2affa5948..000000000 --- a/client/src/locale/target/player_pl_PL.xml +++ /dev/null @@ -1,383 +0,0 @@ - - - - - - - Audio Player - Odtwarzacz audio - - - Video Player - Odtwarzacz wideo - - - Play - Odtwórz - - - Pause - Wstrzymaj - - - Replay - Powtórz - - - Current Time - Obecny czas - - - Duration - Czas trwania - - - Remaining Time - Pozostały czas - - - Stream Type - Rodzaj strumienia - - - LIVE - NA ŻYWO - - - Loaded - Załadowano - - - Progress - Postęp - - - Progress Bar - Pasek postępu - - - {1} of {2} - {1} z {2} - - - Fullscreen - Pełny ekran - - - Non-Fullscreen - Bez pełnego ekranu - - - Mute - Wycisz - - - Unmute - Cofnij wyciszenie - - - Playback Rate - Szybkość odtwarzania - - - Subtitles - Napisy - - - subtitles off - napisy są wyłączone - - - Captions - CC - - - captions off - CC są wyłączone - - - Chapters - Rozdziały - - - Descriptions - Opisy - - - descriptions off - opisy są wyłączone - - - Audio Track - Ścieżka dźwiękowa - - - Volume Level - Poziom głośności - - - You aborted the media playback - Przerwałeś odtwarzanie zawartości mulimedialnej - - - A network error caused the media download to fail part-way. - Błąd sieci spowodował, że zawartość multimedialna została pobrana tylko częściowo. - - - The media could not be loaded, either because the server or network failed or because the format is not supported. - Nie udało się załadować zawartości multimedialnej z powodu błędy sieci lub serwera lub ponieważ format nie jest obsługiwany. - - - The media playback was aborted due to a corruption problem or because the media used features your browser did not support. - Odtwarzanie zostało przerwane ze względu na uszkodzenie pliku lub przez brak wsparcia funkcji multimediów przez Twoją przeglądarkę. - - - No compatible source was found for this media. - Nie znaleziono kompatybilnego źródła dla tego media. - - - The media is encrypted and we do not have the keys to decrypt it. - Zawartość multimedialna jest zaszyfrowana, a klucz do jej odszyfrowania jest nieznany. - - - Play Video - Odtwórz film - - - Close - Zamknij - - - Close Modal Dialog - Zamknij okno modalne - - - Modal Window - Okno modalne - - - This is a modal window - To jest okno modalne - - - This modal can be closed by pressing the Escape key or activating the close button. - To okno może zostać zamknięte klawiszem Escape lub przyciskiem zamykania. - - - , opens captions settings dialog - , otwiera okno ustawień CC - - - , opens subtitles settings dialog - , otwiera okno ustawień napisów - - - , opens descriptions settings dialog - , otwiera okno ustawień opisów - - - , selected - , zaznaczone - - - captions settings - ustawienia CC - - - subititles settings - ustawienia napisów - - - descriptions settings - ustawienia opisów - - - Text - Tekst - - - White - Biały - - - Black - Czarny - - - Red - Czerwony - - - Green - Zielony - - - Blue - Niebieski - - - Yellow - Żółty - - - Magenta - Magenta - - - Cyan - Cyjanowy - - - Background - Tło - - - Window - Okno - - - Transparent - Przezroczyste - - - Semi-Transparent - Półprzezroczyste - - - Opaque - Widoczne - - - Font Size - Rozmiar czcionki - - - Text Edge Style - Styl krawędzi tekstu - - - None - Brak - - - Raised - Wypukłe - - - Depressed - Wgłębione - - - Uniform - Jednolity - - - Dropshadow - Cień - - - Font Family - Rodzina czcionek - - - Proportional Sans-Serif - Proporcjonalne bezszeryfowe - - - Monospace Sans-Serif - Bezszeryfowe o stałej szerokości - - - Proportional Serif - Proporcjonalne szeryfowe - - - Monospace Serif - Szeryfowe o stałej szerokości - - - Casual - Ozdobne - - - Script - Pismo odręczne - - - Small Caps - Kapitaliki - - - Reset - Resetuj - - - restore all settings to the default values - przywróć wszystkie ustawienia do wartości domyślnych - - - Done - Gotowe - - - Caption Settings Dialog - Okno ustawień napisów - - - Beginning of dialog window. Escape will cancel and close the window. - Początek okna dialogowego. Przycisk Escape anuluje i zamknie okno. - - - End of dialog window. - Koniec okna dialogowego. - - - {1} is loading. - {1} ładuje się. - - - Quality - Jakość - - - Auto - Automatyczna - - - Speed - Prędkość - - - Subtitles/CC - Napisy/CC - - - peers - peers - - - Go to the video page - Przejdź na stronę filmu - - - Settings - Ustawienia - - - Uses P2P, others may know you are watching this video. - Korzysta z P2P, inni mogą dowiedzieć się, że oglądasz ten film. - - - Copy the video URL - Skopiuj adres URL filmu - - - Copy the video URL at the current time - Skopiuj adres URL filmu z obecnym czasem - - - Copy embed code - Skopiuj kod do osadzenia - - - \ No newline at end of file diff --git a/client/src/locale/target/player_ru_RU.json b/client/src/locale/target/player_ru_RU.json new file mode 100644 index 000000000..e2d8d4980 --- /dev/null +++ b/client/src/locale/target/player_ru_RU.json @@ -0,0 +1 @@ +{"Audio Player":"Аудиоплеер","Video Player":"Видеоплеер","Play":"Воспроизвести","Pause":"Пауза","Replay":"Воспроизвести снова","Current Time":"Текущий момент","Duration":"Продолжительность","Remaining Time":"Оставшееся время","Stream Type":"Тип потока","LIVE":"Прямой эфир","Loaded":"Загружено","Progress":"Ход выполнения","Progress Bar":"Индикатор выполнения","progress bar timing: currentTime={1} duration={2}":"{1} из {2}","Fullscreen":"Полный экран","Non-Fullscreen":"Окно","Mute":"Без звука","Unmute":"Со звуком","Playback Rate":" Скорость воспроизведения","Subtitles":"Субтитры","subtitles off":"Без субтитров","Captions":"Сопроводительные надписи","captions off":"Без сопроводительных надписей","Chapters":"Главы","Descriptions":"Описание","descriptions off":"без описаний","Audio Track":"Аудиодорожка","Volume Level":"Громкость","You aborted the media playback":"Вы отменили воспроизведение медиафайла","A network error caused the media download to fail part-way.":"Ошибка сети стала причиной неудачного воспроизведения медиафайла","The media could not be loaded, either because the server or network failed or because the format is not supported.":"Медиафайл не может быть воспроизведен: ошибки сервера или сети; или не поддерживается формат медиафайла","The media playback was aborted due to a corruption problem or because the media used features your browser did not support.":"Воспроизведение отменено: файл испорчен или использует инструменты, которые ваш навигатор не поддерживает ","No compatible source was found for this media.":"Не найдено совместимого источника для загружения медиафайла","The media is encrypted and we do not have the keys to decrypt it.":"Этот медиафайл зашифрован и у нас нет ключей для его расшифровки ","Play Video":"Воспроизвести видео","Close":"Закрыть","Close Modal Dialog":"Закрыть модальное диалоговое окно","Modal Window":"Модальное окно","This is a modal window":"Это модальное окно","This modal can be closed by pressing the Escape key or activating the close button.":"Это модальное окно можно закрыть нажав на кнопку Escape или на кнопку закрыть",", opens captions settings dialog":", открывает окно настроек сопроводительных надписей",", opens subtitles settings dialog":", открывает окно настроек субтитров",", opens descriptions settings dialog":", открывает окно настроек описаний",", selected":", выделено ","captions settings":"Настройки сопроводительных надписей","subtitles settings":"Настройки субтитров","descriptions settings":"Настройки описаний ","Text":"Текст","White":"Белый","Black":"Черный","Red":"Красный","Green":"Зеленый","Blue":"Синий","Yellow":"Желтый","Magenta":"Пурпурный ","Cyan":"Голубой","Background":"Фон","Window":"Окно","Transparent":"Прозрачный","Semi-Transparent":"Полупрозрачный ","Opaque":"Непрозрачный","Font Size":"Размер шрифта ","None":"Отсутствует","Uniform":"Однообразный","Dropshadow":"Падающая тень","Font Family":"Шрифт","Proportional Sans-Serif":"Пропорциональный без засечек","Monospace Sans-Serif":"Фиксированной ширины без засечек","Proportional Serif":"Пропорциональный с засечками","Monospace Serif":"Фиксированной ширины с засечками","Casual":"Свободный","Script":"рукописный шрифт","Small Caps":" Уменьшенные заглавные буквы","Reset":"Восстановить ","restore all settings to the default values":"Восстановить настройки по умолчанию ","Done":"Выполнено","Caption Settings Dialog":"Окно настроек сопроводительных надписей","Beginning of dialog window. Escape will cancel and close the window.":"Начало диалогового окна. Клавиша Escape отменит действие и закроет окно","End of dialog window.":"Конец диалогового окна","{1} is loading.":"{1} в процессе загрузки","Quality":"Качество","Auto":"Авто","Speed":"Скорость","Subtitles/CC":"Субтитры","peers":"Партнер","Go to the video page":"Перейти на страницу с видео","Settings":"Настройки","Uses P2P, others may know you are watching this video.":"Использует P2P, другие могут знать, что вы просматриваете это видео.","Copy the video URL":"Скопировать URL видео","Copy the video URL at the current time":"Скопировать URL видео на текущем моменте ","Copy embed code":"Скопировать встроенный код"} \ No newline at end of file diff --git a/client/src/locale/target/server_it_IT.json b/client/src/locale/target/server_it_IT.json new file mode 100644 index 000000000..6586f622e --- /dev/null +++ b/client/src/locale/target/server_it_IT.json @@ -0,0 +1 @@ +{"Music":"Musica","Films":"Film","Vehicles":"Veicoli","Art":"Arte","Sports":"Sport","Travels":"Viaggi","Gaming":"Giochi","People":"Persone","Comedy":"Commedia","Entertainment":"Intrattenimento","News & Politics":"Notizie & Politica","How To":"Come fare","Education":"Educazione","Activism":"Attivismo","Science & Technology":"Scienza & Tecnologia","Animals":"Animali","Kids":"Bambini","Food":"Cibo","Attribution":"Attribuzione","Attribution - Share Alike":"Attribuzione - Condividi Allo Stesso Modo","Attribution - No Derivatives":"Attribuzione - Non Opere Derivate","Attribution - Non Commercial":"Attribuzione - Non Commerciale","Attribution - Non Commercial - Share Alike":"Attribuzione - Non Commerciale - Condividi Allo Stesso Modo","Attribution - Non Commercial - No Derivatives":"Attribuzione - Non Commerciale - Non Opere Derivate","Public Domain Dedication":"Pubblico Dominio","Public":"Pubblico","Unlisted":"Non elencato","Private":"Privato","Published":"Pubblicato","To transcode":"Da codificare","To import":"Da importare","Pending":"In sospeso","Success":"Successo","Failed":"Fallito","Misc":"Altro","Unknown":"Sconosciuto","Afar":"Afar","Abkhazian":"Abcaso","Afrikaans":"Afrikaans","Akan":"Akan","Amharic":"Amarico","Arabic":"Arabo","Aragonese":"Aragonese","American Sign Language":"Lingua dei Segni Americana","Assamese":"Assamese","Avaric":"Avarico","Kotava":"Kotava","Aymara":"Aymara","Azerbaijani":"Azero","Bashkir":"Bashkir","Bambara":"Bambara","Belarusian":"Bielorusso","Bengali":"Bengalese","British Sign Language":"Lingua dei Segni Britannica","Bislama":"Bislama","Tibetan":"Tibetano","Bosnian":"Bosniaco","Breton":"Bretone","Bulgarian":"Bulgaro","Brazilian Sign Language":"Lingua dei Segni Brasiliana","Catalan":"Catalano","Czech":"Ceco","Chamorro":"Chamorro","Chechen":"Ceceno","Chuvash":"Ciuvascio","Cornish":"Cornico","Corsican":"Corso","Cree":"Cree","Czech Sign Language":"Lingua dei Segni Ceca","Chinese Sign Language":"Lingua dei Segni Cinese","Welsh":"Gallese","Danish":"Danese","German":"Tedesco","Dhivehi":"Dhivehi","Danish Sign Language":"Lingua dei Segni Danese","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Greco Moderno (1453-)","English":"Inglese","Esperanto":"Esperanto","Estonian":"Estone","Basque":"Basco","Ewe":"Ewe","Faroese":"Faroese","Persian":"Persiano","Fijian":"Fijiano","Finnish":"Finlandese","French":"Francese","Western Frisian":"Frisone Occidentale","French Sign Language":"Lingua dei Segni Francese","Fulah":"Fula","Scottish Gaelic":"Gaelico Scozzese","Irish":"Irlandese","Galician":"Galiziano","Manx":"Mannese","Guarani":"Guarani","German Sign Language":"Lingua dei Segni Tedesca","Gujarati":"Gujarati","Haitian":"Haitiano","Hausa":"Hausa","Serbo-Croatian":"Serbocroato","Hebrew":"Ebraico","Herero":"Herero","Hindi":"Hindi","Hiri Motu":"Hiri Motu","Croatian":"Croato","Hungarian":"Ungherese","Armenian":"Armeno","Igbo":"Igbo","Sichuan Yi":"Sichuan Yi","Inuktitut":"Inuktitut","Indonesian":"Indonesiano","Inupiaq":"Inupiaq","Icelandic":"Islandese","Italian":"Italiano","Javanese":"Giavanese","Lojban":"Lojban","Japanese":"Giapponese","Japanese Sign Language":"Lingua dei Segni Giapponese","Kalaallisut":"Kalaallisut","Kannada":"Kannada","Kashmiri":"Kashmiri","Georgian":"Georgiano","Kanuri":"Kanuri","Kazakh":"Kazako","Khmer":"Khmer","Kikuyu":"Kikuyu","Kinyarwanda":"Kinyarwanda","Kirghiz":"Kirghiso","Komi":"Komi","Kongo":"Kongo","Korean":"Coreano","Kuanyama":"Kuanyama","Kurdish":"Curdo","Lao":"Lao","Latvian":"Lettone","Limburgan":"Limburghese","Lingala":"Lingala","Lithuanian":"Lituano","Luxembourgish":"Lussemburghese","Luba-Katanga":"Luba-Katanga","Ganda":"Ganda","Marshallese":"Marshallese","Malayalam":"Malayalam","Marathi":"Marathi","Macedonian":"Macedone","Malagasy":"Malgascio","Maltese":"Maltese","Mongolian":"Mongolo","Maori":"Maori","Malay (macrolanguage)":"Malay (macrolinguaggio)","Burmese":"Birmano","Nauru":"Nauru","Navajo":"Navajo","South Ndebele":"Ndebele Meridionale","North Ndebele":"Ndebele Settentrionale","Ndonga":"Ndonga","Nepali (macrolanguage)":"Nepalese (macrolinguaggio)","Dutch":"Olandese","Norwegian Nynorsk":"Norvegese Nynorsk","Norwegian Bokmål":"Norvegese Bokmål","Norwegian":"Norvegese","Nyanja":"Chewa","Occitan":"Occitano","Ojibwa":"Ojibwa","Oriya (macrolanguage)":"Oriya (macrolinguaggio)","Oromo":"Oromo","Ossetian":"Osseto","Panjabi":"Punjabi","Pakistan Sign Language":"Lingua dei Segni Pakistana","Polish":"Polacco","Portuguese":"Portoghese","Pushto":"Pashto","Quechua":"Quechua","Romansh":"Romancio","Romanian":"Romeno","Russian Sign Language":"Lingua dei Segni Russa","Rundi":"Rundi","Russian":"Russo","Sango":"Sango","Saudi Arabian Sign Language":"Lingua dei Segni dell'Arabia Saudita","South African Sign Language":"Lingua dei Segni Sudafricana","Sinhala":"Singalese","Slovak":"Slovacco","Slovenian":"Sloveno","Northern Sami":"Sami Settentrionale","Samoan":"Samoano","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somalo","Southern Sotho":"Sotho Meridionale","Spanish":"Spagnolo","Albanian":"Albanese","Sardinian":"Sardo","Serbian":"Serbo","Swati":"Swati","Sundanese":"Sondanese","Swahili (macrolanguage)":"Swahili (macrolinguaggio)","Swedish":"Svedese","Swedish Sign Language":"Lingua dei Segni Svedese","Tahitian":"Tahitiano","Tamil":"Tamil","Tatar":"Tataro","Telugu":"Telugu","Tajik":"Tagico","Tagalog":"Tagalog","Thai":"Thai","Tigrinya":"Tigrino","Klingon":"Klingon","Tonga (Tonga Islands)":"Tonga (Isole delle Tonga)","Tswana":"Tswana","Tsonga":"Tsonga","Turkmen":"Turcmeno","Turkish":"Turco","Twi":"Twi","Uighur":"Uighuro","Ukrainian":"Ucraino","Urdu":"Urdu","Uzbek":"Uzbeco","Venda":"Venda","Vietnamese":"Vietnamita","Walloon":"Vallone","Wolof":"Wolof","Xhosa":"Xhosa","Yiddish":"Yiddish","Yoruba":"Yoruba","Zhuang":"Zhuang","Chinese":"Cinese","Zulu":"Zulu"} \ No newline at end of file diff --git a/client/src/locale/target/server_pl_PL.json b/client/src/locale/target/server_pl_PL.json new file mode 100644 index 000000000..90973bf28 --- /dev/null +++ b/client/src/locale/target/server_pl_PL.json @@ -0,0 +1 @@ +{"Music":"Muzyka","Films":"Filmy","Vehicles":"Pojazdy","Art":"Sztuka","Sports":"Sport","Travels":"Podróże","Gaming":"Gry","People":"Ludzie","Comedy":"Komedia","Entertainment":"Rozrywka","How To":"Poradniki","Education":"Edukacja","Activism":"Aktywizm","Science & Technology":"Nauka i technologia","Animals":"Zwierzęta","Kids":"Dzieci","Food":"Jedzenie","Attribution":"Uznanie autostwa","Attribution - Share Alike":"Uznanie autorstwa - Na tych samych warunkach","Attribution - No Derivatives":"Uznanie autorstwa - Bez utworów zależnych","Attribution - Non Commercial":"Uznanie autorstwa - Użycie niekomercyjne","Attribution - Non Commercial - Share Alike":"Uznanie autorstwa - Użycie niekomercyjne - Na tych samych warunkach","Attribution - Non Commercial - No Derivatives":"Uznanie autorstwa - Użycie niekomercyjne - Bez utworów zależnych","Public Domain Dedication":"Przekazanie do Domeny Publicznej","Public":"Publiczne","Unlisted":"Niewypisane","Private":"Prywatne","Published":"Opublikowano","To transcode":"Transkodować","To import":"Importować","Pending":"Oczekiwanie","Success":"Sukces","Failed":"Niepowodzenie","Misc":"Różne","Unknown":"Nieznane","Afar":"Afar","Abkhazian":"Abchaski","Afrikaans":"Afrikaans","Akan":"Akan","Amharic":"Amharski","Arabic":"Arabski","American Sign Language":"Amerykański Język Migowy","Avaric":"Awarski","Bashkir":"Baszkirski","Bambara":"Bambara","Belarusian":"Białoruski","Bengali":"Bengalski","British Sign Language":"Brytyjski Język Migowy","Bislama":"Bislama","Tibetan":"Tybetański","Bosnian":"Bośniacki","Breton":"Bretoński","Bulgarian":"Bułgarski","Catalan":"Kataloński","Czech":"Czeski","Cornish":"Kornijski","Corsican":"Korsykański","Cree":"Kri","Czech Sign Language":"Czeski Język Migowy","Chinese Sign Language":"Chiński Język Migowy","Welsh":"Walijski","Danish":"Duński","German":"Niemiecki","Danish Sign Language":"Duński Język Migowy","Dzongkha":"Dzongkha","Modern Greek (1453-)":"Nowogrecki (1453-)","English":"Angielski","Estonian":"Estoński","Basque":"Baskijski","Ewe":"Ewe","Persian":"Perski","Fijian":"Fidżyjski","Finnish":"Fiński","French":"Francuski","French Sign Language":"Francuski Język Migowy","Fulah":"Ful","Irish":"Irlandzki","Galician":"Galicyjski","German Sign Language":"Niemiecki Język Migowy","Hausa":"Hausa","Serbo-Croatian":"Serbsko-Chorwacki","Hindi":"Hindi","Croatian":"Chorwacki","Hungarian":"Węgierski","Armenian":"Ormański","Igbo":"Igbo","Indonesian":"Indonezyjski","Icelandic":"Islandzki","Italian":"Włoski","Javanese":"Jawajski","Japanese":"Japoński","Japanese Sign Language":"Japoński Język Migowy","Komi":"Komi","Kongo":"Kongo","Korean":"Koreański","Kurdish":"Kurdyjski","Lao":"Laotański","Latvian":"Łotewski","Lithuanian":"Litewski","Luxembourgish":"Luksemburski","Nauru":"Naurański","Dutch":"Holenderski","Norwegian Nynorsk":"Norweski Nynorsk","Norwegian Bokmål":"Norweski Bokmål","Norwegian":"Norweski","Oromo":"Oromo","Polish":"Polski","Portuguese":"Portugalski","Pushto":"Paszto","Romansh":"Romansz","Romanian":"Rumuński","Russian Sign Language":"Rosyjski Język Migowy","Rundi":"Rundi","Russian":"Rosyjski","Sango":"Sango","Slovak":"Słowacki","Slovenian":"Słoweński","Samoan":"Samoański","Shona":"Shona","Sindhi":"Sindhi","Somali":"Somalijski","Spanish":"Hiszpański","Serbian":"Serbski","Swedish":"Szwedzki","Swedish Sign Language":"Szwedzki Język Migowy","Tamil":"Tamilski","Tatar":"Tatarski","Telugu":"Telugu","Tajik":"Tadżycki","Tagalog":"Tagalski","Thai":"Tajski","Turkmen":"Turkmeński","Turkish":"Turecki","Twi":"Twi","Ukrainian":"Ukraiński","Urdu":"Urdu","Uzbek":"Uzbecki","Venda":"Venda","Vietnamese":"Wietnamski","Walloon":"Waloński","Wolof":"Wolof","Xhosa":"Xhosa","Yiddish":"Jidysz","Yoruba":"Joruba","Zhuang":"Zhuang","Chinese":"Chiński","Zulu":"Zulu"} \ No newline at end of file diff --git a/client/src/locale/target/server_pl_PL.xml b/client/src/locale/target/server_pl_PL.xml deleted file mode 100644 index f5ce3f9ad..000000000 --- a/client/src/locale/target/server_pl_PL.xml +++ /dev/null @@ -1,147 +0,0 @@ - - - - - - - Music - Muzyka - - - Films - Filmy - - - Vehicles - Pojazdy - - - Art - Sztuka - - - Sports - Sport - - - Travels - Podróże - - - Gaming - Gry - - - People - Ludzie - - - Comedy - Komedia - - - Entertainment - Rozrywka - - - How To - Poradniki - - - Education - Edukacja - - - Activism - Aktywizm - - - Science & Technology - Nauka i technologia - - - Animals - Zwierzęta - - - Kids - Dzieci - - - Food - Jedzenie - - - Attribution - Uznanie autostwa - - - Attribution - Share Alike - Uznanie autorstwa - Na tych samych warunkach - - - Attribution - No Derivatives - Uznanie autorstwa - Bez utworów zależnych - - - Attribution - Non Commercial - Uznanie autorstwa - Użycie niekomercyjne - - - Attribution - Non Commercial - Share Alike - Uznanie autorstwa - Użycie niekomercyjne - Na tych samych warunkach - - - Attribution - Non Commercial - No Derivatives - Uznanie autorstwa - Użycie niekomercyjne - Bez utworów zależnych - - - Public Domain Dedication - Przekazanie do Domeny Publicznej - - - Public - Publiczne - - - Unlisted - Niewypisane - - - Private - Prywatne - - - Published - Opublikowano - - - To transcode - Transkodować - - - To import - Importować - - - Pending - Oczekiwanie - - - Success - Sukces - - - Failed - Niepowodzenie - - - Misc - Różne - - - Unknown - Nieznane - - - \ No newline at end of file diff --git a/client/src/locale/target/server_ru_RU.json b/client/src/locale/target/server_ru_RU.json new file mode 100644 index 000000000..e62f2aeb4 --- /dev/null +++ b/client/src/locale/target/server_ru_RU.json @@ -0,0 +1 @@ +{"Music":"Музыка","Films":"Филмы","Vehicles":"Транспортные средства","Art":"Искусство","Sports":"Спорт","Travels":"Путешествия","Gaming":"Видеоигры","People":"Люди","Comedy":"Комедия","Entertainment":"Развлечения","How To":"Как","Education":"Образование","Activism":"Активизм","Science & Technology":"Наука и Технология","Animals":"Животные ","Kids":"Дети","Food":"Еда","Attribution":"Атрибуция","Attribution - Share Alike":" Атрибуция - публикация с одинаковыми условиями ","Attribution - No Derivatives":"Атрибуция - без права изменения ","Attribution - Non Commercial":"Атрибуция - не коммерческое использование","Attribution - Non Commercial - Share Alike":"Атрибуция - не коммерческое использование - публикация с одинаковыми условиями","Attribution - Non Commercial - No Derivatives":"Атрибуция - не коммерческое использование - без права изменения","Public Domain Dedication":"Безлицензионный","Public":"Общественный","Unlisted":" Ее включённый в список","Private":"Личный","Published":"Опубликованный","To transcode":"Перекодировать","To import":"Импортировать","Pending":"В ожидании","Success":"Удачное завершение","Failed":"Неудачно","Misc":"Разное","Unknown":"Неизвестное","Afar":"Афарский","Abkhazian":"Абхазский","Afrikaans":"Африкаанс","Akan":"Акан","Amharic":"Амхарский","Arabic":"Арабский","Aragonese":"Арагонский","American Sign Language":"Амслен","Assamese":"Ассамский","Avaric":"Аварский","Kotava":"Котава","Aymara":"Аймара","Azerbaijani":"Азербайджанский","Bashkir":"Башкирский","Bambara":"Бамана","Belarusian":"Белорусский","Bengali":"Бенгальский","British Sign Language":"Британский жестовый","Bislama":"Бислама","Tibetan":"Тибетский","Bosnian":"Боснийский","Breton":"Бретонский","Bulgarian":"Болгарский","Brazilian Sign Language":"Бразильский жестовый","Catalan":"Каталанский","Czech":"Чешский","Chamorro":"Чаморро","Chechen":"Чеченский","Chuvash":"Чувашский","Cornish":"Корнский","Corsican":"Корсиканский","Cree":"Кри","Czech Sign Language":"Чешский жестовый","Chinese Sign Language":"Китайский жестовый","Welsh":"Уэлш","Danish":"Датский","German":"Немецкий","Dhivehi":"Дивехи","Danish Sign Language":"Датский жестовый ","Dzongkha":"Дзонг-кэ","Modern Greek (1453-)":"Современный греческий","English":"Английский","Esperanto":"Эсперанто","Estonian":"Эстонский","Basque":"Баскский","Ewe":"Эве","Faroese":"Фарерский","Persian":"Персидский","Fijian":"Фиджийский","Finnish":"Финский","French":"Французский","Western Frisian":"Западнофризский","French Sign Language":"Французский жестовый","Fulah":"Фула","Scottish Gaelic":"Шотландский","Irish":"Ирландский","Galician":"Галисийский","Manx":"Мэнский","Guarani":"Гуарани","German Sign Language":"Немецкий жестовый","Gujarati":"Гуджарати","Haitian":"Гаитянский креольский","Hausa":"Хауса","Serbo-Croatian":"Сербохорватский","Hebrew":"Иврит","Herero":"Гереро","Hindi":"Хинди","Hiri Motu":"Хири-моту","Croatian":"Хорватский","Hungarian":"Венгерский","Armenian":"Армянский","Igbo":"Игбо","Sichuan Yi":"Носу","Inuktitut":"Инуктитут","Indonesian":"Индонезийский","Inupiaq":"Аляскинско-инуитские","Icelandic":"Исландский","Italian":"Итальянский","Javanese":"Яванский","Lojban":"Ложбан","Japanese":"Японский","Japanese Sign Language":"Японский жестовый","Kalaallisut":"Гренландский","Kannada":"Каннада","Kashmiri":"Кашмирский","Georgian":"Грузинский","Kanuri":"Канури","Kazakh":"Казахский","Khmer":"Кхмерский","Kikuyu":"Кикуйю","Kinyarwanda":"Руанда","Kirghiz":"Киргизский","Komi":"Коми","Kongo":"Конго","Korean":"Корейский","Kuanyama":"Кваньяма","Kurdish":"Курдские","Lao":"Лаосский","Latvian":"Латышский","Limburgan":"Лимбургский","Lingala":"Лингала","Lithuanian":"Литовский","Luxembourgish":"Люксембургский","Luba-Katanga":"Луба-катанга","Ganda":"Луганда","Marshallese":"Маршалльский","Malayalam":"Малаялам","Marathi":"Маратхи","Macedonian":"Македонский","Malagasy":"Малагасийский","Maltese":"Мальтийский","Mongolian":"Монгольский","Maori":"Маори","Malay (macrolanguage)":"Малайский","Burmese":"Бирманский","Nauru":"Науруанский","Navajo":"Навахо","South Ndebele":"Южный ндебеле","North Ndebele":"Северный ндебеле","Ndonga":"Ндонга","Nepali (macrolanguage)":"Непальский","Dutch":"Нидерландский","Norwegian Nynorsk":"Новонорвежский","Norwegian Bokmål":"Букмол","Norwegian":"Норвежский","Nyanja":"Ньянджа","Ojibwa":"Оджибве","Oriya (macrolanguage)":"Ория","Oromo":"Оромо","Ossetian":"Осетинский","Panjabi":"Панджаби","Pakistan Sign Language":"Дагестанский ","Polish":"Польский","Portuguese":"Португальский","Pushto":"Пушту","Quechua":"Ке́чуа","Romansh":"Романшский","Romanian":"Румынский","Russian Sign Language":"Русский жестовый","Rundi":"Рунди","Russian":"Русский","Sango":"Санго","Saudi Arabian Sign Language":"Арабский жестовый","South African Sign Language":"Жестовый Южной Африки","Sinhala":"Сингальский","Slovak":"Словацкий","Slovenian":"Словенский","Northern Sami":"Северносаамский","Samoan":"Самоанский","Shona":"Шона","Sindhi":"Синдхи","Somali":"Сомалийский","Southern Sotho":"Сесото","Spanish":"Испанский","Albanian":"Албанский","Sardinian":"Сардинский","Serbian":"Сербский","Swati":"Свати","Sundanese":"Сунданский","Swahili (macrolanguage)":"Суахили","Swedish":"Шведский","Swedish Sign Language":"Шведский жестовый","Tahitian":"Таитянский","Tamil":"Тамильский","Tatar":"Татарский","Telugu":"Телугу","Tajik":"Таджикский","Tagalog":"Тагальский","Thai":"Тайский","Tigrinya":"Тигринья","Klingon":"Клингонский","Tonga (Tonga Islands)":"Тонганский","Tswana":"Тсвана","Tsonga":"Тсонга","Turkmen":"Туркменский","Turkish":"Турецкий","Twi":"Чви","Uighur":"Уйгурский","Ukrainian":"Украинский","Urdu":"Урду","Uzbek":"Узбекский","Venda":"Венда","Vietnamese":"Вьетнамский","Walloon":"Валлонский","Wolof":"Волоф","Xhosa":"Коса","Yiddish":"Идиш","Yoruba":"Йоруба","Zhuang":"Чжуанский","Chinese":"Китайский","Zulu":"Зулу"} \ No newline at end of file diff --git a/scripts/build/client.sh b/scripts/build/client.sh index 62daf98cf..be3eef802 100755 --- a/scripts/build/client.sh +++ b/scripts/build/client.sh @@ -41,7 +41,7 @@ if [ -z ${1+x} ] || [ "$1" != "--light" ]; then languages=("fr_FR") else # Supported languages - languages=("fr_FR" "pt_BR" "sv_SE" "eu_ES" "ca_ES" "cs_CZ" "eo" "zh_Hant_TW" "de_DE" "es_ES" "oc" "zh_Hans_CN") + languages=("pl_PL" "it_IT" "ru_RU" "fr_FR" "pt_BR" "sv_SE" "eu_ES" "ca_ES" "cs_CZ" "eo" "zh_Hant_TW" "de_DE" "es_ES" "oc" "zh_Hans_CN") fi for lang in "${languages[@]}"; do diff --git a/shared/models/i18n/i18n.ts b/shared/models/i18n/i18n.ts index 5c3249452..d7164b73f 100644 --- a/shared/models/i18n/i18n.ts +++ b/shared/models/i18n/i18n.ts @@ -8,12 +8,14 @@ export const I18N_LOCALES = { 'cs-CZ': 'Čeština', 'eo': 'Esperanto', 'de-DE': 'Deutsch', + 'it-IT': 'Italiano', 'es-ES': 'Español', 'oc': 'Occitan', 'zh-Hant-TW': '繁體中文(台灣)', 'pt-BR': 'Português (Brasil)', 'sv-SE': 'svenska', - // 'pl-PL': 'Polski' + 'pl-PL': 'Polski', + 'ru-RU': 'русский', 'zh-Hans-CN': '简体中文(中国)' } @@ -26,8 +28,9 @@ const I18N_LOCALE_ALIAS = { 'de': 'de-DE', 'es': 'es-ES', 'pt': 'pt-BR', - 'sv': 'sv-SE' - // 'pl': 'pl-PL' + 'sv': 'sv-SE', + 'pl': 'pl-PL', + 'ru': 'ru-RU' } export const POSSIBLE_LOCALES = Object.keys(I18N_LOCALES) -- cgit v1.2.3 From 9c53ef67e303d6c2742126670963db8cfc81e6d2 Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 5 Dec 2018 10:53:14 +0100 Subject: Add button to help to translate peertube --- client/src/app/menu/language-chooser.component.html | 5 +++++ client/src/app/menu/language-chooser.component.scss | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/client/src/app/menu/language-chooser.component.html b/client/src/app/menu/language-chooser.component.html index c37bf2826..c79609898 100644 --- a/client/src/app/menu/language-chooser.component.html +++ b/client/src/app/menu/language-chooser.component.html @@ -4,6 +4,11 @@ + + + Help to translate PeerTube! + + diff --git a/client/src/app/menu/language-chooser.component.scss b/client/src/app/menu/language-chooser.component.scss index 944e86f46..72deb3952 100644 --- a/client/src/app/menu/language-chooser.component.scss +++ b/client/src/app/menu/language-chooser.component.scss @@ -1,6 +1,11 @@ @import '_variables'; @import '_mixins'; +.help-to-translate { + @include peertube-button-link; + @include orange-button; +} + .modal-body { text-align: center; @@ -9,4 +14,4 @@ font-size: 16px; margin: 15px; } -} \ No newline at end of file +} -- cgit v1.2.3 From a1b2f876132e2c1fa8adb27bb333b2cd859dc82b Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Wed, 5 Dec 2018 11:05:54 +0100 Subject: Add information in report modal --- .../+video-watch/modal/video-report.component.html | 5 +++++ .../+video-watch/modal/video-report.component.scss | 4 ++++ .../videos/+video-watch/modal/video-report.component.ts | 16 ++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/client/src/app/videos/+video-watch/modal/video-report.component.html b/client/src/app/videos/+video-watch/modal/video-report.component.html index 8d9a49276..733c01be0 100644 --- a/client/src/app/videos/+video-watch/modal/video-report.component.html +++ b/client/src/app/videos/+video-watch/modal/video-report.component.html @@ -6,6 +6,11 @@