aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorRigel Kent <sendmemail@rigelk.eu>2020-05-05 20:22:22 +0200
committerRigel Kent <par@rigelk.eu>2020-05-08 15:31:51 +0200
commitdf4c603dea022146476812cbbc2b9f8f1e5e4870 (patch)
treec0d27576fb6711b4b64d2186e8dca3f04b9b1dfe
parent91b8e675e26dd65e1ebb23706cb16b3a3f8bcf73 (diff)
downloadPeerTube-df4c603dea022146476812cbbc2b9f8f1e5e4870.tar.gz
PeerTube-df4c603dea022146476812cbbc2b9f8f1e5e4870.tar.zst
PeerTube-df4c603dea022146476812cbbc2b9f8f1e5e4870.zip
Switch emails to pug templates and provide richer html/text-only versions
-rw-r--r--client/src/app/+admin/follows/followers-list/followers-list.component.html2
-rw-r--r--client/src/app/+admin/follows/following-list/following-list.component.html2
-rw-r--r--client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html2
-rw-r--r--client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html2
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html2
-rw-r--r--client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html2
-rw-r--r--client/src/app/+admin/users/user-list/user-list.component.html14
-rw-r--r--package.json2
-rw-r--r--server/controllers/api/videos/abuse.ts20
-rw-r--r--server/lib/activitypub/process/process-flag.ts17
-rw-r--r--server/lib/emailer.ts392
-rw-r--r--server/lib/emails/common/base.pug267
-rw-r--r--server/lib/emails/common/greetings.pug11
-rw-r--r--server/lib/emails/common/html.pug4
-rw-r--r--server/lib/emails/common/mixins.pug3
-rw-r--r--server/lib/emails/contact-form/html.pug9
-rw-r--r--server/lib/emails/follower-on-channel/html.pug9
-rw-r--r--server/lib/emails/password-create/html.pug10
-rw-r--r--server/lib/emails/password-reset/html.pug12
-rw-r--r--server/lib/emails/user-registered/html.pug10
-rw-r--r--server/lib/emails/verify-email/html.pug14
-rw-r--r--server/lib/emails/video-abuse-new/html.pug18
-rw-r--r--server/lib/emails/video-auto-blacklist-new/html.pug17
-rw-r--r--server/lib/emails/video-comment-mention/html.pug11
-rw-r--r--server/lib/emails/video-comment-new/html.pug11
-rw-r--r--server/lib/notifier.ts22
-rw-r--r--server/tests/api/server/contact-form.ts2
-rw-r--r--shared/extra-utils/users/user-notifications.ts60
-rw-r--r--shared/models/server/emailer.model.ts10
-rw-r--r--yarn.lock999
30 files changed, 1682 insertions, 274 deletions
diff --git a/client/src/app/+admin/follows/followers-list/followers-list.component.html b/client/src/app/+admin/follows/followers-list/followers-list.component.html
index a9e1d4cc9..b30edad9a 100644
--- a/client/src/app/+admin/follows/followers-list/followers-list.component.html
+++ b/client/src/app/+admin/follows/followers-list/followers-list.component.html
@@ -22,7 +22,7 @@
22 <th i18n>Follower handle</th> 22 <th i18n>Follower handle</th>
23 <th style="width: 100px;" i18n pSortableColumn="state">State <p-sortIcon field="state"></p-sortIcon></th> 23 <th style="width: 100px;" i18n pSortableColumn="state">State <p-sortIcon field="state"></p-sortIcon></th>
24 <th style="width: 100px;" i18n pSortableColumn="score">Score <p-sortIcon field="score"></p-sortIcon></th> 24 <th style="width: 100px;" i18n pSortableColumn="score">Score <p-sortIcon field="score"></p-sortIcon></th>
25 <th style="width: 140px;" i18n pSortableColumn="createdAt">Created <p-sortIcon field="createdAt"></p-sortIcon></th> 25 <th style="width: 150px;" i18n pSortableColumn="createdAt">Created <p-sortIcon field="createdAt"></p-sortIcon></th>
26 <th style="width: 100px;"></th> 26 <th style="width: 100px;"></th>
27 </tr> 27 </tr>
28 </ng-template> 28 </ng-template>
diff --git a/client/src/app/+admin/follows/following-list/following-list.component.html b/client/src/app/+admin/follows/following-list/following-list.component.html
index 057e4d1d0..ed987a768 100644
--- a/client/src/app/+admin/follows/following-list/following-list.component.html
+++ b/client/src/app/+admin/follows/following-list/following-list.component.html
@@ -25,7 +25,7 @@
25 <tr> 25 <tr>
26 <th i18n>Host</th> 26 <th i18n>Host</th>
27 <th style="width: 100px;" i18n pSortableColumn="state">State <p-sortIcon field="state"></p-sortIcon></th> 27 <th style="width: 100px;" i18n pSortableColumn="state">State <p-sortIcon field="state"></p-sortIcon></th>
28 <th style="width: 140px;" i18n pSortableColumn="createdAt">Created <p-sortIcon field="createdAt"></p-sortIcon></th> 28 <th style="width: 150px;" i18n pSortableColumn="createdAt">Created <p-sortIcon field="createdAt"></p-sortIcon></th>
29 <th style="width: 160px;" i18n pSortableColumn="redundancyAllowed">Redundancy allowed <p-sortIcon field="redundancyAllowed"></p-sortIcon></th> 29 <th style="width: 160px;" i18n pSortableColumn="redundancyAllowed">Redundancy allowed <p-sortIcon field="redundancyAllowed"></p-sortIcon></th>
30 <th style="width: 100px;"></th> 30 <th style="width: 100px;"></th>
31 </tr> 31 </tr>
diff --git a/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html b/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html
index 1c061f97b..a4ab2a58c 100644
--- a/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html
+++ b/client/src/app/+admin/moderation/instance-blocklist/instance-account-blocklist.component.html
@@ -20,7 +20,7 @@
20 <ng-template pTemplate="header"> 20 <ng-template pTemplate="header">
21 <tr> 21 <tr>
22 <th style="width: 100%;" i18n>Account</th> 22 <th style="width: 100%;" i18n>Account</th>
23 <th style="width: 140px;" i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th> 23 <th style="width: 150px;" i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th>
24 <th style="width: 100px;"></th> <!-- column for action buttons --> 24 <th style="width: 100px;"></th> <!-- column for action buttons -->
25 </tr> 25 </tr>
26 </ng-template> 26 </ng-template>
diff --git a/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html b/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html
index 099840333..dab068dd6 100644
--- a/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html
+++ b/client/src/app/+admin/moderation/instance-blocklist/instance-server-blocklist.component.html
@@ -24,7 +24,7 @@
24 <ng-template pTemplate="header"> 24 <ng-template pTemplate="header">
25 <tr> 25 <tr>
26 <th style="width: 100%;" i18n>Instance</th> 26 <th style="width: 100%;" i18n>Instance</th>
27 <th style="width: 140px;" i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th> 27 <th style="width: 150px;" i18n pSortableColumn="createdAt">Muted at <p-sortIcon field="createdAt"></p-sortIcon></th>
28 <th style="width: 100px;"></th> <!-- column for action buttons --> 28 <th style="width: 100px;"></th> <!-- column for action buttons -->
29 </tr> 29 </tr>
30 </ng-template> 30 </ng-template>
diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html
index cffa7a40e..1c9530152 100644
--- a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html
+++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html
@@ -39,7 +39,7 @@
39 <th style="width: 40px;"></th> 39 <th style="width: 40px;"></th>
40 <th style="width: 20%;" pResizableColumn i18n>Reporter</th> 40 <th style="width: 20%;" pResizableColumn i18n>Reporter</th>
41 <th i18n>Video</th> 41 <th i18n>Video</th>
42 <th style="width: 140px;" i18n pSortableColumn="createdAt">Created <p-sortIcon field="createdAt"></p-sortIcon></th> 42 <th style="width: 150px;" i18n pSortableColumn="createdAt">Created <p-sortIcon field="createdAt"></p-sortIcon></th>
43 <th i18n pSortableColumn="state" style="width: 80px;">State <p-sortIcon field="state"></p-sortIcon></th> 43 <th i18n pSortableColumn="state" style="width: 80px;">State <p-sortIcon field="state"></p-sortIcon></th>
44 <th style="width: 120px;"></th> 44 <th style="width: 120px;"></th>
45 </tr> 45 </tr>
diff --git a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html
index eb194b023..c4c4e765a 100644
--- a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html
+++ b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html
@@ -24,7 +24,7 @@
24 <th i18n pSortableColumn="name">Video <p-sortIcon field="name"></p-sortIcon></th> 24 <th i18n pSortableColumn="name">Video <p-sortIcon field="name"></p-sortIcon></th>
25 <th style="width: 100px;" i18n>Sensitive</th> 25 <th style="width: 100px;" i18n>Sensitive</th>
26 <th style="width: 120px;" i18n>Unfederated</th> 26 <th style="width: 120px;" i18n>Unfederated</th>
27 <th style="width: 140px;" i18n pSortableColumn="createdAt">Date <p-sortIcon field="createdAt"></p-sortIcon></th> 27 <th style="width: 150px;" i18n pSortableColumn="createdAt">Date <p-sortIcon field="createdAt"></p-sortIcon></th>
28 <th style="width: 120px;"></th> 28 <th style="width: 120px;"></th>
29 </tr> 29 </tr>
30 </ng-template> 30 </ng-template>
diff --git a/client/src/app/+admin/users/user-list/user-list.component.html b/client/src/app/+admin/users/user-list/user-list.component.html
index d9612cf9c..768a3034d 100644
--- a/client/src/app/+admin/users/user-list/user-list.component.html
+++ b/client/src/app/+admin/users/user-list/user-list.component.html
@@ -9,7 +9,7 @@
9 9
10<p-table 10<p-table
11 [value]="users" [lazy]="true" [paginator]="totalRecords > 0" [totalRecords]="totalRecords" [rows]="rowsPerPage" [rowsPerPageOptions]="rowsPerPageOptions" 11 [value]="users" [lazy]="true" [paginator]="totalRecords > 0" [totalRecords]="totalRecords" [rows]="rowsPerPage" [rowsPerPageOptions]="rowsPerPageOptions"
12 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" dataKey="id" 12 [sortField]="sort.field" [sortOrder]="sort.order" (onLazyLoad)="loadLazy($event)" dataKey="id" [resizableColumns]="true"
13 [(selection)]="selectedUsers" 13 [(selection)]="selectedUsers"
14 [showCurrentPageReport]="true" i18n-currentPageReportTemplate 14 [showCurrentPageReport]="true" i18n-currentPageReportTemplate
15 currentPageReportTemplate="Showing {{'{first}'}} to {{'{last}'}} of {{'{totalRecords}'}} users" 15 currentPageReportTemplate="Showing {{'{first}'}} to {{'{last}'}} of {{'{totalRecords}'}} users"
@@ -42,12 +42,12 @@
42 <p-tableHeaderCheckbox></p-tableHeaderCheckbox> 42 <p-tableHeaderCheckbox></p-tableHeaderCheckbox>
43 </th> 43 </th>
44 <th style="width: 40px"></th> 44 <th style="width: 40px"></th>
45 <th i18n pSortableColumn="username">Username <p-sortIcon field="username"></p-sortIcon></th> 45 <th pResizableColumn i18n pSortableColumn="username">Username <p-sortIcon field="username"></p-sortIcon></th>
46 <th i18n>Email</th> 46 <th i18n>Email</th>
47 <th i18n pSortableColumn="videoQuotaUsed">Video quota <p-sortIcon field="videoQuotaUsed"></p-sortIcon></th> 47 <th style="width: 140px;" i18n pSortableColumn="videoQuotaUsed">Video quota <p-sortIcon field="videoQuotaUsed"></p-sortIcon></th>
48 <th i18n>Role</th> 48 <th style="width: 120px;" i18n>Role</th>
49 <th i18n>Auth plugin</th> 49 <th style="width: 140px;" pResizableColumn i18n>Auth plugin</th>
50 <th i18n pSortableColumn="createdAt">Created <p-sortIcon field="createdAt"></p-sortIcon></th> 50 <th style="width: 150px;" i18n pSortableColumn="createdAt">Created <p-sortIcon field="createdAt"></p-sortIcon></th>
51 <th style="width: 50px;"></th> 51 <th style="width: 50px;"></th>
52 </tr> 52 </tr>
53 </ng-template> 53 </ng-template>
@@ -103,7 +103,7 @@
103 <ng-container *ngIf="user.pluginAuth">{{ user.pluginAuth }}</ng-container> 103 <ng-container *ngIf="user.pluginAuth">{{ user.pluginAuth }}</ng-container>
104 </td> 104 </td>
105 105
106 <td [title]="user.createdAt">{{ user.createdAt }}</td> 106 <td [title]="user.createdAt">{{ user.createdAt | date: 'short' }}</td>
107 107
108 <td class="action-cell"> 108 <td class="action-cell">
109 <my-user-moderation-dropdown *ngIf="!isInSelectionMode()" [user]="user" (userChanged)="onUserChanged()" (userDeleted)="onUserChanged()"> 109 <my-user-moderation-dropdown *ngIf="!isInSelectionMode()" [user]="user" (userChanged)="onUserChanged()" (userDeleted)="onUserChanged()">
diff --git a/package.json b/package.json
index e0dafd24a..6fb816d7f 100644
--- a/package.json
+++ b/package.json
@@ -98,6 +98,7 @@
98 "cors": "^2.8.1", 98 "cors": "^2.8.1",
99 "create-torrent": "^4.0.0", 99 "create-torrent": "^4.0.0",
100 "deep-object-diff": "^1.1.0", 100 "deep-object-diff": "^1.1.0",
101 "email-templates": "^7.0.4",
101 "express": "^4.12.4", 102 "express": "^4.12.4",
102 "express-oauth-server": "^2.0.0", 103 "express-oauth-server": "^2.0.0",
103 "express-rate-limit": "^5.0.0", 104 "express-rate-limit": "^5.0.0",
@@ -127,6 +128,7 @@
127 "pfeed": "1.1.11", 128 "pfeed": "1.1.11",
128 "pg": "^7.4.1", 129 "pg": "^7.4.1",
129 "prompt": "^1.0.0", 130 "prompt": "^1.0.0",
131 "pug": "^2.0.4",
130 "redis": "^3.0.2", 132 "redis": "^3.0.2",
131 "reflect-metadata": "^0.1.12", 133 "reflect-metadata": "^0.1.12",
132 "request": "^2.81.0", 134 "request": "^2.81.0",
diff --git a/server/controllers/api/videos/abuse.ts b/server/controllers/api/videos/abuse.ts
index bce50aefb..ec28fce67 100644
--- a/server/controllers/api/videos/abuse.ts
+++ b/server/controllers/api/videos/abuse.ts
@@ -1,5 +1,5 @@
1import * as express from 'express' 1import * as express from 'express'
2import { UserRight, VideoAbuseCreate, VideoAbuseState } from '../../../../shared' 2import { UserRight, VideoAbuseCreate, VideoAbuseState, VideoAbuse } from '../../../../shared'
3import { logger } from '../../../helpers/logger' 3import { logger } from '../../../helpers/logger'
4import { getFormattedObjects } from '../../../helpers/utils' 4import { getFormattedObjects } from '../../../helpers/utils'
5import { sequelizeTypescript } from '../../../initializers/database' 5import { sequelizeTypescript } from '../../../initializers/database'
@@ -24,6 +24,7 @@ import { Notifier } from '../../../lib/notifier'
24import { sendVideoAbuse } from '../../../lib/activitypub/send/send-flag' 24import { sendVideoAbuse } from '../../../lib/activitypub/send/send-flag'
25import { MVideoAbuseAccountVideo } from '../../../typings/models/video' 25import { MVideoAbuseAccountVideo } from '../../../typings/models/video'
26import { getServerActor } from '@server/models/application/application' 26import { getServerActor } from '@server/models/application/application'
27import { MAccountDefault } from '@server/typings/models'
27 28
28const auditLogger = auditLoggerFactory('abuse') 29const auditLogger = auditLoggerFactory('abuse')
29const abuseVideoRouter = express.Router() 30const abuseVideoRouter = express.Router()
@@ -117,9 +118,11 @@ async function deleteVideoAbuse (req: express.Request, res: express.Response) {
117async function reportVideoAbuse (req: express.Request, res: express.Response) { 118async function reportVideoAbuse (req: express.Request, res: express.Response) {
118 const videoInstance = res.locals.videoAll 119 const videoInstance = res.locals.videoAll
119 const body: VideoAbuseCreate = req.body 120 const body: VideoAbuseCreate = req.body
121 let reporterAccount: MAccountDefault
122 let videoAbuseJSON: VideoAbuse
120 123
121 const videoAbuse = await sequelizeTypescript.transaction(async t => { 124 const videoAbuseInstance = await sequelizeTypescript.transaction(async t => {
122 const reporterAccount = await AccountModel.load(res.locals.oauth.token.User.Account.id, t) 125 reporterAccount = await AccountModel.load(res.locals.oauth.token.User.Account.id, t)
123 126
124 const abuseToCreate = { 127 const abuseToCreate = {
125 reporterAccountId: reporterAccount.id, 128 reporterAccountId: reporterAccount.id,
@@ -137,14 +140,19 @@ async function reportVideoAbuse (req: express.Request, res: express.Response) {
137 await sendVideoAbuse(reporterAccount.Actor, videoAbuseInstance, videoInstance, t) 140 await sendVideoAbuse(reporterAccount.Actor, videoAbuseInstance, videoInstance, t)
138 } 141 }
139 142
140 auditLogger.create(reporterAccount.Actor.getIdentifier(), new VideoAbuseAuditView(videoAbuseInstance.toFormattedJSON())) 143 videoAbuseJSON = videoAbuseInstance.toFormattedJSON()
144 auditLogger.create(reporterAccount.Actor.getIdentifier(), new VideoAbuseAuditView(videoAbuseJSON))
141 145
142 return videoAbuseInstance 146 return videoAbuseInstance
143 }) 147 })
144 148
145 Notifier.Instance.notifyOnNewVideoAbuse(videoAbuse) 149 Notifier.Instance.notifyOnNewVideoAbuse({
150 videoAbuse: videoAbuseJSON,
151 videoAbuseInstance,
152 reporter: reporterAccount.Actor.getIdentifier()
153 })
146 154
147 logger.info('Abuse report for video %s created.', videoInstance.name) 155 logger.info('Abuse report for video %s created.', videoInstance.name)
148 156
149 return res.json({ videoAbuse: videoAbuse.toFormattedJSON() }).end() 157 return res.json({ videoAbuseJSON }).end()
150} 158}
diff --git a/server/lib/activitypub/process/process-flag.ts b/server/lib/activitypub/process/process-flag.ts
index 9a488a473..7337f337c 100644
--- a/server/lib/activitypub/process/process-flag.ts
+++ b/server/lib/activitypub/process/process-flag.ts
@@ -8,7 +8,8 @@ import { getOrCreateVideoAndAccountAndChannel } from '../videos'
8import { Notifier } from '../../notifier' 8import { Notifier } from '../../notifier'
9import { getAPId } from '../../../helpers/activitypub' 9import { getAPId } from '../../../helpers/activitypub'
10import { APProcessorOptions } from '../../../typings/activitypub-processor.model' 10import { APProcessorOptions } from '../../../typings/activitypub-processor.model'
11import { MActorSignature, MVideoAbuseVideo } from '../../../typings/models' 11import { MActorSignature, MVideoAbuseAccountVideo } from '../../../typings/models'
12import { AccountModel } from '@server/models/account/account'
12 13
13async function processFlagActivity (options: APProcessorOptions<ActivityCreate | ActivityFlag>) { 14async function processFlagActivity (options: APProcessorOptions<ActivityCreate | ActivityFlag>) {
14 const { activity, byActor } = options 15 const { activity, byActor } = options
@@ -36,8 +37,9 @@ async function processCreateVideoAbuse (activity: ActivityCreate | ActivityFlag,
36 logger.debug('Reporting remote abuse for video %s.', getAPId(object)) 37 logger.debug('Reporting remote abuse for video %s.', getAPId(object))
37 38
38 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: object }) 39 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: object })
40 const reporterAccount = await sequelizeTypescript.transaction(async t => AccountModel.load(account.id, t))
39 41
40 const videoAbuse = await sequelizeTypescript.transaction(async t => { 42 const videoAbuseInstance = await sequelizeTypescript.transaction(async t => {
41 const videoAbuseData = { 43 const videoAbuseData = {
42 reporterAccountId: account.id, 44 reporterAccountId: account.id,
43 reason: flag.content, 45 reason: flag.content,
@@ -45,15 +47,22 @@ async function processCreateVideoAbuse (activity: ActivityCreate | ActivityFlag,
45 state: VideoAbuseState.PENDING 47 state: VideoAbuseState.PENDING
46 } 48 }
47 49
48 const videoAbuseInstance = await VideoAbuseModel.create(videoAbuseData, { transaction: t }) as MVideoAbuseVideo 50 const videoAbuseInstance: MVideoAbuseAccountVideo = await VideoAbuseModel.create(videoAbuseData, { transaction: t })
49 videoAbuseInstance.Video = video 51 videoAbuseInstance.Video = video
52 videoAbuseInstance.Account = reporterAccount
50 53
51 logger.info('Remote abuse for video uuid %s created', flag.object) 54 logger.info('Remote abuse for video uuid %s created', flag.object)
52 55
53 return videoAbuseInstance 56 return videoAbuseInstance
54 }) 57 })
55 58
56 Notifier.Instance.notifyOnNewVideoAbuse(videoAbuse) 59 const videoAbuseJSON = videoAbuseInstance.toFormattedJSON()
60
61 Notifier.Instance.notifyOnNewVideoAbuse({
62 videoAbuse: videoAbuseJSON,
63 videoAbuseInstance,
64 reporter: reporterAccount.Actor.getIdentifier()
65 })
57 } catch (err) { 66 } catch (err) {
58 logger.debug('Cannot process report of %s. (Maybe not a video abuse).', getAPId(object), { err }) 67 logger.debug('Cannot process report of %s. (Maybe not a video abuse).', getAPId(object), { err })
59 } 68 }
diff --git a/server/lib/emailer.ts b/server/lib/emailer.ts
index 45d57fd28..935c9e882 100644
--- a/server/lib/emailer.ts
+++ b/server/lib/emailer.ts
@@ -1,5 +1,5 @@
1import { createTransport, Transporter } from 'nodemailer' 1import { createTransport, Transporter } from 'nodemailer'
2import { isTestInstance } from '../helpers/core-utils' 2import { isTestInstance, root } from '../helpers/core-utils'
3import { bunyanLogger, logger } from '../helpers/logger' 3import { bunyanLogger, logger } from '../helpers/logger'
4import { CONFIG, isEmailEnabled } from '../initializers/config' 4import { CONFIG, isEmailEnabled } from '../initializers/config'
5import { JobQueue } from './job-queue' 5import { JobQueue } from './job-queue'
@@ -16,6 +16,12 @@ import {
16import { MActorFollowActors, MActorFollowFull, MUser } from '../typings/models' 16import { MActorFollowActors, MActorFollowFull, MUser } from '../typings/models'
17import { MVideoImport, MVideoImportVideo } from '@server/typings/models/video/video-import' 17import { MVideoImport, MVideoImportVideo } from '@server/typings/models/video/video-import'
18import { EmailPayload } from '@shared/models' 18import { EmailPayload } from '@shared/models'
19import { join } from 'path'
20import { VideoAbuse } from '../../shared/models/videos'
21import { SendEmailOptions } from '../../shared/models/server/emailer.model'
22import { merge } from 'lodash'
23import { VideoChannelModel } from '@server/models/video/video-channel'
24const Email = require('email-templates')
19 25
20class Emailer { 26class Emailer {
21 27
@@ -105,37 +111,36 @@ class Emailer {
105 const channelName = video.VideoChannel.getDisplayName() 111 const channelName = video.VideoChannel.getDisplayName()
106 const videoUrl = WEBSERVER.URL + video.getWatchStaticPath() 112 const videoUrl = WEBSERVER.URL + video.getWatchStaticPath()
107 113
108 const text = 'Hi dear user,\n\n' +
109 `Your subscription ${channelName} just published a new video: ${video.name}` +
110 '\n\n' +
111 `You can view it on ${videoUrl} ` +
112 '\n\n' +
113 'Cheers,\n' +
114 `${CONFIG.EMAIL.BODY.SIGNATURE}`
115
116 const emailPayload: EmailPayload = { 114 const emailPayload: EmailPayload = {
117 to, 115 to,
118 subject: CONFIG.EMAIL.SUBJECT.PREFIX + channelName + ' just published a new video', 116 subject: channelName + ' just published a new video',
119 text 117 text: `Your subscription ${channelName} just published a new video: "${video.name}".`,
118 locals: {
119 title: 'New content ',
120 action: {
121 text: 'View video',
122 url: videoUrl
123 }
124 }
120 } 125 }
121 126
122 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 127 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
123 } 128 }
124 129
125 addNewFollowNotification (to: string[], actorFollow: MActorFollowFull, followType: 'account' | 'channel') { 130 addNewFollowNotification (to: string[], actorFollow: MActorFollowFull, followType: 'account' | 'channel') {
126 const followerName = actorFollow.ActorFollower.Account.getDisplayName()
127 const followingName = (actorFollow.ActorFollowing.VideoChannel || actorFollow.ActorFollowing.Account).getDisplayName() 131 const followingName = (actorFollow.ActorFollowing.VideoChannel || actorFollow.ActorFollowing.Account).getDisplayName()
128 132
129 const text = 'Hi dear user,\n\n' +
130 `Your ${followType} ${followingName} has a new subscriber: ${followerName}` +
131 '\n\n' +
132 'Cheers,\n' +
133 `${CONFIG.EMAIL.BODY.SIGNATURE}`
134
135 const emailPayload: EmailPayload = { 133 const emailPayload: EmailPayload = {
134 template: 'follower-on-channel',
136 to, 135 to,
137 subject: CONFIG.EMAIL.SUBJECT.PREFIX + 'New follower on your channel ' + followingName, 136 subject: `New follower on your channel ${followingName}`,
138 text 137 locals: {
138 followerName: actorFollow.ActorFollower.Account.getDisplayName(),
139 followerUrl: actorFollow.ActorFollower.url,
140 followingName,
141 followingUrl: actorFollow.ActorFollowing.url,
142 followType
143 }
139 } 144 }
140 145
141 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 146 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
@@ -144,32 +149,28 @@ class Emailer {
144 addNewInstanceFollowerNotification (to: string[], actorFollow: MActorFollowActors) { 149 addNewInstanceFollowerNotification (to: string[], actorFollow: MActorFollowActors) {
145 const awaitingApproval = actorFollow.state === 'pending' ? ' awaiting manual approval.' : '' 150 const awaitingApproval = actorFollow.state === 'pending' ? ' awaiting manual approval.' : ''
146 151
147 const text = 'Hi dear admin,\n\n' +
148 `Your instance has a new follower: ${actorFollow.ActorFollower.url}${awaitingApproval}` +
149 '\n\n' +
150 'Cheers,\n' +
151 `${CONFIG.EMAIL.BODY.SIGNATURE}`
152
153 const emailPayload: EmailPayload = { 152 const emailPayload: EmailPayload = {
154 to, 153 to,
155 subject: CONFIG.EMAIL.SUBJECT.PREFIX + 'New instance follower', 154 subject: 'New instance follower',
156 text 155 text: `Your instance has a new follower: ${actorFollow.ActorFollower.url}${awaitingApproval}.`,
156 locals: {
157 title: 'New instance follower',
158 action: {
159 text: 'Review followers',
160 url: WEBSERVER.URL + '/admin/follows/followers-list'
161 }
162 }
157 } 163 }
158 164
159 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 165 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
160 } 166 }
161 167
162 addAutoInstanceFollowingNotification (to: string[], actorFollow: MActorFollowActors) { 168 addAutoInstanceFollowingNotification (to: string[], actorFollow: MActorFollowActors) {
163 const text = 'Hi dear admin,\n\n' + 169 const instanceUrl = actorFollow.ActorFollowing.url
164 `Your instance automatically followed a new instance: ${actorFollow.ActorFollowing.url}` +
165 '\n\n' +
166 'Cheers,\n' +
167 `${CONFIG.EMAIL.BODY.SIGNATURE}`
168
169 const emailPayload: EmailPayload = { 170 const emailPayload: EmailPayload = {
170 to, 171 to,
171 subject: CONFIG.EMAIL.SUBJECT.PREFIX + 'Auto instance following', 172 subject: 'Auto instance following',
172 text 173 text: `Your instance automatically followed a new instance: <a href="${instanceUrl}">${instanceUrl}</a>.`
173 } 174 }
174 175
175 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 176 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
@@ -178,18 +179,17 @@ class Emailer {
178 myVideoPublishedNotification (to: string[], video: MVideo) { 179 myVideoPublishedNotification (to: string[], video: MVideo) {
179 const videoUrl = WEBSERVER.URL + video.getWatchStaticPath() 180 const videoUrl = WEBSERVER.URL + video.getWatchStaticPath()
180 181
181 const text = 'Hi dear user,\n\n' +
182 `Your video ${video.name} has been published.` +
183 '\n\n' +
184 `You can view it on ${videoUrl} ` +
185 '\n\n' +
186 'Cheers,\n' +
187 `${CONFIG.EMAIL.BODY.SIGNATURE}`
188
189 const emailPayload: EmailPayload = { 182 const emailPayload: EmailPayload = {
190 to, 183 to,
191 subject: CONFIG.EMAIL.SUBJECT.PREFIX + `Your video ${video.name} is published`, 184 subject: `Your video ${video.name} has been published`,
192 text 185 text: `Your video "${video.name}" has been published.`,
186 locals: {
187 title: 'You video is live',
188 action: {
189 text: 'View video',
190 url: videoUrl
191 }
192 }
193 } 193 }
194 194
195 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 195 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
@@ -198,18 +198,17 @@ class Emailer {
198 myVideoImportSuccessNotification (to: string[], videoImport: MVideoImportVideo) { 198 myVideoImportSuccessNotification (to: string[], videoImport: MVideoImportVideo) {
199 const videoUrl = WEBSERVER.URL + videoImport.Video.getWatchStaticPath() 199 const videoUrl = WEBSERVER.URL + videoImport.Video.getWatchStaticPath()
200 200
201 const text = 'Hi dear user,\n\n' +
202 `Your video import ${videoImport.getTargetIdentifier()} is finished.` +
203 '\n\n' +
204 `You can view the imported video on ${videoUrl} ` +
205 '\n\n' +
206 'Cheers,\n' +
207 `${CONFIG.EMAIL.BODY.SIGNATURE}`
208
209 const emailPayload: EmailPayload = { 201 const emailPayload: EmailPayload = {
210 to, 202 to,
211 subject: CONFIG.EMAIL.SUBJECT.PREFIX + `Your video import ${videoImport.getTargetIdentifier()} is finished`, 203 subject: `Your video import ${videoImport.getTargetIdentifier()} is complete`,
212 text 204 text: `Your video "${videoImport.getTargetIdentifier()}" just finished importing.`,
205 locals: {
206 title: 'Import complete',
207 action: {
208 text: 'View video',
209 url: videoUrl
210 }
211 }
213 } 212 }
214 213
215 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 214 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
@@ -218,40 +217,47 @@ class Emailer {
218 myVideoImportErrorNotification (to: string[], videoImport: MVideoImport) { 217 myVideoImportErrorNotification (to: string[], videoImport: MVideoImport) {
219 const importUrl = WEBSERVER.URL + '/my-account/video-imports' 218 const importUrl = WEBSERVER.URL + '/my-account/video-imports'
220 219
221 const text = 'Hi dear user,\n\n' + 220 const text =
222 `Your video import ${videoImport.getTargetIdentifier()} encountered an error.` + 221 `Your video import "${videoImport.getTargetIdentifier()}" encountered an error.` +
223 '\n\n' +
224 `See your videos import dashboard for more information: ${importUrl}` +
225 '\n\n' + 222 '\n\n' +
226 'Cheers,\n' + 223 `See your videos import dashboard for more information: <a href="${importUrl}">${importUrl}</a>.`
227 `${CONFIG.EMAIL.BODY.SIGNATURE}`
228 224
229 const emailPayload: EmailPayload = { 225 const emailPayload: EmailPayload = {
230 to, 226 to,
231 subject: CONFIG.EMAIL.SUBJECT.PREFIX + `Your video import ${videoImport.getTargetIdentifier()} encountered an error`, 227 subject: `Your video import "${videoImport.getTargetIdentifier()}" encountered an error`,
232 text 228 text,
229 locals: {
230 title: 'Import failed',
231 action: {
232 text: 'Review imports',
233 url: importUrl
234 }
235 }
233 } 236 }
234 237
235 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 238 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
236 } 239 }
237 240
238 addNewCommentOnMyVideoNotification (to: string[], comment: MCommentOwnerVideo) { 241 addNewCommentOnMyVideoNotification (to: string[], comment: MCommentOwnerVideo) {
239 const accountName = comment.Account.getDisplayName()
240 const video = comment.Video 242 const video = comment.Video
243 const videoUrl = WEBSERVER.URL + comment.Video.getWatchStaticPath()
241 const commentUrl = WEBSERVER.URL + comment.getCommentStaticPath() 244 const commentUrl = WEBSERVER.URL + comment.getCommentStaticPath()
242 245
243 const text = 'Hi dear user,\n\n' +
244 `A new comment has been posted by ${accountName} on your video ${video.name}` +
245 '\n\n' +
246 `You can view it on ${commentUrl} ` +
247 '\n\n' +
248 'Cheers,\n' +
249 `${CONFIG.EMAIL.BODY.SIGNATURE}`
250
251 const emailPayload: EmailPayload = { 246 const emailPayload: EmailPayload = {
247 template: 'video-comment-new',
252 to, 248 to,
253 subject: CONFIG.EMAIL.SUBJECT.PREFIX + 'New comment on your video ' + video.name, 249 subject: 'New comment on your video ' + video.name,
254 text 250 locals: {
251 accountName: comment.Account.getDisplayName(),
252 accountUrl: comment.Account.Actor.url,
253 comment,
254 video,
255 videoUrl,
256 action: {
257 text: 'View comment',
258 url: commentUrl
259 }
260 }
255 } 261 }
256 262
257 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 263 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
@@ -260,75 +266,88 @@ class Emailer {
260 addNewCommentMentionNotification (to: string[], comment: MCommentOwnerVideo) { 266 addNewCommentMentionNotification (to: string[], comment: MCommentOwnerVideo) {
261 const accountName = comment.Account.getDisplayName() 267 const accountName = comment.Account.getDisplayName()
262 const video = comment.Video 268 const video = comment.Video
269 const videoUrl = WEBSERVER.URL + comment.Video.getWatchStaticPath()
263 const commentUrl = WEBSERVER.URL + comment.getCommentStaticPath() 270 const commentUrl = WEBSERVER.URL + comment.getCommentStaticPath()
264 271
265 const text = 'Hi dear user,\n\n' +
266 `${accountName} mentioned you on video ${video.name}` +
267 '\n\n' +
268 `You can view the comment on ${commentUrl} ` +
269 '\n\n' +
270 'Cheers,\n' +
271 `${CONFIG.EMAIL.BODY.SIGNATURE}`
272
273 const emailPayload: EmailPayload = { 272 const emailPayload: EmailPayload = {
273 template: 'video-comment-mention',
274 to, 274 to,
275 subject: CONFIG.EMAIL.SUBJECT.PREFIX + 'Mention on video ' + video.name, 275 subject: 'Mention on video ' + video.name,
276 text 276 locals: {
277 comment,
278 video,
279 videoUrl,
280 accountName,
281 action: {
282 text: 'View comment',
283 url: commentUrl
284 }
285 }
277 } 286 }
278 287
279 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 288 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
280 } 289 }
281 290
282 addVideoAbuseModeratorsNotification (to: string[], videoAbuse: MVideoAbuseVideo) { 291 addVideoAbuseModeratorsNotification (to: string[], parameters: {
283 const videoUrl = WEBSERVER.URL + videoAbuse.Video.getWatchStaticPath() 292 videoAbuse: VideoAbuse
284 293 videoAbuseInstance: MVideoAbuseVideo
285 const text = 'Hi,\n\n' + 294 reporter: string
286 `${WEBSERVER.HOST} received an abuse for the following video: ${videoUrl}\n\n` + 295 }) {
287 'Cheers,\n' + 296 const videoAbuseUrl = WEBSERVER.URL + '/admin/moderation/video-abuses/list?search=%23' + parameters.videoAbuse.id
288 `${CONFIG.EMAIL.BODY.SIGNATURE}` 297 const videoUrl = WEBSERVER.URL + parameters.videoAbuseInstance.Video.getWatchStaticPath()
289 298
290 const emailPayload: EmailPayload = { 299 const emailPayload: EmailPayload = {
300 template: 'video-abuse-new',
291 to, 301 to,
292 subject: CONFIG.EMAIL.SUBJECT.PREFIX + 'Received a video abuse', 302 subject: `New video abuse report from ${parameters.reporter}`,
293 text 303 locals: {
304 videoUrl,
305 videoAbuseUrl,
306 videoCreatedAt: new Date(parameters.videoAbuseInstance.Video.createdAt).toLocaleString(),
307 videoPublishedAt: new Date(parameters.videoAbuseInstance.Video.publishedAt).toLocaleString(),
308 videoAbuse: parameters.videoAbuse,
309 reporter: parameters.reporter,
310 action: {
311 text: 'View report #' + parameters.videoAbuse.id,
312 url: videoAbuseUrl
313 }
314 }
294 } 315 }
295 316
296 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 317 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
297 } 318 }
298 319
299 addVideoAutoBlacklistModeratorsNotification (to: string[], videoBlacklist: MVideoBlacklistLightVideo) { 320 async addVideoAutoBlacklistModeratorsNotification (to: string[], videoBlacklist: MVideoBlacklistLightVideo) {
300 const VIDEO_AUTO_BLACKLIST_URL = WEBSERVER.URL + '/admin/moderation/video-auto-blacklist/list' 321 const VIDEO_AUTO_BLACKLIST_URL = WEBSERVER.URL + '/admin/moderation/video-auto-blacklist/list'
301 const videoUrl = WEBSERVER.URL + videoBlacklist.Video.getWatchStaticPath() 322 const videoUrl = WEBSERVER.URL + videoBlacklist.Video.getWatchStaticPath()
302 323 const channel = (await VideoChannelModel.loadByIdAndPopulateAccount(videoBlacklist.Video.channelId)).toFormattedSummaryJSON()
303 const text = 'Hi,\n\n' +
304 'A recently added video was auto-blacklisted and requires moderator review before publishing.' +
305 '\n\n' +
306 `You can view it and take appropriate action on ${videoUrl}` +
307 '\n\n' +
308 `A full list of auto-blacklisted videos can be reviewed here: ${VIDEO_AUTO_BLACKLIST_URL}` +
309 '\n\n' +
310 'Cheers,\n' +
311 `${CONFIG.EMAIL.BODY.SIGNATURE}`
312 324
313 const emailPayload: EmailPayload = { 325 const emailPayload: EmailPayload = {
326 template: 'video-auto-blacklist-new',
314 to, 327 to,
315 subject: CONFIG.EMAIL.SUBJECT.PREFIX + 'An auto-blacklisted video is awaiting review', 328 subject: 'A new video is pending moderation',
316 text 329 locals: {
330 channel,
331 videoUrl,
332 videoName: videoBlacklist.Video.name,
333 action: {
334 text: 'Review autoblacklist',
335 url: VIDEO_AUTO_BLACKLIST_URL
336 }
337 }
317 } 338 }
318 339
319 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 340 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
320 } 341 }
321 342
322 addNewUserRegistrationNotification (to: string[], user: MUser) { 343 addNewUserRegistrationNotification (to: string[], user: MUser) {
323 const text = 'Hi,\n\n' +
324 `User ${user.username} just registered on ${WEBSERVER.HOST} PeerTube instance.\n\n` +
325 'Cheers,\n' +
326 `${CONFIG.EMAIL.BODY.SIGNATURE}`
327
328 const emailPayload: EmailPayload = { 344 const emailPayload: EmailPayload = {
345 template: 'user-registered',
329 to, 346 to,
330 subject: CONFIG.EMAIL.SUBJECT.PREFIX + 'New user registration on ' + WEBSERVER.HOST, 347 subject: `a new user registered on ${WEBSERVER.HOST}: ${user.username}`,
331 text 348 locals: {
349 user
350 }
332 } 351 }
333 352
334 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 353 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
@@ -341,16 +360,13 @@ class Emailer {
341 const reasonString = videoBlacklist.reason ? ` for the following reason: ${videoBlacklist.reason}` : '' 360 const reasonString = videoBlacklist.reason ? ` for the following reason: ${videoBlacklist.reason}` : ''
342 const blockedString = `Your video ${videoName} (${videoUrl} on ${WEBSERVER.HOST} has been blacklisted${reasonString}.` 361 const blockedString = `Your video ${videoName} (${videoUrl} on ${WEBSERVER.HOST} has been blacklisted${reasonString}.`
343 362
344 const text = 'Hi,\n\n' +
345 blockedString +
346 '\n\n' +
347 'Cheers,\n' +
348 `${CONFIG.EMAIL.BODY.SIGNATURE}`
349
350 const emailPayload: EmailPayload = { 363 const emailPayload: EmailPayload = {
351 to, 364 to,
352 subject: CONFIG.EMAIL.SUBJECT.PREFIX + `Video ${videoName} blacklisted`, 365 subject: `Video ${videoName} blacklisted`,
353 text 366 text: blockedString,
367 locals: {
368 title: 'Your video was blacklisted'
369 }
354 } 370 }
355 371
356 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 372 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
@@ -359,66 +375,53 @@ class Emailer {
359 addVideoUnblacklistNotification (to: string[], video: MVideo) { 375 addVideoUnblacklistNotification (to: string[], video: MVideo) {
360 const videoUrl = WEBSERVER.URL + video.getWatchStaticPath() 376 const videoUrl = WEBSERVER.URL + video.getWatchStaticPath()
361 377
362 const text = 'Hi,\n\n' +
363 `Your video ${video.name} (${videoUrl}) on ${WEBSERVER.HOST} has been unblacklisted.` +
364 '\n\n' +
365 'Cheers,\n' +
366 `${CONFIG.EMAIL.BODY.SIGNATURE}`
367
368 const emailPayload: EmailPayload = { 378 const emailPayload: EmailPayload = {
369 to, 379 to,
370 subject: CONFIG.EMAIL.SUBJECT.PREFIX + `Video ${video.name} unblacklisted`, 380 subject: `Video ${video.name} unblacklisted`,
371 text 381 text: `Your video "${video.name}" (${videoUrl}) on ${WEBSERVER.HOST} has been unblacklisted.`,
382 locals: {
383 title: 'Your video was unblacklisted'
384 }
372 } 385 }
373 386
374 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 387 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
375 } 388 }
376 389
377 addPasswordResetEmailJob (to: string, resetPasswordUrl: string) { 390 addPasswordResetEmailJob (to: string, resetPasswordUrl: string) {
378 const text = 'Hi dear user,\n\n' +
379 `A reset password procedure for your account ${to} has been requested on ${WEBSERVER.HOST} ` +
380 `Please follow this link to reset it: ${resetPasswordUrl} (the link will expire within 1 hour)\n\n` +
381 'If you are not the person who initiated this request, please ignore this email.\n\n' +
382 'Cheers,\n' +
383 `${CONFIG.EMAIL.BODY.SIGNATURE}`
384
385 const emailPayload: EmailPayload = { 391 const emailPayload: EmailPayload = {
392 template: 'password-reset',
386 to: [ to ], 393 to: [ to ],
387 subject: CONFIG.EMAIL.SUBJECT.PREFIX + 'Reset your password', 394 subject: 'Reset your account password',
388 text 395 locals: {
396 resetPasswordUrl
397 }
389 } 398 }
390 399
391 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 400 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
392 } 401 }
393 402
394 addPasswordCreateEmailJob (username: string, to: string, resetPasswordUrl: string) { 403 addPasswordCreateEmailJob (username: string, to: string, createPasswordUrl: string) {
395 const text = 'Hi,\n\n' +
396 `Welcome to your ${WEBSERVER.HOST} PeerTube instance. Your username is: ${username}.\n\n` +
397 `Please set your password by following this link: ${resetPasswordUrl} (this link will expire within seven days).\n\n` +
398 'Cheers,\n' +
399 `${CONFIG.EMAIL.BODY.SIGNATURE}`
400
401 const emailPayload: EmailPayload = { 404 const emailPayload: EmailPayload = {
405 template: 'password-create',
402 to: [ to ], 406 to: [ to ],
403 subject: CONFIG.EMAIL.SUBJECT.PREFIX + 'New PeerTube account password', 407 subject: 'Create your account password',
404 text 408 locals: {
409 username,
410 createPasswordUrl
411 }
405 } 412 }
406 413
407 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 414 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
408 } 415 }
409 416
410 addVerifyEmailJob (to: string, verifyEmailUrl: string) { 417 addVerifyEmailJob (to: string, verifyEmailUrl: string) {
411 const text = 'Welcome to PeerTube,\n\n' +
412 `To start using PeerTube on ${WEBSERVER.HOST} you must verify your email! ` +
413 `Please follow this link to verify this email belongs to you: ${verifyEmailUrl}\n\n` +
414 'If you are not the person who initiated this request, please ignore this email.\n\n' +
415 'Cheers,\n' +
416 `${CONFIG.EMAIL.BODY.SIGNATURE}`
417
418 const emailPayload: EmailPayload = { 418 const emailPayload: EmailPayload = {
419 template: 'verify-email',
419 to: [ to ], 420 to: [ to ],
420 subject: CONFIG.EMAIL.SUBJECT.PREFIX + 'Verify your email', 421 subject: `Verify your email on ${WEBSERVER.HOST}`,
421 text 422 locals: {
423 verifyEmailUrl
424 }
422 } 425 }
423 426
424 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 427 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
@@ -427,39 +430,28 @@ class Emailer {
427 addUserBlockJob (user: MUser, blocked: boolean, reason?: string) { 430 addUserBlockJob (user: MUser, blocked: boolean, reason?: string) {
428 const reasonString = reason ? ` for the following reason: ${reason}` : '' 431 const reasonString = reason ? ` for the following reason: ${reason}` : ''
429 const blockedWord = blocked ? 'blocked' : 'unblocked' 432 const blockedWord = blocked ? 'blocked' : 'unblocked'
430 const blockedString = `Your account ${user.username} on ${WEBSERVER.HOST} has been ${blockedWord}${reasonString}.`
431
432 const text = 'Hi,\n\n' +
433 blockedString +
434 '\n\n' +
435 'Cheers,\n' +
436 `${CONFIG.EMAIL.BODY.SIGNATURE}`
437 433
438 const to = user.email 434 const to = user.email
439 const emailPayload: EmailPayload = { 435 const emailPayload: EmailPayload = {
440 to: [ to ], 436 to: [ to ],
441 subject: CONFIG.EMAIL.SUBJECT.PREFIX + 'Account ' + blockedWord, 437 subject: 'Account ' + blockedWord,
442 text 438 text: `Your account ${user.username} on ${WEBSERVER.HOST} has been ${blockedWord}${reasonString}.`
443 } 439 }
444 440
445 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 441 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
446 } 442 }
447 443
448 addContactFormJob (fromEmail: string, fromName: string, subject: string, body: string) { 444 addContactFormJob (fromEmail: string, fromName: string, subject: string, body: string) {
449 const text = 'Hello dear admin,\n\n' +
450 fromName + ' sent you a message' +
451 '\n\n---------------------------------------\n\n' +
452 body +
453 '\n\n---------------------------------------\n\n' +
454 'Cheers,\n' +
455 'PeerTube.'
456
457 const emailPayload: EmailPayload = { 445 const emailPayload: EmailPayload = {
458 fromDisplayName: fromEmail, 446 template: 'contact-form',
459 replyTo: fromEmail,
460 to: [ CONFIG.ADMIN.EMAIL ], 447 to: [ CONFIG.ADMIN.EMAIL ],
461 subject: CONFIG.EMAIL.SUBJECT.PREFIX + subject, 448 replyTo: `"${fromName}" <${fromEmail}>`,
462 text 449 subject: `(contact form) ${subject}`,
450 locals: {
451 fromName,
452 fromEmail,
453 body
454 }
463 } 455 }
464 456
465 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 457 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
@@ -470,18 +462,44 @@ class Emailer {
470 throw new Error('Cannot send mail because SMTP is not configured.') 462 throw new Error('Cannot send mail because SMTP is not configured.')
471 } 463 }
472 464
473 const fromDisplayName = options.fromDisplayName 465 const fromDisplayName = options.from
474 ? options.fromDisplayName 466 ? options.from
475 : WEBSERVER.HOST 467 : WEBSERVER.HOST
476 468
469 const email = new Email({
470 send: true,
471 message: {
472 from: `"${fromDisplayName}" <${CONFIG.SMTP.FROM_ADDRESS}>`
473 },
474 transport: this.transporter,
475 views: {
476 root: join(root(), 'server', 'lib', 'emails')
477 },
478 subjectPrefix: CONFIG.EMAIL.SUBJECT.PREFIX
479 })
480
477 for (const to of options.to) { 481 for (const to of options.to) {
478 await this.transporter.sendMail({ 482 await email
479 from: `"${fromDisplayName}" <${CONFIG.SMTP.FROM_ADDRESS}>`, 483 .send(merge(
480 replyTo: options.replyTo, 484 {
481 to, 485 template: 'common',
482 subject: options.subject, 486 message: {
483 text: options.text 487 to,
484 }) 488 from: options.from,
489 subject: options.subject,
490 replyTo: options.replyTo
491 },
492 locals: { // default variables available in all templates
493 WEBSERVER,
494 EMAIL: CONFIG.EMAIL,
495 text: options.text,
496 subject: options.subject
497 }
498 },
499 options // overriden/new variables given for a specific template in the payload
500 ) as SendEmailOptions)
501 .then(logger.info)
502 .catch(logger.error)
485 } 503 }
486 } 504 }
487 505
diff --git a/server/lib/emails/common/base.pug b/server/lib/emails/common/base.pug
new file mode 100644
index 000000000..9a1894cab
--- /dev/null
+++ b/server/lib/emails/common/base.pug
@@ -0,0 +1,267 @@
1//-
2 The email background color is defined in three places:
3 1. body tag: for most email clients
4 2. center tag: for Gmail and Inbox mobile apps and web versions of Gmail, GSuite, Inbox, Yahoo, AOL, Libero, Comcast, freenet, Mail.ru, Orange.fr
5 3. mso conditional: For Windows 10 Mail
6- var backgroundColor = "#fff";
7- var mainColor = "#f2690d";
8doctype html
9head
10 // This template is heavily adapted from the Cerberus Fluid template. Kudos to them!
11 meta(charset='utf-8')
12 //- utf-8 works for most cases
13 meta(name='viewport' content='width=device-width')
14 //- Forcing initial-scale shouldn't be necessary
15 meta(http-equiv='X-UA-Compatible' content='IE=edge')
16 //- Use the latest (edge) version of IE rendering engine
17 meta(name='x-apple-disable-message-reformatting')
18 //- Disable auto-scale in iOS 10 Mail entirely
19 meta(name='format-detection' content='telephone=no,address=no,email=no,date=no,url=no')
20 //- Tell iOS not to automatically link certain text strings.
21 meta(name='color-scheme' content='light')
22 meta(name='supported-color-schemes' content='light')
23 //- The title tag shows in email notifications, like Android 4.4.
24 title #{subject}
25 //- What it does: Makes background images in 72ppi Outlook render at correct size.
26 //if gte mso 9
27 xml
28 o:officedocumentsettings
29 o:allowpng
30 o:pixelsperinch 96
31 //- CSS Reset : BEGIN
32 style.
33 /* What it does: Tells the email client that only light styles are provided but the client can transform them to dark. A duplicate of meta color-scheme meta tag above. */
34 :root {
35 color-scheme: light;
36 supported-color-schemes: light;
37 }
38 /* What it does: Remove spaces around the email design added by some email clients. */
39 /* Beware: It can remove the padding / margin and add a background color to the compose a reply window. */
40 html,
41 body {
42 margin: 0 auto !important;
43 padding: 0 !important;
44 height: 100% !important;
45 width: 100% !important;
46 }
47 /* What it does: Stops email clients resizing small text. */
48 * {
49 -ms-text-size-adjust: 100%;
50 -webkit-text-size-adjust: 100%;
51 }
52 /* What it does: Centers email on Android 4.4 */
53 div[style*="margin: 16px 0"] {
54 margin: 0 !important;
55 }
56 /* What it does: forces Samsung Android mail clients to use the entire viewport */
57 #MessageViewBody, #MessageWebViewDiv{
58 width: 100% !important;
59 }
60 /* What it does: Stops Outlook from adding extra spacing to tables. */
61 table,
62 td {
63 mso-table-lspace: 0pt !important;
64 mso-table-rspace: 0pt !important;
65 }
66 /* What it does: Fixes webkit padding issue. */
67 table {
68 border-spacing: 0 !important;
69 border-collapse: collapse !important;
70 table-layout: fixed !important;
71 margin: 0 auto !important;
72 }
73 /* What it does: Uses a better rendering method when resizing images in IE. */
74 img {
75 -ms-interpolation-mode:bicubic;
76 }
77 /* What it does: Prevents Windows 10 Mail from underlining links despite inline CSS. Styles for underlined links should be inline. */
78 a {
79 text-decoration: none;
80 }
81 a:not(.nocolor) {
82 color: #{mainColor};
83 }
84 a.nocolor {
85 color: inherit !important;
86 }
87 /* What it does: A work-around for email clients meddling in triggered links. */
88 a[x-apple-data-detectors], /* iOS */
89 .unstyle-auto-detected-links a,
90 .aBn {
91 border-bottom: 0 !important;
92 cursor: default !important;
93 color: inherit !important;
94 text-decoration: none !important;
95 font-size: inherit !important;
96 font-family: inherit !important;
97 font-weight: inherit !important;
98 line-height: inherit !important;
99 }
100 /* What it does: Prevents Gmail from displaying a download button on large, non-linked images. */
101 .a6S {
102 display: none !important;
103 opacity: 0.01 !important;
104 }
105 /* What it does: Prevents Gmail from changing the text color in conversation threads. */
106 .im {
107 color: inherit !important;
108 }
109 /* If the above doesn't work, add a .g-img class to any image in question. */
110 img.g-img + div {
111 display: none !important;
112 }
113 /* What it does: Removes right gutter in Gmail iOS app: https://github.com/TedGoas/Cerberus/issues/89 */
114 /* Create one of these media queries for each additional viewport size you'd like to fix */
115 /* iPhone 4, 4S, 5, 5S, 5C, and 5SE */
116 @media only screen and (min-device-width: 320px) and (max-device-width: 374px) {
117 u ~ div .email-container {
118 min-width: 320px !important;
119 }
120 }
121 /* iPhone 6, 6S, 7, 8, and X */
122 @media only screen and (min-device-width: 375px) and (max-device-width: 413px) {
123 u ~ div .email-container {
124 min-width: 375px !important;
125 }
126 }
127 /* iPhone 6+, 7+, and 8+ */
128 @media only screen and (min-device-width: 414px) {
129 u ~ div .email-container {
130 min-width: 414px !important;
131 }
132 }
133 //- CSS Reset : END
134 //- CSS for PeerTube : START
135 style.
136 blockquote {
137 margin-left: 0;
138 padding-left: 20px;
139 border-left: 2px solid #f2690d;
140 }
141 //- CSS for PeerTube : END
142 //- Progressive Enhancements : BEGIN
143 style.
144 /* What it does: Hover styles for buttons */
145 .button-td,
146 .button-a {
147 transition: all 100ms ease-in;
148 }
149 .button-td-primary:hover,
150 .button-a-primary:hover {
151 background: #555555 !important;
152 border-color: #555555 !important;
153 }
154 /* Media Queries */
155 @media screen and (max-width: 600px) {
156 /* What it does: Adjust typography on small screens to improve readability */
157 .email-container p {
158 font-size: 17px !important;
159 }
160 }
161 //- Progressive Enhancements : END
162
163body(width="100%" style="margin: 0; padding: 0 !important; mso-line-height-rule: exactly; background-color: #{backgroundColor};")
164 center(role='article' aria-roledescription='email' lang='en' style='width: 100%; background-color: #{backgroundColor};')
165 //if mso | IE
166 table(role='presentation' border='0' cellpadding='0' cellspacing='0' width='100%' style='background-color: #fff;')
167 tr
168 td
169 //- Visually Hidden Preheader Text : BEGIN
170 div(style='max-height:0; overflow:hidden; mso-hide:all;' aria-hidden='true')
171 block preheader
172 //- Visually Hidden Preheader Text : END
173
174 //- Create white space after the desired preview text so email clients don’t pull other distracting text into the inbox preview. Extend as necessary.
175 //- Preview Text Spacing Hack : BEGIN
176 div(style='display: none; font-size: 1px; line-height: 1px; max-height: 0px; max-width: 0px; opacity: 0; overflow: hidden; mso-hide: all; font-family: sans-serif;')
177 | &zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;&nbsp;&zwnj;
178 //- Preview Text Spacing Hack : END
179
180 //-
181 Set the email width. Defined in two places:
182 1. max-width for all clients except Desktop Windows Outlook, allowing the email to squish on narrow but never go wider than 600px.
183 2. MSO tags for Desktop Windows Outlook enforce a 600px width.
184 .email-container(style='max-width: 600px; margin: 0 auto;')
185 //if mso
186 table(align='center' role='presentation' cellspacing='0' cellpadding='0' border='0' width='600')
187 tr
188 td
189 //- Email Body : BEGIN
190 table(align='center' role='presentation' cellspacing='0' cellpadding='0' border='0' width='100%' style='margin: auto;')
191 //- 1 Column Text + Button : BEGIN
192 tr
193 td(style='background-color: #ffffff;')
194 table(role='presentation' cellspacing='0' cellpadding='0' border='0' width='100%')
195 tr
196 td(style='padding: 20px; font-family: sans-serif; font-size: 15px; line-height: 20px; color: #555555;')
197 table(role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%")
198 tr
199 td(width="40px")
200 img(src=`${WEBSERVER.URL}/client/assets/images/icons/icon-192x192.png` width="auto" height="30px" alt="icon" border="0" style="height: 30px; background: #ffffff; font-family: sans-serif; font-size: 15px; line-height: 15px; color: #555555;")
201 td
202 h1(style='margin: 10px 0 10px 0; font-family: sans-serif; font-size: 25px; line-height: 30px; color: #333333; font-weight: normal;')
203 block title
204 if title
205 | #{title}
206 else
207 | Something requires your attention
208 p(style='margin: 0;')
209 block body
210 if action
211 tr
212 td(style='padding: 0 20px;')
213 //- Button : BEGIN
214 table(align='center' role='presentation' cellspacing='0' cellpadding='0' border='0' style='margin: auto;')
215 tr
216 td.button-td.button-td-primary(style='border-radius: 4px; background: #222222;')
217 a.button-a.button-a-primary(href=action.url style='background: #222222; border: 1px solid #000000; font-family: sans-serif; font-size: 15px; line-height: 15px; text-decoration: none; padding: 13px 17px; color: #ffffff; display: block; border-radius: 4px;') #{action.text}
218 //- Button : END
219 //- 1 Column Text + Button : END
220 //- Clear Spacer : BEGIN
221 tr
222 td(aria-hidden='true' height='20' style='font-size: 0px; line-height: 0px;')
223 br
224 //- Clear Spacer : END
225 //- 1 Column Text : BEGIN
226 if username
227 tr
228 td(style='background-color: #cccccc;')
229 table(role='presentation' cellspacing='0' cellpadding='0' border='0' width='100%')
230 tr
231 td(style='padding: 20px; font-family: sans-serif; font-size: 15px; line-height: 20px; color: #555555;')
232 p(style='margin: 0;')
233 | You are receiving this email as part of your notification settings on #{WEBSERVER.HOST} for your account #{username}.
234 //- 1 Column Text : END
235 //- Email Body : END
236 //- Email Footer : BEGIN
237 table(align='center' role='presentation' cellspacing='0' cellpadding='0' border='0' width='100%' style='margin: auto;')
238 tr
239 td(style='padding: 20px; padding-bottom: 0px; font-family: sans-serif; font-size: 12px; line-height: 15px; text-align: center; color: #888888;')
240 webversion
241 a.nocolor(href=`${WEBSERVER.URL}/my-account/notifications` style='color: #cccccc; font-weight: bold;') View in your notifications
242 br
243 tr
244 td(style='padding: 20px; padding-top: 10px; font-family: sans-serif; font-size: 12px; line-height: 15px; text-align: center; color: #888888;')
245 unsubscribe
246 a.nocolor(href=`${WEBSERVER.URL}/my-account/settings#notifications` style='color: #888888;') Manage your notification preferences in your profile
247 br
248 //- Email Footer : END
249 //if mso
250 //- Full Bleed Background Section : BEGIN
251 table(role='presentation' cellspacing='0' cellpadding='0' border='0' width='100%' style=`background-color: ${mainColor};`)
252 tr
253 td
254 .email-container(align='center' style='max-width: 600px; margin: auto;')
255 //if mso
256 table(role='presentation' cellspacing='0' cellpadding='0' border='0' width='600' align='center')
257 tr
258 td
259 table(role='presentation' cellspacing='0' cellpadding='0' border='0' width='100%')
260 tr
261 td(style='padding: 20px; text-align: left; font-family: sans-serif; font-size: 12px; line-height: 20px; color: #ffffff;')
262 table(role="presentation" border="0" cellpadding="0" cellspacing="0" width="100%")
263 tr
264 td(valign="top") #[a(href="https://github.com/Chocobozzz/PeerTube" style="color: white !important") PeerTube © 2015-#{new Date().getFullYear()}] #[a(href="https://github.com/Chocobozzz/PeerTube/blob/master/CREDITS.md" style="color: white !important") PeerTube Contributors]
265 //if mso
266 //- Full Bleed Background Section : END
267 //if mso | IE
diff --git a/server/lib/emails/common/greetings.pug b/server/lib/emails/common/greetings.pug
new file mode 100644
index 000000000..5efe29dfb
--- /dev/null
+++ b/server/lib/emails/common/greetings.pug
@@ -0,0 +1,11 @@
1extends base
2
3block body
4 if username
5 p Hi #{username},
6 else
7 p Hi,
8 block content
9 p
10 | Cheers,#[br]
11 | #{EMAIL.BODY.SIGNATURE} \ No newline at end of file
diff --git a/server/lib/emails/common/html.pug b/server/lib/emails/common/html.pug
new file mode 100644
index 000000000..d76168b85
--- /dev/null
+++ b/server/lib/emails/common/html.pug
@@ -0,0 +1,4 @@
1extends greetings
2
3block content
4 p !{text} \ No newline at end of file
diff --git a/server/lib/emails/common/mixins.pug b/server/lib/emails/common/mixins.pug
new file mode 100644
index 000000000..76b805a24
--- /dev/null
+++ b/server/lib/emails/common/mixins.pug
@@ -0,0 +1,3 @@
1mixin channel(channel)
2 - var handle = `${channel.name}@${channel.host}`
3 | #[a(href=`${WEBSERVER.URL}/video-channels/${handle}` title=handle) #{channel.displayName}] \ No newline at end of file
diff --git a/server/lib/emails/contact-form/html.pug b/server/lib/emails/contact-form/html.pug
new file mode 100644
index 000000000..0073ff78e
--- /dev/null
+++ b/server/lib/emails/contact-form/html.pug
@@ -0,0 +1,9 @@
1extends ../common/greetings
2
3block title
4 | Someone just used the contact form
5
6block content
7 p #{fromName} sent you a message via the contact form on #[a(href=WEBSERVER.URL) #{WEBSERVER.HOST}]:
8 blockquote(style='white-space: pre-wrap') #{body}
9 p You can contact them at #[a(href=`mailto:${fromEmail}`) #{fromEmail}], or simply reply to this email to get in touch. \ No newline at end of file
diff --git a/server/lib/emails/follower-on-channel/html.pug b/server/lib/emails/follower-on-channel/html.pug
new file mode 100644
index 000000000..8a352e90f
--- /dev/null
+++ b/server/lib/emails/follower-on-channel/html.pug
@@ -0,0 +1,9 @@
1extends ../common/greetings
2
3block title
4 | New follower on your channel
5
6block content
7 p.
8 Your #{followType} #[a(href=followingUrl) #{followingName}] has a new subscriber:
9 #[a(href=followerUrl) #{followerName}]. \ No newline at end of file
diff --git a/server/lib/emails/password-create/html.pug b/server/lib/emails/password-create/html.pug
new file mode 100644
index 000000000..45ff3078a
--- /dev/null
+++ b/server/lib/emails/password-create/html.pug
@@ -0,0 +1,10 @@
1extends ../common/greetings
2
3block title
4 | Password creation for your account
5
6block content
7 p.
8 Welcome to #[a(href=WEBSERVER.URL) #{WEBSERVER.HOST}], your PeerTube instance. Your username is: #{username}.
9 Please set your password by following #[a(href=createPasswordUrl) this link]: #[a(href=createPasswordUrl) #{createPasswordUrl}]
10 (this link will expire within seven days). \ No newline at end of file
diff --git a/server/lib/emails/password-reset/html.pug b/server/lib/emails/password-reset/html.pug
new file mode 100644
index 000000000..bb6a9d16b
--- /dev/null
+++ b/server/lib/emails/password-reset/html.pug
@@ -0,0 +1,12 @@
1extends ../common/greetings
2
3block title
4 | Password reset for your account
5
6block content
7 p.
8 A reset password procedure for your account ${to} has been requested on #[a(href=WEBSERVER.URL) #{WEBSERVER.HOST}].
9 Please follow #[a(href=resetPasswordUrl) this link] to reset it: #[a(href=resetPasswordUrl) #{resetPasswordUrl}]
10 (the link will expire within 1 hour)
11 p.
12 If you are not the person who initiated this request, please ignore this email. \ No newline at end of file
diff --git a/server/lib/emails/user-registered/html.pug b/server/lib/emails/user-registered/html.pug
new file mode 100644
index 000000000..20f62125e
--- /dev/null
+++ b/server/lib/emails/user-registered/html.pug
@@ -0,0 +1,10 @@
1extends ../common/greetings
2
3block title
4 | A new user registered
5
6block content
7 - var mail = user.email || user.pendingEmail;
8 p
9 | User #[a(href=`${WEBSERVER.URL}/accounts/${user.username}`) #{user.username}] just registered.
10 | You might want to contact them at #[a(href=`mailto:${mail}`) #{mail}]. \ No newline at end of file
diff --git a/server/lib/emails/verify-email/html.pug b/server/lib/emails/verify-email/html.pug
new file mode 100644
index 000000000..8a4a77703
--- /dev/null
+++ b/server/lib/emails/verify-email/html.pug
@@ -0,0 +1,14 @@
1extends ../common/greetings
2
3block title
4 | Account verification
5
6block content
7 p Welcome to PeerTube!
8 p.
9 You just created an account #[a(href=WEBSERVER.URL) #{WEBSERVER.HOST}], your new PeerTube instance.
10 Your username there is: #{username}.
11 p.
12 To start using PeerTube on #[a(href=WEBSERVER.URL) #{WEBSERVER.HOST}] you must verify your email first!
13 Please follow #[a(href=verifyEmailUrl) this link] to verify this email belongs to you: #[a(href=verifyEmailUrl) #{verifyEmailUrl}]
14 If you are not the person who initiated this request, please ignore this email. \ No newline at end of file
diff --git a/server/lib/emails/video-abuse-new/html.pug b/server/lib/emails/video-abuse-new/html.pug
new file mode 100644
index 000000000..999c89d26
--- /dev/null
+++ b/server/lib/emails/video-abuse-new/html.pug
@@ -0,0 +1,18 @@
1extends ../common/greetings
2include ../common/mixins.pug
3
4block title
5 | A video is pending moderation
6
7block content
8 p
9 | #[a(href=WEBSERVER.URL) #{WEBSERVER.HOST}] received an abuse report for the #{videoAbuse.video.channel.isLocal ? '' : 'remote '}video "
10 a(href=videoUrl) #{videoAbuse.video.name}
11 | " by #[+channel(videoAbuse.video.channel)]
12 if videoPublishedAt
13 | , published the #{videoPublishedAt}.
14 else
15 | , uploaded the #{videoCreatedAt} but not yet published.
16 p The reporter, #{reporter}, cited the following reason(s):
17 blockquote #{videoAbuse.reason}
18 br(style="display: none;")
diff --git a/server/lib/emails/video-auto-blacklist-new/html.pug b/server/lib/emails/video-auto-blacklist-new/html.pug
new file mode 100644
index 000000000..07c8dfd16
--- /dev/null
+++ b/server/lib/emails/video-auto-blacklist-new/html.pug
@@ -0,0 +1,17 @@
1extends ../common/greetings
2include ../common/mixins
3
4block title
5 | A video is pending moderation
6
7block content
8 p
9 | A recently added video was auto-blacklisted and requires moderator review before going public:
10 |
11 a(href=videoUrl) #{videoName}
12 |
13 | by #[+channel(channel)].
14 p.
15 Apart from the publisher and the moderation team, no one will be able to see the video until you
16 unblacklist it. If you trust the publisher, any admin can whitelist the user for later videos so
17 that they don't require approval before going public.
diff --git a/server/lib/emails/video-comment-mention/html.pug b/server/lib/emails/video-comment-mention/html.pug
new file mode 100644
index 000000000..9e9ced62d
--- /dev/null
+++ b/server/lib/emails/video-comment-mention/html.pug
@@ -0,0 +1,11 @@
1extends ../common/greetings
2
3block title
4 | Someone mentioned you
5
6block content
7 p.
8 #[a(href=accountUrl title=handle) #{accountName}] mentioned you in a comment on video
9 "#[a(href=videoUrl) #{video.name}]":
10 blockquote #{comment.text}
11 br(style="display: none;") \ No newline at end of file
diff --git a/server/lib/emails/video-comment-new/html.pug b/server/lib/emails/video-comment-new/html.pug
new file mode 100644
index 000000000..075af5717
--- /dev/null
+++ b/server/lib/emails/video-comment-new/html.pug
@@ -0,0 +1,11 @@
1extends ../common/greetings
2
3block title
4 | Someone commented your video
5
6block content
7 p.
8 #[a(href=accountUrl title=handle) #{accountName}] added a comment on your video
9 "#[a(href=videoUrl) #{video.name}]":
10 blockquote #{comment.text}
11 br(style="display: none;") \ No newline at end of file
diff --git a/server/lib/notifier.ts b/server/lib/notifier.ts
index 710c2d30f..017739523 100644
--- a/server/lib/notifier.ts
+++ b/server/lib/notifier.ts
@@ -5,7 +5,7 @@ import { UserNotificationModel } from '../models/account/user-notification'
5import { UserModel } from '../models/account/user' 5import { UserModel } from '../models/account/user'
6import { PeerTubeSocket } from './peertube-socket' 6import { PeerTubeSocket } from './peertube-socket'
7import { CONFIG } from '../initializers/config' 7import { CONFIG } from '../initializers/config'
8import { VideoPrivacy, VideoState } from '../../shared/models/videos' 8import { VideoPrivacy, VideoState, VideoAbuse } from '../../shared/models/videos'
9import { AccountBlocklistModel } from '../models/account/account-blocklist' 9import { AccountBlocklistModel } from '../models/account/account-blocklist'
10import { 10import {
11 MCommentOwnerVideo, 11 MCommentOwnerVideo,
@@ -77,9 +77,9 @@ class Notifier {
77 .catch(err => logger.error('Cannot notify mentions of comment %s.', comment.url, { err })) 77 .catch(err => logger.error('Cannot notify mentions of comment %s.', comment.url, { err }))
78 } 78 }
79 79
80 notifyOnNewVideoAbuse (videoAbuse: MVideoAbuseVideo): void { 80 notifyOnNewVideoAbuse (parameters: { videoAbuse: VideoAbuse, videoAbuseInstance: MVideoAbuseVideo, reporter: string }): void {
81 this.notifyModeratorsOfNewVideoAbuse(videoAbuse) 81 this.notifyModeratorsOfNewVideoAbuse(parameters)
82 .catch(err => logger.error('Cannot notify of new video abuse of video %s.', videoAbuse.Video.url, { err })) 82 .catch(err => logger.error('Cannot notify of new video abuse of video %s.', parameters.videoAbuseInstance.Video.url, { err }))
83 } 83 }
84 84
85 notifyOnVideoAutoBlacklist (videoBlacklist: MVideoBlacklistLightVideo): void { 85 notifyOnVideoAutoBlacklist (videoBlacklist: MVideoBlacklistLightVideo): void {
@@ -350,11 +350,15 @@ class Notifier {
350 return this.notify({ users: admins, settingGetter, notificationCreator, emailSender }) 350 return this.notify({ users: admins, settingGetter, notificationCreator, emailSender })
351 } 351 }
352 352
353 private async notifyModeratorsOfNewVideoAbuse (videoAbuse: MVideoAbuseVideo) { 353 private async notifyModeratorsOfNewVideoAbuse (parameters: {
354 videoAbuse: VideoAbuse
355 videoAbuseInstance: MVideoAbuseVideo
356 reporter: string
357 }) {
354 const moderators = await UserModel.listWithRight(UserRight.MANAGE_VIDEO_ABUSES) 358 const moderators = await UserModel.listWithRight(UserRight.MANAGE_VIDEO_ABUSES)
355 if (moderators.length === 0) return 359 if (moderators.length === 0) return
356 360
357 logger.info('Notifying %s user/moderators of new video abuse %s.', moderators.length, videoAbuse.Video.url) 361 logger.info('Notifying %s user/moderators of new video abuse %s.', moderators.length, parameters.videoAbuseInstance.Video.url)
358 362
359 function settingGetter (user: MUserWithNotificationSetting) { 363 function settingGetter (user: MUserWithNotificationSetting) {
360 return user.NotificationSetting.videoAbuseAsModerator 364 return user.NotificationSetting.videoAbuseAsModerator
@@ -364,15 +368,15 @@ class Notifier {
364 const notification: UserNotificationModelForApi = await UserNotificationModel.create<UserNotificationModelForApi>({ 368 const notification: UserNotificationModelForApi = await UserNotificationModel.create<UserNotificationModelForApi>({
365 type: UserNotificationType.NEW_VIDEO_ABUSE_FOR_MODERATORS, 369 type: UserNotificationType.NEW_VIDEO_ABUSE_FOR_MODERATORS,
366 userId: user.id, 370 userId: user.id,
367 videoAbuseId: videoAbuse.id 371 videoAbuseId: parameters.videoAbuse.id
368 }) 372 })
369 notification.VideoAbuse = videoAbuse 373 notification.VideoAbuse = parameters.videoAbuseInstance
370 374
371 return notification 375 return notification
372 } 376 }
373 377
374 function emailSender (emails: string[]) { 378 function emailSender (emails: string[]) {
375 return Emailer.Instance.addVideoAbuseModeratorsNotification(emails, videoAbuse) 379 return Emailer.Instance.addVideoAbuseModeratorsNotification(emails, parameters)
376 } 380 }
377 381
378 return this.notify({ users: moderators, settingGetter, notificationCreator, emailSender }) 382 return this.notify({ users: moderators, settingGetter, notificationCreator, emailSender })
diff --git a/server/tests/api/server/contact-form.ts b/server/tests/api/server/contact-form.ts
index bd1b0e38a..8d1270358 100644
--- a/server/tests/api/server/contact-form.ts
+++ b/server/tests/api/server/contact-form.ts
@@ -46,7 +46,7 @@ describe('Test contact form', function () {
46 const email = emails[0] 46 const email = emails[0]
47 47
48 expect(email['from'][0]['address']).equal('test-admin@localhost') 48 expect(email['from'][0]['address']).equal('test-admin@localhost')
49 expect(email['from'][0]['name']).equal('toto@example.com') 49 expect(email['replyTo'][0]['address']).equal('toto@example.com')
50 expect(email['to'][0]['address']).equal('admin' + server.internalServerNumber + '@example.com') 50 expect(email['to'][0]['address']).equal('admin' + server.internalServerNumber + '@example.com')
51 expect(email['subject']).contains('my subject') 51 expect(email['subject']).contains('my subject')
52 expect(email['text']).contains('my super message') 52 expect(email['text']).contains('my super message')
diff --git a/shared/extra-utils/users/user-notifications.ts b/shared/extra-utils/users/user-notifications.ts
index f949878e4..bd00894c4 100644
--- a/shared/extra-utils/users/user-notifications.ts
+++ b/shared/extra-utils/users/user-notifications.ts
@@ -110,10 +110,10 @@ async function checkNotification (
110 110
111 if (checkType === 'presence') { 111 if (checkType === 'presence') {
112 const obj = inspect(base.socketNotifications, { depth: 5 }) 112 const obj = inspect(base.socketNotifications, { depth: 5 })
113 expect(socketNotification, 'The socket notification is absent. ' + obj).to.not.be.undefined 113 expect(socketNotification, 'The socket notification is absent when is should be present. ' + obj).to.not.be.undefined
114 } else { 114 } else {
115 const obj = inspect(socketNotification, { depth: 5 }) 115 const obj = inspect(socketNotification, { depth: 5 })
116 expect(socketNotification, 'The socket notification is present. ' + obj).to.be.undefined 116 expect(socketNotification, 'The socket notification is present when is should not be present. ' + obj).to.be.undefined
117 } 117 }
118 } 118 }
119 119
@@ -125,9 +125,9 @@ async function checkNotification (
125 .find(e => emailNotificationFinder(e)) 125 .find(e => emailNotificationFinder(e))
126 126
127 if (checkType === 'presence') { 127 if (checkType === 'presence') {
128 expect(email, 'The email is absent. ' + inspect(base.emails)).to.not.be.undefined 128 expect(email, 'The email is absent when is should be present. ' + inspect(base.emails)).to.not.be.undefined
129 } else { 129 } else {
130 expect(email, 'The email is present. ' + inspect(email)).to.be.undefined 130 expect(email, 'The email is present when is should not be present. ' + inspect(email)).to.be.undefined
131 } 131 }
132 } 132 }
133} 133}
@@ -172,12 +172,12 @@ async function checkNewVideoFromSubscription (base: CheckerBaseParams, videoName
172 } 172 }
173 } 173 }
174 174
175 function emailFinder (email: object) { 175 function emailNotificationFinder (email: object) {
176 const text = email['text'] 176 const text = email['text']
177 return text.indexOf(videoUUID) !== -1 && text.indexOf('Your subscription') !== -1 177 return text.indexOf(videoUUID) !== -1 && text.indexOf('Your subscription') !== -1
178 } 178 }
179 179
180 await checkNotification(base, notificationChecker, emailFinder, type) 180 await checkNotification(base, notificationChecker, emailNotificationFinder, type)
181} 181}
182 182
183async function checkVideoIsPublished (base: CheckerBaseParams, videoName: string, videoUUID: string, type: CheckerType) { 183async function checkVideoIsPublished (base: CheckerBaseParams, videoName: string, videoUUID: string, type: CheckerType) {
@@ -195,12 +195,12 @@ async function checkVideoIsPublished (base: CheckerBaseParams, videoName: string
195 } 195 }
196 } 196 }
197 197
198 function emailFinder (email: object) { 198 function emailNotificationFinder (email: object) {
199 const text: string = email['text'] 199 const text: string = email['text']
200 return text.includes(videoUUID) && text.includes('Your video') 200 return text.includes(videoUUID) && text.includes('Your video')
201 } 201 }
202 202
203 await checkNotification(base, notificationChecker, emailFinder, type) 203 await checkNotification(base, notificationChecker, emailNotificationFinder, type)
204} 204}
205 205
206async function checkMyVideoImportIsFinished ( 206async function checkMyVideoImportIsFinished (
@@ -226,14 +226,14 @@ async function checkMyVideoImportIsFinished (
226 } 226 }
227 } 227 }
228 228
229 function emailFinder (email: object) { 229 function emailNotificationFinder (email: object) {
230 const text: string = email['text'] 230 const text: string = email['text']
231 const toFind = success ? ' finished' : ' error' 231 const toFind = success ? ' finished' : ' error'
232 232
233 return text.includes(url) && text.includes(toFind) 233 return text.includes(url) && text.includes(toFind)
234 } 234 }
235 235
236 await checkNotification(base, notificationChecker, emailFinder, type) 236 await checkNotification(base, notificationChecker, emailNotificationFinder, type)
237} 237}
238 238
239async function checkUserRegistered (base: CheckerBaseParams, username: string, type: CheckerType) { 239async function checkUserRegistered (base: CheckerBaseParams, username: string, type: CheckerType) {
@@ -251,13 +251,13 @@ async function checkUserRegistered (base: CheckerBaseParams, username: string, t
251 } 251 }
252 } 252 }
253 253
254 function emailFinder (email: object) { 254 function emailNotificationFinder (email: object) {
255 const text: string = email['text'] 255 const text: string = email['text']
256 256
257 return text.includes(' registered ') && text.includes(username) 257 return text.includes(' registered.') && text.includes(username)
258 } 258 }
259 259
260 await checkNotification(base, notificationChecker, emailFinder, type) 260 await checkNotification(base, notificationChecker, emailNotificationFinder, type)
261} 261}
262 262
263async function checkNewActorFollow ( 263async function checkNewActorFollow (
@@ -291,13 +291,13 @@ async function checkNewActorFollow (
291 } 291 }
292 } 292 }
293 293
294 function emailFinder (email: object) { 294 function emailNotificationFinder (email: object) {
295 const text: string = email['text'] 295 const text: string = email['text']
296 296
297 return text.includes('Your ' + followType) && text.includes(followingDisplayName) && text.includes(followerDisplayName) 297 return text.includes(followType) && text.includes(followingDisplayName) && text.includes(followerDisplayName)
298 } 298 }
299 299
300 await checkNotification(base, notificationChecker, emailFinder, type) 300 await checkNotification(base, notificationChecker, emailNotificationFinder, type)
301} 301}
302 302
303async function checkNewInstanceFollower (base: CheckerBaseParams, followerHost: string, type: CheckerType) { 303async function checkNewInstanceFollower (base: CheckerBaseParams, followerHost: string, type: CheckerType) {
@@ -320,13 +320,13 @@ async function checkNewInstanceFollower (base: CheckerBaseParams, followerHost:
320 } 320 }
321 } 321 }
322 322
323 function emailFinder (email: object) { 323 function emailNotificationFinder (email: object) {
324 const text: string = email['text'] 324 const text: string = email['text']
325 325
326 return text.includes('instance has a new follower') && text.includes(followerHost) 326 return text.includes('instance has a new follower') && text.includes(followerHost)
327 } 327 }
328 328
329 await checkNotification(base, notificationChecker, emailFinder, type) 329 await checkNotification(base, notificationChecker, emailNotificationFinder, type)
330} 330}
331 331
332async function checkAutoInstanceFollowing (base: CheckerBaseParams, followerHost: string, followingHost: string, type: CheckerType) { 332async function checkAutoInstanceFollowing (base: CheckerBaseParams, followerHost: string, followingHost: string, type: CheckerType) {
@@ -351,13 +351,13 @@ async function checkAutoInstanceFollowing (base: CheckerBaseParams, followerHost
351 } 351 }
352 } 352 }
353 353
354 function emailFinder (email: object) { 354 function emailNotificationFinder (email: object) {
355 const text: string = email['text'] 355 const text: string = email['text']
356 356
357 return text.includes(' automatically followed a new instance') && text.includes(followingHost) 357 return text.includes(' automatically followed a new instance') && text.includes(followingHost)
358 } 358 }
359 359
360 await checkNotification(base, notificationChecker, emailFinder, type) 360 await checkNotification(base, notificationChecker, emailNotificationFinder, type)
361} 361}
362 362
363async function checkCommentMention ( 363async function checkCommentMention (
@@ -385,13 +385,13 @@ async function checkCommentMention (
385 } 385 }
386 } 386 }
387 387
388 function emailFinder (email: object) { 388 function emailNotificationFinder (email: object) {
389 const text: string = email['text'] 389 const text: string = email['text']
390 390
391 return text.includes(' mentioned ') && text.includes(uuid) && text.includes(byAccountDisplayName) 391 return text.includes(' mentioned ') && text.includes(uuid) && text.includes(byAccountDisplayName)
392 } 392 }
393 393
394 await checkNotification(base, notificationChecker, emailFinder, type) 394 await checkNotification(base, notificationChecker, emailNotificationFinder, type)
395} 395}
396 396
397let lastEmailCount = 0 397let lastEmailCount = 0
@@ -416,11 +416,11 @@ async function checkNewCommentOnMyVideo (base: CheckerBaseParams, uuid: string,
416 416
417 const commentUrl = `http://localhost:${base.server.port}/videos/watch/${uuid};threadId=${threadId}` 417 const commentUrl = `http://localhost:${base.server.port}/videos/watch/${uuid};threadId=${threadId}`
418 418
419 function emailFinder (email: object) { 419 function emailNotificationFinder (email: object) {
420 return email['text'].indexOf(commentUrl) !== -1 420 return email['text'].indexOf(commentUrl) !== -1
421 } 421 }
422 422
423 await checkNotification(base, notificationChecker, emailFinder, type) 423 await checkNotification(base, notificationChecker, emailNotificationFinder, type)
424 424
425 if (type === 'presence') { 425 if (type === 'presence') {
426 // We cannot detect email duplicates, so check we received another email 426 // We cannot detect email duplicates, so check we received another email
@@ -446,12 +446,12 @@ async function checkNewVideoAbuseForModerators (base: CheckerBaseParams, videoUU
446 } 446 }
447 } 447 }
448 448
449 function emailFinder (email: object) { 449 function emailNotificationFinder (email: object) {
450 const text = email['text'] 450 const text = email['text']
451 return text.indexOf(videoUUID) !== -1 && text.indexOf('abuse') !== -1 451 return text.indexOf(videoUUID) !== -1 && text.indexOf('abuse') !== -1
452 } 452 }
453 453
454 await checkNotification(base, notificationChecker, emailFinder, type) 454 await checkNotification(base, notificationChecker, emailNotificationFinder, type)
455} 455}
456 456
457async function checkVideoAutoBlacklistForModerators (base: CheckerBaseParams, videoUUID: string, videoName: string, type: CheckerType) { 457async function checkVideoAutoBlacklistForModerators (base: CheckerBaseParams, videoUUID: string, videoName: string, type: CheckerType) {
@@ -471,12 +471,12 @@ async function checkVideoAutoBlacklistForModerators (base: CheckerBaseParams, vi
471 } 471 }
472 } 472 }
473 473
474 function emailFinder (email: object) { 474 function emailNotificationFinder (email: object) {
475 const text = email['text'] 475 const text = email['text']
476 return text.indexOf(videoUUID) !== -1 && email['text'].indexOf('video-auto-blacklist/list') !== -1 476 return text.indexOf(videoUUID) !== -1 && email['text'].indexOf('video-auto-blacklist/list') !== -1
477 } 477 }
478 478
479 await checkNotification(base, notificationChecker, emailFinder, type) 479 await checkNotification(base, notificationChecker, emailNotificationFinder, type)
480} 480}
481 481
482async function checkNewBlacklistOnMyVideo ( 482async function checkNewBlacklistOnMyVideo (
@@ -498,12 +498,12 @@ async function checkNewBlacklistOnMyVideo (
498 checkVideo(video, videoName, videoUUID) 498 checkVideo(video, videoName, videoUUID)
499 } 499 }
500 500
501 function emailFinder (email: object) { 501 function emailNotificationFinder (email: object) {
502 const text = email['text'] 502 const text = email['text']
503 return text.indexOf(videoUUID) !== -1 && text.indexOf(' ' + blacklistType) !== -1 503 return text.indexOf(videoUUID) !== -1 && text.indexOf(' ' + blacklistType) !== -1
504 } 504 }
505 505
506 await checkNotification(base, notificationChecker, emailFinder, 'presence') 506 await checkNotification(base, notificationChecker, emailNotificationFinder, 'presence')
507} 507}
508 508
509// --------------------------------------------------------------------------- 509// ---------------------------------------------------------------------------
diff --git a/shared/models/server/emailer.model.ts b/shared/models/server/emailer.model.ts
index 2d8feda81..069ef0bab 100644
--- a/shared/models/server/emailer.model.ts
+++ b/shared/models/server/emailer.model.ts
@@ -1,8 +1,12 @@
1export type SendEmailOptions = { 1export type SendEmailOptions = {
2 to: string[] 2 to: string[]
3 subject: string
4 text: string
5 3
6 fromDisplayName?: string 4 template?: string
5 locals?: { [key: string]: any }
6
7 // override defaults
8 subject?: string
9 text?: string
10 from?: string | { name?: string, address: string }
7 replyTo?: string 11 replyTo?: string
8} 12}
diff --git a/yarn.lock b/yarn.lock
index 6bda65a91..7add25761 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -65,16 +65,57 @@
65 chalk "^2.0.0" 65 chalk "^2.0.0"
66 js-tokens "^4.0.0" 66 js-tokens "^4.0.0"
67 67
68"@babel/runtime@^7.6.3":
69 version "7.9.6"
70 resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.9.6.tgz#a9102eb5cadedf3f31d08a9ecf294af7827ea29f"
71 integrity sha512-64AF1xY3OAkFHqOb9s4jpgk1Mm5vDZ4L3acHvAml+53nO1XbXLuDodsVpO4OIUsmemlUHMxNdYMNJmsvOwLrvQ==
72 dependencies:
73 regenerator-runtime "^0.13.4"
74
75"@hapi/boom@^9.0.0":
76 version "9.1.0"
77 resolved "https://registry.yarnpkg.com/@hapi/boom/-/boom-9.1.0.tgz#0d9517657a56ff1e0b42d0aca9da1b37706fec56"
78 integrity sha512-4nZmpp4tXbm162LaZT45P7F7sgiem8dwAh2vHWT6XX24dozNjGMg6BvKCRvtCUcmcXqeMIUqWN8Rc5X8yKuROQ==
79 dependencies:
80 "@hapi/hoek" "9.x.x"
81
82"@hapi/hoek@9.x.x":
83 version "9.0.4"
84 resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.0.4.tgz#e80ad4e8e8d2adc6c77d985f698447e8628b6010"
85 integrity sha512-EwaJS7RjoXUZ2cXXKZZxZqieGtc7RbvQhUy8FwDoMQtxWVi14tFjeFCYPZAM1mBCpOpiBpyaZbb9NeHc7eGKgw==
86
68"@jsdevtools/ono@^7.1.0": 87"@jsdevtools/ono@^7.1.0":
69 version "7.1.1" 88 version "7.1.1"
70 resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.1.tgz#36034f9cb0fb456858c137a3f3e6d6db67ab5cc5" 89 resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.1.tgz#36034f9cb0fb456858c137a3f3e6d6db67ab5cc5"
71 integrity sha512-pu5fxkbLQWzRbBgfFbZfHXz0KlYojOfVdUhcNfy9lef8ZhBt0pckGr8g7zv4vPX4Out5vBNvqd/az4UaVWzZ9A== 90 integrity sha512-pu5fxkbLQWzRbBgfFbZfHXz0KlYojOfVdUhcNfy9lef8ZhBt0pckGr8g7zv4vPX4Out5vBNvqd/az4UaVWzZ9A==
72 91
92"@ladjs/i18n@^3.0.4":
93 version "3.0.5"
94 resolved "https://registry.yarnpkg.com/@ladjs/i18n/-/i18n-3.0.5.tgz#2083b987db85b7671d934734003fd41e753c3892"
95 integrity sha512-iSHpzLTPE+lEgPiECUcnVHDidZFnyahpNj6azsQ316mQU2owGH2YXky0zjYsA4p8aSnzGtGYsgfPNfLZASIcSQ==
96 dependencies:
97 "@hapi/boom" "^9.0.0"
98 boolean "3.0.0"
99 country-language "^0.1.7"
100 debug "^4.1.1"
101 i18n "^0.9.1"
102 i18n-locales "^0.0.4"
103 lodash "^4.17.15"
104 moment "^2.24.0"
105 multimatch "^4.0.0"
106 qs "^6.9.1"
107 titleize "^2.1.0"
108
73"@openapitools/openapi-generator-cli@^1.0.12-4.3.0": 109"@openapitools/openapi-generator-cli@^1.0.12-4.3.0":
74 version "1.0.12-4.3.0" 110 version "1.0.12-4.3.0"
75 resolved "https://registry.yarnpkg.com/@openapitools/openapi-generator-cli/-/openapi-generator-cli-1.0.12-4.3.0.tgz#845f0bfd47a73bdaa188667c3085d721e0d91785" 111 resolved "https://registry.yarnpkg.com/@openapitools/openapi-generator-cli/-/openapi-generator-cli-1.0.12-4.3.0.tgz#845f0bfd47a73bdaa188667c3085d721e0d91785"
76 integrity sha512-p6y0ur69/vEslpARrcWg3geujOAjxoQIlIamZGm1cWsu4y4RrEdrolueWA1Lxww2pUzgxvb9PwD6hHFZNNfgrw== 112 integrity sha512-p6y0ur69/vEslpARrcWg3geujOAjxoQIlIamZGm1cWsu4y4RrEdrolueWA1Lxww2pUzgxvb9PwD6hHFZNNfgrw==
77 113
114"@sindresorhus/is@^2.1.0":
115 version "2.1.1"
116 resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-2.1.1.tgz#ceff6a28a5b4867c2dd4a1ba513de278ccbe8bb1"
117 integrity sha512-/aPsuoj/1Dw/kzhkgz+ES6TxG0zfTMGLwuK2ZG00k/iJzYHTLCE8mVU8EPqEOp/lmxPoq1C1C9RYToRKb2KEfg==
118
78"@types/apicache@^1.2.0": 119"@types/apicache@^1.2.0":
79 version "1.2.2" 120 version "1.2.2"
80 resolved "https://registry.yarnpkg.com/@types/apicache/-/apicache-1.2.2.tgz#b820659b1d95e66ec0e71dcd0317e9d30f0c154b" 121 resolved "https://registry.yarnpkg.com/@types/apicache/-/apicache-1.2.2.tgz#b820659b1d95e66ec0e71dcd0317e9d30f0c154b"
@@ -92,6 +133,18 @@
92 resolved "https://registry.yarnpkg.com/@types/async/-/async-3.2.0.tgz#2bf5c62ca7f50efa77b74c971f1401a6db9ff938" 133 resolved "https://registry.yarnpkg.com/@types/async/-/async-3.2.0.tgz#2bf5c62ca7f50efa77b74c971f1401a6db9ff938"
93 integrity sha512-7dhGj2u7hS+Y/NPxFDaTL/kbTvVjOKvZmD+GZp0jGGOLvnakomncrqSReX+xPAGGZuCUSUsXXy9I9pEpSwxpKA== 134 integrity sha512-7dhGj2u7hS+Y/NPxFDaTL/kbTvVjOKvZmD+GZp0jGGOLvnakomncrqSReX+xPAGGZuCUSUsXXy9I9pEpSwxpKA==
94 135
136"@types/babel-types@*", "@types/babel-types@^7.0.0":
137 version "7.0.7"
138 resolved "https://registry.yarnpkg.com/@types/babel-types/-/babel-types-7.0.7.tgz#667eb1640e8039436028055737d2b9986ee336e3"
139 integrity sha512-dBtBbrc+qTHy1WdfHYjBwRln4+LWqASWakLHsWHR2NWHIFkv4W3O070IGoGLEBrJBvct3r0L1BUPuvURi7kYUQ==
140
141"@types/babylon@^6.16.2":
142 version "6.16.5"
143 resolved "https://registry.yarnpkg.com/@types/babylon/-/babylon-6.16.5.tgz#1c5641db69eb8cdf378edd25b4be7754beeb48b4"
144 integrity sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==
145 dependencies:
146 "@types/babel-types" "*"
147
95"@types/bcrypt@^3.0.0": 148"@types/bcrypt@^3.0.0":
96 version "3.0.0" 149 version "3.0.0"
97 resolved "https://registry.yarnpkg.com/@types/bcrypt/-/bcrypt-3.0.0.tgz#851489a9065a067cb7f3c9cbe4ce9bed8bba0876" 150 resolved "https://registry.yarnpkg.com/@types/bcrypt/-/bcrypt-3.0.0.tgz#851489a9065a067cb7f3c9cbe4ce9bed8bba0876"
@@ -277,6 +330,11 @@
277 resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d" 330 resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.1.tgz#dc488842312a7f075149312905b5e3c0b054c79d"
278 integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw== 331 integrity sha512-FwI9gX75FgVBJ7ywgnq/P7tw+/o1GUbtP0KzbtusLigAOgIgNISRK0ZPl4qertvXSIE8YbsVJueQ90cDt9YYyw==
279 332
333"@types/minimatch@^3.0.3":
334 version "3.0.3"
335 resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
336 integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
337
280"@types/mkdirp@^1.0.0": 338"@types/mkdirp@^1.0.0":
281 version "1.0.0" 339 version "1.0.0"
282 resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-1.0.0.tgz#16ce0eabe4a9a3afe64557ad0ee6886ec3d32927" 340 resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-1.0.0.tgz#16ce0eabe4a9a3afe64557ad0ee6886ec3d32927"
@@ -516,11 +574,28 @@ accepts@~1.3.4, accepts@~1.3.7:
516 mime-types "~2.1.24" 574 mime-types "~2.1.24"
517 negotiator "0.6.2" 575 negotiator "0.6.2"
518 576
577acorn-globals@^3.0.0:
578 version "3.1.0"
579 resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-3.1.0.tgz#fd8270f71fbb4996b004fa880ee5d46573a731bf"
580 integrity sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=
581 dependencies:
582 acorn "^4.0.4"
583
519acorn-jsx@^5.2.0: 584acorn-jsx@^5.2.0:
520 version "5.2.0" 585 version "5.2.0"
521 resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe" 586 resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz#4c66069173d6fdd68ed85239fc256226182b2ebe"
522 integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ== 587 integrity sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==
523 588
589acorn@^3.1.0:
590 version "3.3.0"
591 resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
592 integrity sha1-ReN/s56No/JbruP/U2niu18iAXo=
593
594acorn@^4.0.4, acorn@~4.0.2:
595 version "4.0.13"
596 resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
597 integrity sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=
598
524acorn@^7.1.1: 599acorn@^7.1.1:
525 version "7.1.1" 600 version "7.1.1"
526 resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf" 601 resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.1.tgz#e35668de0b402f359de515c5482a1ab9f89a69bf"
@@ -551,6 +626,15 @@ ajv@^6.10.0, ajv@^6.10.2, ajv@^6.5.5:
551 json-schema-traverse "^0.4.1" 626 json-schema-traverse "^0.4.1"
552 uri-js "^4.2.2" 627 uri-js "^4.2.2"
553 628
629align-text@^0.1.1, align-text@^0.1.3:
630 version "0.1.4"
631 resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117"
632 integrity sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=
633 dependencies:
634 kind-of "^3.0.2"
635 longest "^1.0.1"
636 repeat-string "^1.5.2"
637
554ansi-align@^2.0.0: 638ansi-align@^2.0.0:
555 version "2.0.0" 639 version "2.0.0"
556 resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" 640 resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f"
@@ -653,6 +737,11 @@ argparse@^1.0.7:
653 dependencies: 737 dependencies:
654 sprintf-js "~1.0.2" 738 sprintf-js "~1.0.2"
655 739
740array-differ@^3.0.0:
741 version "3.0.0"
742 resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-3.0.0.tgz#3cbb3d0f316810eafcc47624734237d6aee4ae6b"
743 integrity sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==
744
656array-flatten@1.1.1: 745array-flatten@1.1.1:
657 version "1.1.1" 746 version "1.1.1"
658 resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 747 resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
@@ -667,6 +756,11 @@ array-includes@^3.0.3:
667 es-abstract "^1.17.0" 756 es-abstract "^1.17.0"
668 is-string "^1.0.5" 757 is-string "^1.0.5"
669 758
759array-union@^2.1.0:
760 version "2.1.0"
761 resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d"
762 integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==
763
670array.prototype.flat@^1.2.1: 764array.prototype.flat@^1.2.1:
671 version "1.2.3" 765 version "1.2.3"
672 resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b" 766 resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.2.3.tgz#0de82b426b0318dbfdb940089e38b043d37f6c7b"
@@ -680,6 +774,16 @@ arraybuffer.slice@~0.0.7:
680 resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675" 774 resolved "https://registry.yarnpkg.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz#3bbc4275dd584cc1b10809b89d4e8b63a69e7675"
681 integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog== 775 integrity sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==
682 776
777arrify@^2.0.1:
778 version "2.0.1"
779 resolved "https://registry.yarnpkg.com/arrify/-/arrify-2.0.1.tgz#c9655e9331e0abcd588d2a7cad7e9956f66701fa"
780 integrity sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==
781
782asap@~2.0.3:
783 version "2.0.6"
784 resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
785 integrity sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=
786
683asn1@~0.2.3: 787asn1@~0.2.3:
684 version "0.2.4" 788 version "0.2.4"
685 resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" 789 resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136"
@@ -761,6 +865,29 @@ aws4@^1.8.0:
761 resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e" 865 resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.9.1.tgz#7e33d8f7d449b3f673cd72deb9abdc552dbe528e"
762 integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug== 866 integrity sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==
763 867
868babel-runtime@^6.26.0:
869 version "6.26.0"
870 resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
871 integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
872 dependencies:
873 core-js "^2.4.0"
874 regenerator-runtime "^0.11.0"
875
876babel-types@^6.26.0:
877 version "6.26.0"
878 resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
879 integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
880 dependencies:
881 babel-runtime "^6.26.0"
882 esutils "^2.0.2"
883 lodash "^4.17.4"
884 to-fast-properties "^1.0.3"
885
886babylon@^6.18.0:
887 version "6.18.0"
888 resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
889 integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
890
764backo2@1.0.2: 891backo2@1.0.2:
765 version "1.0.2" 892 version "1.0.2"
766 resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947" 893 resolved "https://registry.yarnpkg.com/backo2/-/backo2-1.0.2.tgz#31ab1ac8b129363463e35b3ebb69f4dfcfba7947"
@@ -946,7 +1073,7 @@ bluebird@^2.10.0:
946 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" 1073 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1"
947 integrity sha1-U0uQM8AiyVecVro7Plpcqvu2UOE= 1074 integrity sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=
948 1075
949bluebird@^3.0.5, bluebird@^3.5.0, bluebird@^3.5.1: 1076bluebird@^3.0.5, bluebird@^3.1.1, bluebird@^3.5.0, bluebird@^3.5.1:
950 version "3.7.2" 1077 version "3.7.2"
951 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" 1078 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f"
952 integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== 1079 integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==
@@ -972,6 +1099,16 @@ body-parser@1.19.0, body-parser@^1.12.4:
972 raw-body "2.4.0" 1099 raw-body "2.4.0"
973 type-is "~1.6.17" 1100 type-is "~1.6.17"
974 1101
1102boolbase@~1.0.0:
1103 version "1.0.0"
1104 resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
1105 integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
1106
1107boolean@3.0.0:
1108 version "3.0.0"
1109 resolved "https://registry.yarnpkg.com/boolean/-/boolean-3.0.0.tgz#fab78d5907dbae6216ab46d32733bb7b76b99e76"
1110 integrity sha512-OElxJ1lUSinuoUnkpOgLmxp0DC4ytEhODEL6QJU0NpxE/mI4rUSh8h1P1Wkvfi3xQEBcxXR2gBIPNYNuaFcAbQ==
1111
975bowser@2.9.0: 1112bowser@2.9.0:
976 version "2.9.0" 1113 version "2.9.0"
977 resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.9.0.tgz#3bed854233b419b9a7422d9ee3e85504373821c9" 1114 resolved "https://registry.yarnpkg.com/bowser/-/bowser-2.9.0.tgz#3bed854233b419b9a7422d9ee3e85504373821c9"
@@ -1102,6 +1239,11 @@ callsites@^3.0.0:
1102 resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" 1239 resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73"
1103 integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== 1240 integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==
1104 1241
1242camelcase@^1.0.2:
1243 version "1.2.1"
1244 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39"
1245 integrity sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=
1246
1105camelcase@^4.0.0: 1247camelcase@^4.0.0:
1106 version "4.1.0" 1248 version "4.1.0"
1107 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" 1249 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd"
@@ -1132,6 +1274,14 @@ caseless@~0.12.0:
1132 resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" 1274 resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
1133 integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= 1275 integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
1134 1276
1277center-align@^0.1.1:
1278 version "0.1.3"
1279 resolved "https://registry.yarnpkg.com/center-align/-/center-align-0.1.3.tgz#aa0d32629b6ee972200411cbd4461c907bc2b7ad"
1280 integrity sha1-qg0yYptu6XIgBBHL1EYckHvCt60=
1281 dependencies:
1282 align-text "^0.1.3"
1283 lazy-cache "^1.0.3"
1284
1135chai-json-schema@^1.5.0: 1285chai-json-schema@^1.5.0:
1136 version "1.5.1" 1286 version "1.5.1"
1137 resolved "https://registry.yarnpkg.com/chai-json-schema/-/chai-json-schema-1.5.1.tgz#d9ae4c8f8c6e24ff4d402ceddfaa865d1ca107f4" 1287 resolved "https://registry.yarnpkg.com/chai-json-schema/-/chai-json-schema-1.5.1.tgz#d9ae4c8f8c6e24ff4d402ceddfaa865d1ca107f4"
@@ -1185,6 +1335,13 @@ chalk@^3.0.0:
1185 ansi-styles "^4.1.0" 1335 ansi-styles "^4.1.0"
1186 supports-color "^7.1.0" 1336 supports-color "^7.1.0"
1187 1337
1338character-parser@^2.1.1:
1339 version "2.2.0"
1340 resolved "https://registry.yarnpkg.com/character-parser/-/character-parser-2.2.0.tgz#c7ce28f36d4bcd9744e5ffc2c5fcde1c73261fc0"
1341 integrity sha1-x84o821LzZdE5f/CxfzeHHMmH8A=
1342 dependencies:
1343 is-regex "^1.0.3"
1344
1188chardet@^0.7.0: 1345chardet@^0.7.0:
1189 version "0.7.0" 1346 version "0.7.0"
1190 resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 1347 resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
@@ -1205,6 +1362,28 @@ check-error@^1.0.2:
1205 resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" 1362 resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82"
1206 integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII= 1363 integrity sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=
1207 1364
1365cheerio@^0.22.0:
1366 version "0.22.0"
1367 resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-0.22.0.tgz#a9baa860a3f9b595a6b81b1a86873121ed3a269e"
1368 integrity sha1-qbqoYKP5tZWmuBsahocxIe06Jp4=
1369 dependencies:
1370 css-select "~1.2.0"
1371 dom-serializer "~0.1.0"
1372 entities "~1.1.1"
1373 htmlparser2 "^3.9.1"
1374 lodash.assignin "^4.0.9"
1375 lodash.bind "^4.1.4"
1376 lodash.defaults "^4.0.1"
1377 lodash.filter "^4.4.0"
1378 lodash.flatten "^4.2.0"
1379 lodash.foreach "^4.3.0"
1380 lodash.map "^4.4.0"
1381 lodash.merge "^4.4.0"
1382 lodash.pick "^4.2.1"
1383 lodash.reduce "^4.4.0"
1384 lodash.reject "^4.4.0"
1385 lodash.some "^4.4.0"
1386
1208chokidar@3.3.0: 1387chokidar@3.3.0:
1209 version "3.3.0" 1388 version "3.3.0"
1210 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6" 1389 resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.3.0.tgz#12c0714668c55800f659e262d4962a97faf554a6"
@@ -1287,6 +1466,13 @@ circular-json@^0.5.9:
1287 resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d" 1466 resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.5.9.tgz#932763ae88f4f7dead7a0d09c8a51a4743a53b1d"
1288 integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ== 1467 integrity sha512-4ivwqHpIFJZBuhN3g/pEcdbnGUywkBblloGbkglyloVjjR3uT6tieI89MVOfbP2tHX5sgb01FuLgAOzebNlJNQ==
1289 1468
1469clean-css@^4.1.11:
1470 version "4.2.3"
1471 resolved "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz#507b5de7d97b48ee53d84adb0160ff6216380f78"
1472 integrity sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==
1473 dependencies:
1474 source-map "~0.6.0"
1475
1290cli-boxes@^1.0.0: 1476cli-boxes@^1.0.0:
1291 version "1.0.0" 1477 version "1.0.0"
1292 resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" 1478 resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143"
@@ -1304,6 +1490,15 @@ cli-width@^2.0.0:
1304 resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 1490 resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639"
1305 integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= 1491 integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=
1306 1492
1493cliui@^2.1.0:
1494 version "2.1.0"
1495 resolved "https://registry.yarnpkg.com/cliui/-/cliui-2.1.0.tgz#4b475760ff80264c762c3a1719032e91c7fea0d1"
1496 integrity sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=
1497 dependencies:
1498 center-align "^0.1.1"
1499 right-align "^0.1.1"
1500 wordwrap "0.0.2"
1501
1307cliui@^5.0.0: 1502cliui@^5.0.0:
1308 version "5.0.0" 1503 version "5.0.0"
1309 resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" 1504 resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5"
@@ -1431,7 +1626,7 @@ combined-stream@^1.0.6, combined-stream@~1.0.6:
1431 dependencies: 1626 dependencies:
1432 delayed-stream "~1.0.0" 1627 delayed-stream "~1.0.0"
1433 1628
1434commander@^2.20.0, commander@^2.7.1: 1629commander@^2.15.1, commander@^2.20.0, commander@^2.7.1:
1435 version "2.20.3" 1630 version "2.20.3"
1436 resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 1631 resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33"
1437 integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 1632 integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
@@ -1522,6 +1717,23 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0:
1522 resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" 1717 resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e"
1523 integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= 1718 integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=
1524 1719
1720consolidate@^0.15.1:
1721 version "0.15.1"
1722 resolved "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz#21ab043235c71a07d45d9aad98593b0dba56bab7"
1723 integrity sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==
1724 dependencies:
1725 bluebird "^3.1.1"
1726
1727constantinople@^3.0.1, constantinople@^3.1.2:
1728 version "3.1.2"
1729 resolved "https://registry.yarnpkg.com/constantinople/-/constantinople-3.1.2.tgz#d45ed724f57d3d10500017a7d3a889c1381ae647"
1730 integrity sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==
1731 dependencies:
1732 "@types/babel-types" "^7.0.0"
1733 "@types/babylon" "^6.16.2"
1734 babel-types "^6.26.0"
1735 babylon "^6.18.0"
1736
1525contains-path@^0.1.0: 1737contains-path@^0.1.0:
1526 version "0.1.0" 1738 version "0.1.0"
1527 resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" 1739 resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a"
@@ -1572,6 +1784,11 @@ cookiejar@^2.1.0:
1572 resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" 1784 resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c"
1573 integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== 1785 integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==
1574 1786
1787core-js@^2.4.0:
1788 version "2.6.11"
1789 resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz#38831469f9922bded8ee21c9dc46985e0399308c"
1790 integrity sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==
1791
1575core-util-is@1.0.2, core-util-is@~1.0.0: 1792core-util-is@1.0.2, core-util-is@~1.0.0:
1576 version "1.0.2" 1793 version "1.0.2"
1577 resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" 1794 resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
@@ -1585,6 +1802,14 @@ cors@^2.8.1, cors@^2.8.5:
1585 object-assign "^4" 1802 object-assign "^4"
1586 vary "^1" 1803 vary "^1"
1587 1804
1805country-language@^0.1.7:
1806 version "0.1.7"
1807 resolved "https://registry.yarnpkg.com/country-language/-/country-language-0.1.7.tgz#7870f4ba125db9a6071f19737bd9ef9343ae35db"
1808 integrity sha1-eHD0uhJduaYHHxlze9nvk0OuNds=
1809 dependencies:
1810 underscore "~1.7.0"
1811 underscore.deep "~0.5.1"
1812
1588create-error-class@^3.0.0: 1813create-error-class@^3.0.0:
1589 version "3.0.2" 1814 version "3.0.2"
1590 resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" 1815 resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6"
@@ -1657,6 +1882,21 @@ crypto-random-string@^1.0.0:
1657 resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" 1882 resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e"
1658 integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= 1883 integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=
1659 1884
1885css-select@~1.2.0:
1886 version "1.2.0"
1887 resolved "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz#2b3a110539c5355f1cd8d314623e870b121ec858"
1888 integrity sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=
1889 dependencies:
1890 boolbase "~1.0.0"
1891 css-what "2.1"
1892 domutils "1.5.1"
1893 nth-check "~1.0.1"
1894
1895css-what@2.1:
1896 version "2.1.3"
1897 resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2"
1898 integrity sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==
1899
1660cycle@1.0.x: 1900cycle@1.0.x:
1661 version "1.0.3" 1901 version "1.0.3"
1662 resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" 1902 resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2"
@@ -1682,11 +1922,31 @@ dasherize@2.0.0:
1682 resolved "https://registry.yarnpkg.com/dasherize/-/dasherize-2.0.0.tgz#6d809c9cd0cf7bb8952d80fc84fa13d47ddb1308" 1922 resolved "https://registry.yarnpkg.com/dasherize/-/dasherize-2.0.0.tgz#6d809c9cd0cf7bb8952d80fc84fa13d47ddb1308"
1683 integrity sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg= 1923 integrity sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=
1684 1924
1925datauri@^2.0.0:
1926 version "2.0.0"
1927 resolved "https://registry.yarnpkg.com/datauri/-/datauri-2.0.0.tgz#ff0ee23729935a6bcc81f301621bed3e692bf3c7"
1928 integrity sha512-zS2HSf9pI5XPlNZgIqJg/wCJpecgU/HA6E/uv2EfaWnW1EiTGLfy/EexTIsC9c99yoCOTXlqeeWk4FkCSuO3/g==
1929 dependencies:
1930 image-size "^0.7.3"
1931 mimer "^1.0.0"
1932
1685date-fns@^2.0.1: 1933date-fns@^2.0.1:
1686 version "2.11.1" 1934 version "2.11.1"
1687 resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.11.1.tgz#197b8be1bbf5c5e6fe8bea817f0fe111820e7a12" 1935 resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.11.1.tgz#197b8be1bbf5c5e6fe8bea817f0fe111820e7a12"
1688 integrity sha512-3RdUoinZ43URd2MJcquzBbDQo+J87cSzB8NkXdZiN5ia1UNyep0oCyitfiL88+R7clGTeq/RniXAc16gWyAu1w== 1936 integrity sha512-3RdUoinZ43URd2MJcquzBbDQo+J87cSzB8NkXdZiN5ia1UNyep0oCyitfiL88+R7clGTeq/RniXAc16gWyAu1w==
1689 1937
1938dayjs@^1.8.16:
1939 version "1.8.26"
1940 resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.8.26.tgz#c6d62ccdf058ca72a8d14bb93a23501058db9f1e"
1941 integrity sha512-KqtAuIfdNfZR5sJY1Dixr2Is4ZvcCqhb0dZpCOt5dGEFiMzoIbjkTSzUb4QKTCsP+WNpGwUjAFIZrnZvUxxkhw==
1942
1943debug@*, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0, debug@~4.1.1:
1944 version "4.1.1"
1945 resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
1946 integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
1947 dependencies:
1948 ms "^2.1.1"
1949
1690debug@2.6.9, debug@^2.2.0, debug@^2.6.9: 1950debug@2.6.9, debug@^2.2.0, debug@^2.6.9:
1691 version "2.6.9" 1951 version "2.6.9"
1692 resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 1952 resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
@@ -1701,13 +1961,6 @@ debug@3.2.6, debug@^3.1.0, debug@^3.2.6:
1701 dependencies: 1961 dependencies:
1702 ms "^2.1.1" 1962 ms "^2.1.1"
1703 1963
1704debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@~4.1.0, debug@~4.1.1:
1705 version "4.1.1"
1706 resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
1707 integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
1708 dependencies:
1709 ms "^2.1.1"
1710
1711debug@~3.1.0: 1964debug@~3.1.0:
1712 version "3.1.0" 1965 version "3.1.0"
1713 resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 1966 resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
@@ -1720,7 +1973,7 @@ debuglog@^1.0.0:
1720 resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" 1973 resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
1721 integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI= 1974 integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
1722 1975
1723decamelize@^1.2.0: 1976decamelize@^1.0.0, decamelize@^1.2.0:
1724 version "1.2.0" 1977 version "1.2.0"
1725 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 1978 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
1726 integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= 1979 integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
@@ -1855,6 +2108,76 @@ doctrine@^3.0.0:
1855 dependencies: 2108 dependencies:
1856 esutils "^2.0.2" 2109 esutils "^2.0.2"
1857 2110
2111doctypes@^1.1.0:
2112 version "1.1.0"
2113 resolved "https://registry.yarnpkg.com/doctypes/-/doctypes-1.1.0.tgz#ea80b106a87538774e8a3a4a5afe293de489e0a9"
2114 integrity sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk=
2115
2116dom-serializer@0, dom-serializer@^0.2.1:
2117 version "0.2.2"
2118 resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz#1afb81f533717175d478655debc5e332d9f9bb51"
2119 integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==
2120 dependencies:
2121 domelementtype "^2.0.1"
2122 entities "^2.0.0"
2123
2124dom-serializer@~0.1.0:
2125 version "0.1.1"
2126 resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.1.1.tgz#1ec4059e284babed36eec2941d4a970a189ce7c0"
2127 integrity sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==
2128 dependencies:
2129 domelementtype "^1.3.0"
2130 entities "^1.1.1"
2131
2132domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1:
2133 version "1.3.1"
2134 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f"
2135 integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
2136
2137domelementtype@^2.0.1:
2138 version "2.0.1"
2139 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d"
2140 integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==
2141
2142domhandler@^2.3.0:
2143 version "2.4.2"
2144 resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz#8805097e933d65e85546f726d60f5eb88b44f803"
2145 integrity sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==
2146 dependencies:
2147 domelementtype "1"
2148
2149domhandler@^3.0.0:
2150 version "3.0.0"
2151 resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9"
2152 integrity sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw==
2153 dependencies:
2154 domelementtype "^2.0.1"
2155
2156domutils@1.5.1:
2157 version "1.5.1"
2158 resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf"
2159 integrity sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=
2160 dependencies:
2161 dom-serializer "0"
2162 domelementtype "1"
2163
2164domutils@^1.5.1:
2165 version "1.7.0"
2166 resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz#56ea341e834e06e6748af7a1cb25da67ea9f8c2a"
2167 integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==
2168 dependencies:
2169 dom-serializer "0"
2170 domelementtype "1"
2171
2172domutils@^2.0.0:
2173 version "2.0.0"
2174 resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.0.0.tgz#15b8278e37bfa8468d157478c58c367718133c08"
2175 integrity sha512-n5SelJ1axbO636c2yUtOGia/IcJtVtlhQbFiVDBZHKV5ReJO1ViX7sFEemtuyoAnBxk5meNSYgA8V4s0271efg==
2176 dependencies:
2177 dom-serializer "^0.2.1"
2178 domelementtype "^2.0.1"
2179 domhandler "^3.0.0"
2180
1858dont-sniff-mimetype@1.1.0: 2181dont-sniff-mimetype@1.1.0:
1859 version "1.1.0" 2182 version "1.1.0"
1860 resolved "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz#c7d0427f8bcb095762751252af59d148b0a623b2" 2183 resolved "https://registry.yarnpkg.com/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz#c7d0427f8bcb095762751252af59d148b0a623b2"
@@ -1900,6 +2223,23 @@ ee-first@1.1.1:
1900 resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 2223 resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
1901 integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 2224 integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
1902 2225
2226email-templates@^7.0.4:
2227 version "7.0.4"
2228 resolved "https://registry.yarnpkg.com/email-templates/-/email-templates-7.0.4.tgz#1e1e1b360e4a91c7b9cf536716381615ba6cf1ae"
2229 integrity sha512-+s8Eav1XCF6IveHXK4lWxXdMm3XCk9eDIMX0p9simqIPW1gzR4haMpNhID2pZBQzDyY0yylW74IMB9+3Ntwjmw==
2230 dependencies:
2231 "@ladjs/i18n" "^3.0.4"
2232 "@sindresorhus/is" "^2.1.0"
2233 consolidate "^0.15.1"
2234 debug "^4.1.1"
2235 get-paths "^0.0.7"
2236 html-to-text "^5.1.1"
2237 juice "^6.0.0"
2238 lodash "^4.17.15"
2239 nodemailer "^6.4.2"
2240 pify "^5.0.0"
2241 preview-email "^2.0.1"
2242
1903emoji-regex@^7.0.1: 2243emoji-regex@^7.0.1:
1904 version "7.0.3" 2244 version "7.0.3"
1905 resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" 2245 resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156"
@@ -1922,6 +2262,11 @@ encodeurl@~1.0.2:
1922 resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 2262 resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
1923 integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 2263 integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
1924 2264
2265encoding-japanese@1.0.30:
2266 version "1.0.30"
2267 resolved "https://registry.yarnpkg.com/encoding-japanese/-/encoding-japanese-1.0.30.tgz#537c4d62881767925d601acb4c79fb14db81703a"
2268 integrity sha512-bd/DFLAoJetvv7ar/KIpE3CNO8wEuyrt9Xuw6nSMiZ+Vrz/Q21BPsMHvARL2Wz6IKHKXgb+DWZqtRg1vql9cBg==
2269
1925end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: 2270end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1:
1926 version "1.4.4" 2271 version "1.4.4"
1927 resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" 2272 resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
@@ -2009,6 +2354,16 @@ engine.io@~3.4.0:
2009 engine.io-parser "~2.2.0" 2354 engine.io-parser "~2.2.0"
2010 ws "^7.1.2" 2355 ws "^7.1.2"
2011 2356
2357entities@^1.1.1, entities@~1.1.1:
2358 version "1.1.2"
2359 resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56"
2360 integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
2361
2362entities@^2.0.0:
2363 version "2.0.0"
2364 resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.0.tgz#68d6084cab1b079767540d80e56a39b423e4abf4"
2365 integrity sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==
2366
2012env-variable@0.0.x: 2367env-variable@0.0.x:
2013 version "0.0.6" 2368 version "0.0.6"
2014 resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.6.tgz#74ab20b3786c545b62b4a4813ab8cf22726c9808" 2369 resolved "https://registry.yarnpkg.com/env-variable/-/env-variable-0.0.6.tgz#74ab20b3786c545b62b4a4813ab8cf22726c9808"
@@ -2701,6 +3056,13 @@ get-func-name@^2.0.0:
2701 resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" 3056 resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41"
2702 integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE= 3057 integrity sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=
2703 3058
3059get-paths@^0.0.7:
3060 version "0.0.7"
3061 resolved "https://registry.yarnpkg.com/get-paths/-/get-paths-0.0.7.tgz#15331086752077cf130166ccd233a1cdbeefcf38"
3062 integrity sha512-0wdJt7C1XKQxuCgouqd+ZvLJ56FQixKoki9MrFaO4EriqzXOiH9gbukaDE1ou08S8Ns3/yDzoBAISNPqj6e6tA==
3063 dependencies:
3064 pify "^4.0.1"
3065
2704get-port@^5.1.1: 3066get-port@^5.1.1:
2705 version "5.1.1" 3067 version "5.1.1"
2706 resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193" 3068 resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193"
@@ -2878,7 +3240,7 @@ hashish@~0.0.4:
2878 dependencies: 3240 dependencies:
2879 traverse ">=0.2.4" 3241 traverse ">=0.2.4"
2880 3242
2881he@1.2.0: 3243he@1.2.0, he@^1.2.0:
2882 version "1.2.0" 3244 version "1.2.0"
2883 resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 3245 resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
2884 integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 3246 integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
@@ -2948,6 +3310,38 @@ hsts@2.2.0:
2948 dependencies: 3310 dependencies:
2949 depd "2.0.0" 3311 depd "2.0.0"
2950 3312
3313html-to-text@5.1.1, html-to-text@^5.1.1:
3314 version "5.1.1"
3315 resolved "https://registry.yarnpkg.com/html-to-text/-/html-to-text-5.1.1.tgz#2d89db7bf34bc7bcb7d546b1b228991a16926e87"
3316 integrity sha512-Bci6bD/JIfZSvG4s0gW/9mMKwBRoe/1RWLxUME/d6WUSZCdY7T60bssf/jFf7EYXRyqU4P5xdClVqiYU0/ypdA==
3317 dependencies:
3318 he "^1.2.0"
3319 htmlparser2 "^3.10.1"
3320 lodash "^4.17.11"
3321 minimist "^1.2.0"
3322
3323htmlparser2@^3.10.1, htmlparser2@^3.9.1:
3324 version "3.10.1"
3325 resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz#bd679dc3f59897b6a34bb10749c855bb53a9392f"
3326 integrity sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==
3327 dependencies:
3328 domelementtype "^1.3.1"
3329 domhandler "^2.3.0"
3330 domutils "^1.5.1"
3331 entities "^1.1.1"
3332 inherits "^2.0.1"
3333 readable-stream "^3.1.1"
3334
3335htmlparser2@^4.0.0:
3336 version "4.1.0"
3337 resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78"
3338 integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==
3339 dependencies:
3340 domelementtype "^2.0.1"
3341 domhandler "^3.0.0"
3342 domutils "^2.0.0"
3343 entities "^2.0.0"
3344
2951http-errors@1.7.2: 3345http-errors@1.7.2:
2952 version "1.7.2" 3346 version "1.7.2"
2953 resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" 3347 resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f"
@@ -2997,6 +3391,25 @@ human-signals@^1.1.1:
2997 resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" 3391 resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
2998 integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== 3392 integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==
2999 3393
3394i18n-locales@^0.0.4:
3395 version "0.0.4"
3396 resolved "https://registry.yarnpkg.com/i18n-locales/-/i18n-locales-0.0.4.tgz#95d6505f6563f870f68860c23d35f82bd805cbf5"
3397 integrity sha512-aP6VjhoBwSC8uZUehHWSszqdeWiheNXp0+oLPcZY4QAktsqcouHNYQee2NQFM4KNcCTKHHbfXrRUuOxjxF2jYw==
3398 dependencies:
3399 country-language "^0.1.7"
3400
3401i18n@^0.9.1:
3402 version "0.9.1"
3403 resolved "https://registry.yarnpkg.com/i18n/-/i18n-0.9.1.tgz#a9dda09e582286c81a584374ac9f2aaef7ec37fb"
3404 integrity sha512-ERo9WloOP2inRsJzAlzn4JDm3jvX7FW1+KB/JGXTzUVzi9Bsf4LNLXUQTMgM/aze4LNW/kvmxQX6bzg5UzqMJw==
3405 dependencies:
3406 debug "*"
3407 make-plural "^6.2.1"
3408 math-interval-parser "^2.0.1"
3409 messageformat "^2.3.0"
3410 mustache "^4.0.1"
3411 sprintf-js "^1.1.2"
3412
3000i@0.3.x: 3413i@0.3.x:
3001 version "0.3.6" 3414 version "0.3.6"
3002 resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d" 3415 resolved "https://registry.yarnpkg.com/i/-/i-0.3.6.tgz#d96c92732076f072711b6b10fd7d4f65ad8ee23d"
@@ -3009,6 +3422,13 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.24:
3009 dependencies: 3422 dependencies:
3010 safer-buffer ">= 2.1.2 < 3" 3423 safer-buffer ">= 2.1.2 < 3"
3011 3424
3425iconv-lite@0.5.0:
3426 version "0.5.0"
3427 resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.5.0.tgz#59cdde0a2a297cc2aeb0c6445a195ee89f127550"
3428 integrity sha512-NnEhI9hIEKHOzJ4f697DMz9IQEXr/MMJ5w64vN2/4Ai+wRnvV7SBrL0KLoRlwaKVghOc7LQ5YkPLuX146b6Ydw==
3429 dependencies:
3430 safer-buffer ">= 2.1.2 < 3"
3431
3012ieee754@^1.1.4: 3432ieee754@^1.1.4:
3013 version "1.1.13" 3433 version "1.1.13"
3014 resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84" 3434 resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
@@ -3041,6 +3461,11 @@ ignore@^5.1.1:
3041 resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf" 3461 resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.4.tgz#84b7b3dbe64552b6ef0eca99f6743dbec6d97adf"
3042 integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A== 3462 integrity sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==
3043 3463
3464image-size@^0.7.3:
3465 version "0.7.5"
3466 resolved "https://registry.yarnpkg.com/image-size/-/image-size-0.7.5.tgz#269f357cf5797cb44683dfa99790e54c705ead04"
3467 integrity sha512-Hiyv+mXHfFEP7LzUL/llg9RwFxxY+o9N3JVLIeG5E7iFIFAalxvRU9UZthBdYDEVnzHMgjnKJPPpay5BWf1g9g==
3468
3044immediate-chunk-store@^2.0.0: 3469immediate-chunk-store@^2.0.0:
3045 version "2.1.0" 3470 version "2.1.0"
3046 resolved "https://registry.yarnpkg.com/immediate-chunk-store/-/immediate-chunk-store-2.1.0.tgz#3dbd3b5cc77182526188a8da47e38488a6627336" 3471 resolved "https://registry.yarnpkg.com/immediate-chunk-store/-/immediate-chunk-store-2.1.0.tgz#3dbd3b5cc77182526188a8da47e38488a6627336"
@@ -3192,7 +3617,7 @@ is-bluebird@^1.0.2:
3192 resolved "https://registry.yarnpkg.com/is-bluebird/-/is-bluebird-1.0.2.tgz#096439060f4aa411abee19143a84d6a55346d6e2" 3617 resolved "https://registry.yarnpkg.com/is-bluebird/-/is-bluebird-1.0.2.tgz#096439060f4aa411abee19143a84d6a55346d6e2"
3193 integrity sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI= 3618 integrity sha1-CWQ5Bg9KpBGr7hkUOoTWpVNG1uI=
3194 3619
3195is-buffer@~1.1.1: 3620is-buffer@^1.1.5, is-buffer@~1.1.1:
3196 version "1.1.6" 3621 version "1.1.6"
3197 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" 3622 resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
3198 integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 3623 integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
@@ -3226,6 +3651,14 @@ is-date-object@^1.0.1:
3226 resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" 3651 resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e"
3227 integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g== 3652 integrity sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==
3228 3653
3654is-expression@^3.0.0:
3655 version "3.0.0"
3656 resolved "https://registry.yarnpkg.com/is-expression/-/is-expression-3.0.0.tgz#39acaa6be7fd1f3471dc42c7416e61c24317ac9f"
3657 integrity sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=
3658 dependencies:
3659 acorn "~4.0.2"
3660 object-assign "^4.0.1"
3661
3229is-extglob@^2.1.1: 3662is-extglob@^2.1.1:
3230 version "2.1.1" 3663 version "2.1.1"
3231 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 3664 resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@@ -3302,6 +3735,11 @@ is-path-inside@^1.0.0:
3302 dependencies: 3735 dependencies:
3303 path-is-inside "^1.0.1" 3736 path-is-inside "^1.0.1"
3304 3737
3738is-promise@^2.0.0:
3739 version "2.2.2"
3740 resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
3741 integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
3742
3305is-promise@^2.1, is-promise@^2.1.0: 3743is-promise@^2.1, is-promise@^2.1.0:
3306 version "2.1.0" 3744 version "2.1.0"
3307 resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 3745 resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa"
@@ -3312,7 +3750,7 @@ is-redirect@^1.0.0:
3312 resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" 3750 resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24"
3313 integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= 3751 integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=
3314 3752
3315is-regex@^1.0.5: 3753is-regex@^1.0.3, is-regex@^1.0.5:
3316 version "1.0.5" 3754 version "1.0.5"
3317 resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae" 3755 resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.5.tgz#39d589a358bf18967f726967120b8fc1aed74eae"
3318 integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ== 3756 integrity sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==
@@ -3386,6 +3824,11 @@ isstream@0.1.x, isstream@~0.1.2:
3386 resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 3824 resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
3387 integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= 3825 integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
3388 3826
3827js-stringify@^1.0.1:
3828 version "1.0.2"
3829 resolved "https://registry.yarnpkg.com/js-stringify/-/js-stringify-1.0.2.tgz#1736fddfd9724f28a3682adc6230ae7e4e9679db"
3830 integrity sha1-Fzb939lyTyijaCrcYjCufk6Weds=
3831
3389js-tokens@^4.0.0: 3832js-tokens@^4.0.0:
3390 version "4.0.0" 3833 version "4.0.0"
3391 resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 3834 resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -3480,6 +3923,27 @@ jsprim@^1.2.2:
3480 json-schema "0.2.3" 3923 json-schema "0.2.3"
3481 verror "1.10.0" 3924 verror "1.10.0"
3482 3925
3926jstransformer@1.0.0:
3927 version "1.0.0"
3928 resolved "https://registry.yarnpkg.com/jstransformer/-/jstransformer-1.0.0.tgz#ed8bf0921e2f3f1ed4d5c1a44f68709ed24722c3"
3929 integrity sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=
3930 dependencies:
3931 is-promise "^2.0.0"
3932 promise "^7.0.1"
3933
3934juice@^6.0.0:
3935 version "6.0.0"
3936 resolved "https://registry.yarnpkg.com/juice/-/juice-6.0.0.tgz#cd8f8fe5210ef129d186fe2c41c0ec169f7b07b6"
3937 integrity sha512-5T3JPgXYiw6A6axsb9E09Gzq46WbfJeDirY6nMrqY55iAdqEoPDxSr1GpXqYfoyndx4ujpBPXGLzBRzbiqOOaw==
3938 dependencies:
3939 cheerio "^0.22.0"
3940 commander "^2.15.1"
3941 cross-spawn "^6.0.5"
3942 deep-extend "^0.6.0"
3943 mensch "^0.3.4"
3944 slick "^1.12.2"
3945 web-resource-inliner "^4.3.3"
3946
3483junk@^3.1.0: 3947junk@^3.1.0:
3484 version "3.1.0" 3948 version "3.1.0"
3485 resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1" 3949 resolved "https://registry.yarnpkg.com/junk/-/junk-3.1.0.tgz#31499098d902b7e98c5d9b9c80f43457a88abfa1"
@@ -3511,6 +3975,13 @@ k-rpc@^5.0.0:
3511 k-rpc-socket "^1.7.2" 3975 k-rpc-socket "^1.7.2"
3512 randombytes "^2.0.5" 3976 randombytes "^2.0.5"
3513 3977
3978kind-of@^3.0.2:
3979 version "3.2.2"
3980 resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
3981 integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=
3982 dependencies:
3983 is-buffer "^1.1.5"
3984
3514kuler@1.0.x: 3985kuler@1.0.x:
3515 version "1.0.1" 3986 version "1.0.1"
3516 resolved "https://registry.yarnpkg.com/kuler/-/kuler-1.0.1.tgz#ef7c784f36c9fb6e16dd3150d152677b2b0228a6" 3987 resolved "https://registry.yarnpkg.com/kuler/-/kuler-1.0.1.tgz#ef7c784f36c9fb6e16dd3150d152677b2b0228a6"
@@ -3530,6 +4001,11 @@ latest-version@^3.0.0:
3530 dependencies: 4001 dependencies:
3531 package-json "^4.0.0" 4002 package-json "^4.0.0"
3532 4003
4004lazy-cache@^1.0.3:
4005 version "1.0.4"
4006 resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e"
4007 integrity sha1-odePw6UEdMuAhF07O24dpJpEbo4=
4008
3533levn@^0.3.0, levn@~0.3.0: 4009levn@^0.3.0, levn@~0.3.0:
3534 version "0.3.0" 4010 version "0.3.0"
3535 resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 4011 resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee"
@@ -3538,6 +4014,26 @@ levn@^0.3.0, levn@~0.3.0:
3538 prelude-ls "~1.1.2" 4014 prelude-ls "~1.1.2"
3539 type-check "~0.3.2" 4015 type-check "~0.3.2"
3540 4016
4017libbase64@1.2.1:
4018 version "1.2.1"
4019 resolved "https://registry.yarnpkg.com/libbase64/-/libbase64-1.2.1.tgz#fb93bf4cb6d730f29b92155b6408d1bd2176a8c8"
4020 integrity sha512-l+nePcPbIG1fNlqMzrh68MLkX/gTxk/+vdvAb388Ssi7UuUN31MI44w4Yf33mM3Cm4xDfw48mdf3rkdHszLNew==
4021
4022libmime@4.2.1:
4023 version "4.2.1"
4024 resolved "https://registry.yarnpkg.com/libmime/-/libmime-4.2.1.tgz#d21aa5db88b131af18bf5a3caa1013da2c21a9dd"
4025 integrity sha512-09y7zjSc5im1aNsq815zgo4/G3DnIzym3aDOHsGq4Ee5vrX4PdgQRybAsztz9Rv0NhO+J5C0llEUloa3sUmjmA==
4026 dependencies:
4027 encoding-japanese "1.0.30"
4028 iconv-lite "0.5.0"
4029 libbase64 "1.2.1"
4030 libqp "1.1.0"
4031
4032libqp@1.1.0:
4033 version "1.1.0"
4034 resolved "https://registry.yarnpkg.com/libqp/-/libqp-1.1.0.tgz#f5e6e06ad74b794fb5b5b66988bf728ef1dedbe8"
4035 integrity sha1-9ebgatdLeU+1tbZpiL9yjvHe2+g=
4036
3541libxmljs@0.19.7: 4037libxmljs@0.19.7:
3542 version "0.19.7" 4038 version "0.19.7"
3543 resolved "https://registry.yarnpkg.com/libxmljs/-/libxmljs-0.19.7.tgz#96c2151b0b73f33dd29917edec82902587004e5a" 4039 resolved "https://registry.yarnpkg.com/libxmljs/-/libxmljs-0.19.7.tgz#96c2151b0b73f33dd29917edec82902587004e5a"
@@ -3547,6 +4043,13 @@ libxmljs@0.19.7:
3547 nan "~2.14.0" 4043 nan "~2.14.0"
3548 node-pre-gyp "~0.11.0" 4044 node-pre-gyp "~0.11.0"
3549 4045
4046linkify-it@2.2.0:
4047 version "2.2.0"
4048 resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf"
4049 integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==
4050 dependencies:
4051 uc.micro "^1.0.1"
4052
3550load-ip-set@^2.1.0: 4053load-ip-set@^2.1.0:
3551 version "2.1.0" 4054 version "2.1.0"
3552 resolved "https://registry.yarnpkg.com/load-ip-set/-/load-ip-set-2.1.0.tgz#2d50b737cae41de4e413d213991d4083a3e1784b" 4055 resolved "https://registry.yarnpkg.com/load-ip-set/-/load-ip-set-2.1.0.tgz#2d50b737cae41de4e413d213991d4083a3e1784b"
@@ -3591,16 +4094,36 @@ locate-path@^5.0.0:
3591 dependencies: 4094 dependencies:
3592 p-locate "^4.1.0" 4095 p-locate "^4.1.0"
3593 4096
3594lodash.defaults@^4.2.0: 4097lodash.assignin@^4.0.9:
4098 version "4.2.0"
4099 resolved "https://registry.yarnpkg.com/lodash.assignin/-/lodash.assignin-4.2.0.tgz#ba8df5fb841eb0a3e8044232b0e263a8dc6a28a2"
4100 integrity sha1-uo31+4QesKPoBEIysOJjqNxqKKI=
4101
4102lodash.bind@^4.1.4:
4103 version "4.2.1"
4104 resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
4105 integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=
4106
4107lodash.defaults@^4.0.1, lodash.defaults@^4.2.0:
3595 version "4.2.0" 4108 version "4.2.0"
3596 resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" 4109 resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
3597 integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= 4110 integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=
3598 4111
3599lodash.flatten@^4.4.0: 4112lodash.filter@^4.4.0:
4113 version "4.6.0"
4114 resolved "https://registry.yarnpkg.com/lodash.filter/-/lodash.filter-4.6.0.tgz#668b1d4981603ae1cc5a6fa760143e480b4c4ace"
4115 integrity sha1-ZosdSYFgOuHMWm+nYBQ+SAtMSs4=
4116
4117lodash.flatten@^4.2.0, lodash.flatten@^4.4.0:
3600 version "4.4.0" 4118 version "4.4.0"
3601 resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" 4119 resolved "https://registry.yarnpkg.com/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f"
3602 integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= 4120 integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=
3603 4121
4122lodash.foreach@^4.3.0:
4123 version "4.5.0"
4124 resolved "https://registry.yarnpkg.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
4125 integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=
4126
3604lodash.get@^4.4.2: 4127lodash.get@^4.4.2:
3605 version "4.4.2" 4128 version "4.4.2"
3606 resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" 4129 resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
@@ -3611,7 +4134,42 @@ lodash.isequal@^4.5.0:
3611 resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" 4134 resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
3612 integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA= 4135 integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
3613 4136
3614lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15: 4137lodash.map@^4.4.0:
4138 version "4.6.0"
4139 resolved "https://registry.yarnpkg.com/lodash.map/-/lodash.map-4.6.0.tgz#771ec7839e3473d9c4cde28b19394c3562f4f6d3"
4140 integrity sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=
4141
4142lodash.merge@^4.4.0:
4143 version "4.6.2"
4144 resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
4145 integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
4146
4147lodash.pick@^4.2.1:
4148 version "4.4.0"
4149 resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3"
4150 integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM=
4151
4152lodash.reduce@^4.4.0:
4153 version "4.6.0"
4154 resolved "https://registry.yarnpkg.com/lodash.reduce/-/lodash.reduce-4.6.0.tgz#f1ab6b839299ad48f784abbf476596f03b914d3b"
4155 integrity sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=
4156
4157lodash.reject@^4.4.0:
4158 version "4.6.0"
4159 resolved "https://registry.yarnpkg.com/lodash.reject/-/lodash.reject-4.6.0.tgz#80d6492dc1470864bbf583533b651f42a9f52415"
4160 integrity sha1-gNZJLcFHCGS79YNTO2UfQqn1JBU=
4161
4162lodash.some@^4.4.0:
4163 version "4.6.0"
4164 resolved "https://registry.yarnpkg.com/lodash.some/-/lodash.some-4.6.0.tgz#1bb9f314ef6b8baded13b549169b2a945eb68e4d"
4165 integrity sha1-G7nzFO9ri63tE7VJFpsqlF62jk0=
4166
4167lodash.unescape@^4.0.1:
4168 version "4.0.1"
4169 resolved "https://registry.yarnpkg.com/lodash.unescape/-/lodash.unescape-4.0.1.tgz#bf2249886ce514cda112fae9218cdc065211fc9c"
4170 integrity sha1-vyJJiGzlFM2hEvrpIYzcBlIR/Jw=
4171
4172lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4:
3615 version "4.17.15" 4173 version "4.17.15"
3616 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 4174 resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
3617 integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== 4175 integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==
@@ -3634,6 +4192,11 @@ logform@^2.1.1:
3634 ms "^2.1.1" 4192 ms "^2.1.1"
3635 triple-beam "^1.3.0" 4193 triple-beam "^1.3.0"
3636 4194
4195longest@^1.0.1:
4196 version "1.0.1"
4197 resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097"
4198 integrity sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=
4199
3637lowercase-keys@^1.0.0: 4200lowercase-keys@^1.0.0:
3638 version "1.0.1" 4201 version "1.0.1"
3639 resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" 4202 resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
@@ -3703,6 +4266,30 @@ mailparser-mit@^1.0.0:
3703 mime "^1.6.0" 4266 mime "^1.6.0"
3704 uue "^3.1.0" 4267 uue "^3.1.0"
3705 4268
4269mailparser@^2.7.7:
4270 version "2.7.7"
4271 resolved "https://registry.yarnpkg.com/mailparser/-/mailparser-2.7.7.tgz#7d3fe616797427629c59992a34d84820d550676b"
4272 integrity sha512-FcVkXYm+zIg59HNPINGQw99eMTvcAkmQZHmabF8aSeMZ6/vWkx0HdT6FpXApelfe5IKRk6nWEg+YAuuXZl9+Fg==
4273 dependencies:
4274 encoding-japanese "1.0.30"
4275 he "1.2.0"
4276 html-to-text "5.1.1"
4277 iconv-lite "0.5.0"
4278 libmime "4.2.1"
4279 linkify-it "2.2.0"
4280 mailsplit "4.6.2"
4281 nodemailer "6.4.0"
4282 tlds "1.207.0"
4283
4284mailsplit@4.6.2:
4285 version "4.6.2"
4286 resolved "https://registry.yarnpkg.com/mailsplit/-/mailsplit-4.6.2.tgz#ce622cea460406035ff9f7d493ed00ea52a27aaa"
4287 integrity sha512-7Bw2R0QfORXexGGQCEK64EeShHacUNyU5kV5F5sj4jPQB3ITe2v9KRqxD40wpuue6W/sBJlSNBZ0AypIeTGQMQ==
4288 dependencies:
4289 libbase64 "1.2.1"
4290 libmime "4.2.1"
4291 libqp "1.1.0"
4292
3706make-dir@^1.0.0: 4293make-dir@^1.0.0:
3707 version "1.3.0" 4294 version "1.3.0"
3708 resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" 4295 resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
@@ -3715,6 +4302,18 @@ make-error@^1.1.1:
3715 resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 4302 resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
3716 integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 4303 integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
3717 4304
4305make-plural@^4.3.0:
4306 version "4.3.0"
4307 resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-4.3.0.tgz#f23de08efdb0cac2e0c9ba9f315b0dff6b4c2735"
4308 integrity sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==
4309 optionalDependencies:
4310 minimist "^1.2.0"
4311
4312make-plural@^6.2.1:
4313 version "6.2.1"
4314 resolved "https://registry.yarnpkg.com/make-plural/-/make-plural-6.2.1.tgz#2790af1d05fb2fc35a111ce759ffdb0aca1339a3"
4315 integrity sha512-AmkruwJ9EjvyTv6AM8MBMK3TAeOJvhgTv5YQXzF0EP2qawhpvMjDpHvsdOIIT0Vn+BB0+IogmYZ1z+Ulm/m0Fg==
4316
3718marked-man@^0.7.0: 4317marked-man@^0.7.0:
3719 version "0.7.0" 4318 version "0.7.0"
3720 resolved "https://registry.yarnpkg.com/marked-man/-/marked-man-0.7.0.tgz#220ba01d275d16f1a98e4e7fc3c5eac0630c68e4" 4319 resolved "https://registry.yarnpkg.com/marked-man/-/marked-man-0.7.0.tgz#220ba01d275d16f1a98e4e7fc3c5eac0630c68e4"
@@ -3725,6 +4324,11 @@ marked@^0.8.0:
3725 resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.2.tgz#4faad28d26ede351a7a1aaa5fec67915c869e355" 4324 resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.2.tgz#4faad28d26ede351a7a1aaa5fec67915c869e355"
3726 integrity sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw== 4325 integrity sha512-EGwzEeCcLniFX51DhTpmTom+dSA/MG/OBUDjnWtHbEnjAH180VzUeAw+oE4+Zv+CoYBWyRlYOTR0N8SO9R1PVw==
3727 4326
4327math-interval-parser@^2.0.1:
4328 version "2.0.1"
4329 resolved "https://registry.yarnpkg.com/math-interval-parser/-/math-interval-parser-2.0.1.tgz#e22cd6d15a0a7f4c03aec560db76513da615bed4"
4330 integrity sha512-VmlAmb0UJwlvMyx8iPhXUDnVW1F9IrGEd9CIOmv+XL8AErCUUuozoDMrgImvnYt2A+53qVX/tPW6YJurMKYsvA==
4331
3728md5@^2.2.1: 4332md5@^2.2.1:
3729 version "2.2.1" 4333 version "2.2.1"
3730 resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9" 4334 resolved "https://registry.yarnpkg.com/md5/-/md5-2.2.1.tgz#53ab38d5fe3c8891ba465329ea23fac0540126f9"
@@ -3767,6 +4371,11 @@ memory-chunk-store@^1.2.0:
3767 resolved "https://registry.yarnpkg.com/memory-chunk-store/-/memory-chunk-store-1.3.0.tgz#ae99e7e3b58b52db43d49d94722930d39459d0c4" 4371 resolved "https://registry.yarnpkg.com/memory-chunk-store/-/memory-chunk-store-1.3.0.tgz#ae99e7e3b58b52db43d49d94722930d39459d0c4"
3768 integrity sha512-6LsOpHKKhxYrLhHmOJdBCUtSO7op5rUs1pag0fhjHo0QiXRyna0bwYf4EmQuL7InUeF2J7dUMPr6VMogRyf9NA== 4372 integrity sha512-6LsOpHKKhxYrLhHmOJdBCUtSO7op5rUs1pag0fhjHo0QiXRyna0bwYf4EmQuL7InUeF2J7dUMPr6VMogRyf9NA==
3769 4373
4374mensch@^0.3.4:
4375 version "0.3.4"
4376 resolved "https://registry.yarnpkg.com/mensch/-/mensch-0.3.4.tgz#770f91b46cb16ea5b204ee735768c3f0c491fecd"
4377 integrity sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==
4378
3770merge-descriptors@1.0.1: 4379merge-descriptors@1.0.1:
3771 version "1.0.1" 4380 version "1.0.1"
3772 resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 4381 resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61"
@@ -3777,6 +4386,25 @@ merge-stream@^2.0.0:
3777 resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" 4386 resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
3778 integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== 4387 integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
3779 4388
4389messageformat-formatters@^2.0.1:
4390 version "2.0.1"
4391 resolved "https://registry.yarnpkg.com/messageformat-formatters/-/messageformat-formatters-2.0.1.tgz#0492c1402a48775f751c9b17c0354e92be012b08"
4392 integrity sha512-E/lQRXhtHwGuiQjI7qxkLp8AHbMD5r2217XNe/SREbBlSawe0lOqsFb7rflZJmlQFSULNLIqlcjjsCPlB3m3Mg==
4393
4394messageformat-parser@^4.1.2:
4395 version "4.1.3"
4396 resolved "https://registry.yarnpkg.com/messageformat-parser/-/messageformat-parser-4.1.3.tgz#b824787f57fcda7d50769f5b63e8d4fda68f5b9e"
4397 integrity sha512-2fU3XDCanRqeOCkn7R5zW5VQHWf+T3hH65SzuqRvjatBK7r4uyFa5mEX+k6F9Bd04LVM5G4/BHBTUJsOdW7uyg==
4398
4399messageformat@^2.3.0:
4400 version "2.3.0"
4401 resolved "https://registry.yarnpkg.com/messageformat/-/messageformat-2.3.0.tgz#de263c49029d5eae65d7ee25e0754f57f425ad91"
4402 integrity sha512-uTzvsv0lTeQxYI2y1NPa1lItL5VRI8Gb93Y2K2ue5gBPyrbJxfDi/EYWxh2PKv5yO42AJeeqblS9MJSh/IEk4w==
4403 dependencies:
4404 make-plural "^4.3.0"
4405 messageformat-formatters "^2.0.1"
4406 messageformat-parser "^4.1.2"
4407
3780methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: 4408methods@^1.1.1, methods@^1.1.2, methods@~1.1.2:
3781 version "1.1.2" 4409 version "1.1.2"
3782 resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 4410 resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
@@ -3804,6 +4432,11 @@ mime@^2.4.0:
3804 resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" 4432 resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5"
3805 integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== 4433 integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==
3806 4434
4435mimer@^1.0.0:
4436 version "1.1.0"
4437 resolved "https://registry.yarnpkg.com/mimer/-/mimer-1.1.0.tgz#2cb67f7093998e772a0e62c090f77daa1b8a2dbe"
4438 integrity sha512-y9dVfy2uiycQvDNiAYW6zp49ZhFlXDMr5wfdOiMbdzGM/0N5LNR6HTUn3un+WUQcM0koaw8FMTG1bt5EnHJdvQ==
4439
3807mimic-fn@^2.1.0: 4440mimic-fn@^2.1.0:
3808 version "2.1.0" 4441 version "2.1.0"
3809 resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" 4442 resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
@@ -3988,6 +4621,17 @@ multer@^1.1.0:
3988 type-is "^1.6.4" 4621 type-is "^1.6.4"
3989 xtend "^4.0.0" 4622 xtend "^4.0.0"
3990 4623
4624multimatch@^4.0.0:
4625 version "4.0.0"
4626 resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-4.0.0.tgz#8c3c0f6e3e8449ada0af3dd29efb491a375191b3"
4627 integrity sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==
4628 dependencies:
4629 "@types/minimatch" "^3.0.3"
4630 array-differ "^3.0.0"
4631 array-union "^2.1.0"
4632 arrify "^2.0.1"
4633 minimatch "^3.0.4"
4634
3991multistream@^4.0.0: 4635multistream@^4.0.0:
3992 version "4.0.0" 4636 version "4.0.0"
3993 resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.0.0.tgz#c771b6d17d169138b6abcb15f0061170e3c09cea" 4637 resolved "https://registry.yarnpkg.com/multistream/-/multistream-4.0.0.tgz#c771b6d17d169138b6abcb15f0061170e3c09cea"
@@ -3995,6 +4639,11 @@ multistream@^4.0.0:
3995 dependencies: 4639 dependencies:
3996 readable-stream "^3.4.0" 4640 readable-stream "^3.4.0"
3997 4641
4642mustache@^4.0.1:
4643 version "4.0.1"
4644 resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.0.1.tgz#d99beb031701ad433338e7ea65e0489416c854a2"
4645 integrity sha512-yL5VE97+OXn4+Er3THSmTdCFCtx5hHWzrolvH+JObZnUYwuaG7XV+Ch4fR2cIrcYI0tFHxS7iyFYl14bW8y2sA==
4646
3998mute-stream@0.0.8, mute-stream@~0.0.4: 4647mute-stream@0.0.8, mute-stream@~0.0.4:
3999 version "0.0.8" 4648 version "0.0.8"
4000 resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" 4649 resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
@@ -4131,12 +4780,17 @@ nodemailer@5.0.0:
4131 resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-5.0.0.tgz#bcb409eca613114e85de42646d0ce7f1fa70b716" 4780 resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-5.0.0.tgz#bcb409eca613114e85de42646d0ce7f1fa70b716"
4132 integrity sha512-XI4PI5L7GYcJyHkPcHlvPyRrYohNYBNRNbt1tU8PXNU3E1ADJC84a13V0vbL9AM431OP+ETacaGXAF8fGn1JvA== 4781 integrity sha512-XI4PI5L7GYcJyHkPcHlvPyRrYohNYBNRNbt1tU8PXNU3E1ADJC84a13V0vbL9AM431OP+ETacaGXAF8fGn1JvA==
4133 4782
4783nodemailer@6.4.0:
4784 version "6.4.0"
4785 resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.4.0.tgz#91482ebc09d39156d933eb9e6159642cd27bf02c"
4786 integrity sha512-UBqPOfQGD1cM3HnjhuQe+0u3DWx47WWK7lBjG5UtPnGOysr7oDK5lNCzcjK6zzeBSdTk4m1tGx1xNbWFZQmMNA==
4787
4134nodemailer@^3.1.1: 4788nodemailer@^3.1.1:
4135 version "3.1.8" 4789 version "3.1.8"
4136 resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-3.1.8.tgz#febfaccb4bd273678473a309c6cb4b4a2f3c48e3" 4790 resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-3.1.8.tgz#febfaccb4bd273678473a309c6cb4b4a2f3c48e3"
4137 integrity sha1-/r+sy0vSc2eEc6MJxstLSi88SOM= 4791 integrity sha1-/r+sy0vSc2eEc6MJxstLSi88SOM=
4138 4792
4139nodemailer@^6.0.0: 4793nodemailer@^6.0.0, nodemailer@^6.3.1, nodemailer@^6.4.2:
4140 version "6.4.6" 4794 version "6.4.6"
4141 resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.4.6.tgz#d37f504f6560b36616f646a606894fe18819107f" 4795 resolved "https://registry.yarnpkg.com/nodemailer/-/nodemailer-6.4.6.tgz#d37f504f6560b36616f646a606894fe18819107f"
4142 integrity sha512-/kJ+FYVEm2HuUlw87hjSqTss+GU35D4giOpdSfGp7DO+5h6RlJj7R94YaYHOkoxu1CSaM0d3WRBtCzwXrY6MKA== 4796 integrity sha512-/kJ+FYVEm2HuUlw87hjSqTss+GU35D4giOpdSfGp7DO+5h6RlJj7R94YaYHOkoxu1CSaM0d3WRBtCzwXrY6MKA==
@@ -4237,6 +4891,13 @@ npmlog@^4.0.1, npmlog@^4.0.2, npmlog@^4.1.2:
4237 gauge "~2.7.3" 4891 gauge "~2.7.3"
4238 set-blocking "~2.0.0" 4892 set-blocking "~2.0.0"
4239 4893
4894nth-check@~1.0.1:
4895 version "1.0.2"
4896 resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz#b2bd295c37e3dd58a3bf0700376663ba4d9cf05c"
4897 integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==
4898 dependencies:
4899 boolbase "~1.0.0"
4900
4240number-is-nan@^1.0.0: 4901number-is-nan@^1.0.0:
4241 version "1.0.1" 4902 version "1.0.1"
4242 resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 4903 resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
@@ -4259,7 +4920,7 @@ oauth2-server@3.0.0, oauth2-server@3.1.0-beta.1, oauth2-server@^3.1.0-beta.1:
4259 statuses "^1.5.0" 4920 statuses "^1.5.0"
4260 type-is "^1.6.16" 4921 type-is "^1.6.16"
4261 4922
4262object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: 4923object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
4263 version "4.1.1" 4924 version "4.1.1"
4264 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 4925 resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
4265 integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 4926 integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
@@ -4348,6 +5009,13 @@ onetime@^5.1.0:
4348 dependencies: 5009 dependencies:
4349 mimic-fn "^2.1.0" 5010 mimic-fn "^2.1.0"
4350 5011
5012open@^6.4.0:
5013 version "6.4.0"
5014 resolved "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz#5c13e96d0dc894686164f18965ecfe889ecfc8a9"
5015 integrity sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==
5016 dependencies:
5017 is-wsl "^1.1.0"
5018
4351openapi-types@^1.3.5: 5019openapi-types@^1.3.5:
4352 version "1.3.5" 5020 version "1.3.5"
4353 resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-1.3.5.tgz#6718cfbc857fe6c6f1471f65b32bdebb9c10ce40" 5021 resolved "https://registry.yarnpkg.com/openapi-types/-/openapi-types-1.3.5.tgz#6718cfbc857fe6c6f1471f65b32bdebb9c10ce40"
@@ -4695,6 +5363,16 @@ pify@^3.0.0:
4695 resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 5363 resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
4696 integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= 5364 integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
4697 5365
5366pify@^4.0.1:
5367 version "4.0.1"
5368 resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
5369 integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
5370
5371pify@^5.0.0:
5372 version "5.0.0"
5373 resolved "https://registry.yarnpkg.com/pify/-/pify-5.0.0.tgz#1f5eca3f5e87ebec28cc6d54a0e4aaf00acc127f"
5374 integrity sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==
5375
4698pkg-dir@^2.0.0: 5376pkg-dir@^2.0.0:
4699 version "2.0.0" 5377 version "2.0.0"
4700 resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" 5378 resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b"
@@ -4765,6 +5443,21 @@ prepend-http@^1.0.1:
4765 resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" 5443 resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc"
4766 integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= 5444 integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=
4767 5445
5446preview-email@^2.0.1:
5447 version "2.0.1"
5448 resolved "https://registry.yarnpkg.com/preview-email/-/preview-email-2.0.1.tgz#da237848702778b5a2dca38ed5963aa854c1ac3e"
5449 integrity sha512-KXmv0oKonf9slHXjZ1O+QvGsq7IKJs3IINB4b8XWZ3IwONyGiGqpXthCrTZuDzhLG1kPn6FKOOikdm21bturcQ==
5450 dependencies:
5451 "@babel/runtime" "^7.6.3"
5452 dayjs "^1.8.16"
5453 debug "^4.1.1"
5454 mailparser "^2.7.7"
5455 nodemailer "^6.3.1"
5456 open "^6.4.0"
5457 pify "^4.0.1"
5458 pug "^2.0.4"
5459 uuid "^3.3.3"
5460
4768process-nextick-args@~2.0.0: 5461process-nextick-args@~2.0.0:
4769 version "2.0.1" 5462 version "2.0.1"
4770 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 5463 resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
@@ -4784,6 +5477,13 @@ promise.prototype.finally@^3.1.2:
4784 es-abstract "^1.17.0-next.0" 5477 es-abstract "^1.17.0-next.0"
4785 function-bind "^1.1.1" 5478 function-bind "^1.1.1"
4786 5479
5480promise@^7.0.1:
5481 version "7.3.1"
5482 resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf"
5483 integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==
5484 dependencies:
5485 asap "~2.0.3"
5486
4787promisify-any@^2.0.1: 5487promisify-any@^2.0.1:
4788 version "2.0.1" 5488 version "2.0.1"
4789 resolved "https://registry.yarnpkg.com/promisify-any/-/promisify-any-2.0.1.tgz#403e00a8813f175242ab50fe33a69f8eece47305" 5489 resolved "https://registry.yarnpkg.com/promisify-any/-/promisify-any-2.0.1.tgz#403e00a8813f175242ab50fe33a69f8eece47305"
@@ -4828,6 +5528,111 @@ pstree.remy@^1.1.7:
4828 resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3" 5528 resolved "https://registry.yarnpkg.com/pstree.remy/-/pstree.remy-1.1.7.tgz#c76963a28047ed61542dc361aa26ee55a7fa15f3"
4829 integrity sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A== 5529 integrity sha512-xsMgrUwRpuGskEzBFkH8NmTimbZ5PcPup0LA8JJkHIm2IMUbQcpo3yeLNWVrufEYjh8YwtSVh0xz6UeWc5Oh5A==
4830 5530
5531pug-attrs@^2.0.4:
5532 version "2.0.4"
5533 resolved "https://registry.yarnpkg.com/pug-attrs/-/pug-attrs-2.0.4.tgz#b2f44c439e4eb4ad5d4ef25cac20d18ad28cc336"
5534 integrity sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==
5535 dependencies:
5536 constantinople "^3.0.1"
5537 js-stringify "^1.0.1"
5538 pug-runtime "^2.0.5"
5539
5540pug-code-gen@^2.0.2:
5541 version "2.0.2"
5542 resolved "https://registry.yarnpkg.com/pug-code-gen/-/pug-code-gen-2.0.2.tgz#ad0967162aea077dcf787838d94ed14acb0217c2"
5543 integrity sha512-kROFWv/AHx/9CRgoGJeRSm+4mLWchbgpRzTEn8XCiwwOy6Vh0gAClS8Vh5TEJ9DBjaP8wCjS3J6HKsEsYdvaCw==
5544 dependencies:
5545 constantinople "^3.1.2"
5546 doctypes "^1.1.0"
5547 js-stringify "^1.0.1"
5548 pug-attrs "^2.0.4"
5549 pug-error "^1.3.3"
5550 pug-runtime "^2.0.5"
5551 void-elements "^2.0.1"
5552 with "^5.0.0"
5553
5554pug-error@^1.3.3:
5555 version "1.3.3"
5556 resolved "https://registry.yarnpkg.com/pug-error/-/pug-error-1.3.3.tgz#f342fb008752d58034c185de03602dd9ffe15fa6"
5557 integrity sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==
5558
5559pug-filters@^3.1.1:
5560 version "3.1.1"
5561 resolved "https://registry.yarnpkg.com/pug-filters/-/pug-filters-3.1.1.tgz#ab2cc82db9eeccf578bda89130e252a0db026aa7"
5562 integrity sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==
5563 dependencies:
5564 clean-css "^4.1.11"
5565 constantinople "^3.0.1"
5566 jstransformer "1.0.0"
5567 pug-error "^1.3.3"
5568 pug-walk "^1.1.8"
5569 resolve "^1.1.6"
5570 uglify-js "^2.6.1"
5571
5572pug-lexer@^4.1.0:
5573 version "4.1.0"
5574 resolved "https://registry.yarnpkg.com/pug-lexer/-/pug-lexer-4.1.0.tgz#531cde48c7c0b1fcbbc2b85485c8665e31489cfd"
5575 integrity sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==
5576 dependencies:
5577 character-parser "^2.1.1"
5578 is-expression "^3.0.0"
5579 pug-error "^1.3.3"
5580
5581pug-linker@^3.0.6:
5582 version "3.0.6"
5583 resolved "https://registry.yarnpkg.com/pug-linker/-/pug-linker-3.0.6.tgz#f5bf218b0efd65ce6670f7afc51658d0f82989fb"
5584 integrity sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==
5585 dependencies:
5586 pug-error "^1.3.3"
5587 pug-walk "^1.1.8"
5588
5589pug-load@^2.0.12:
5590 version "2.0.12"
5591 resolved "https://registry.yarnpkg.com/pug-load/-/pug-load-2.0.12.tgz#d38c85eb85f6e2f704dea14dcca94144d35d3e7b"
5592 integrity sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==
5593 dependencies:
5594 object-assign "^4.1.0"
5595 pug-walk "^1.1.8"
5596
5597pug-parser@^5.0.1:
5598 version "5.0.1"
5599 resolved "https://registry.yarnpkg.com/pug-parser/-/pug-parser-5.0.1.tgz#03e7ada48b6840bd3822f867d7d90f842d0ffdc9"
5600 integrity sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==
5601 dependencies:
5602 pug-error "^1.3.3"
5603 token-stream "0.0.1"
5604
5605pug-runtime@^2.0.5:
5606 version "2.0.5"
5607 resolved "https://registry.yarnpkg.com/pug-runtime/-/pug-runtime-2.0.5.tgz#6da7976c36bf22f68e733c359240d8ae7a32953a"
5608 integrity sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==
5609
5610pug-strip-comments@^1.0.4:
5611 version "1.0.4"
5612 resolved "https://registry.yarnpkg.com/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz#cc1b6de1f6e8f5931cf02ec66cdffd3f50eaf8a8"
5613 integrity sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==
5614 dependencies:
5615 pug-error "^1.3.3"
5616
5617pug-walk@^1.1.8:
5618 version "1.1.8"
5619 resolved "https://registry.yarnpkg.com/pug-walk/-/pug-walk-1.1.8.tgz#b408f67f27912f8c21da2f45b7230c4bd2a5ea7a"
5620 integrity sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==
5621
5622pug@^2.0.4:
5623 version "2.0.4"
5624 resolved "https://registry.yarnpkg.com/pug/-/pug-2.0.4.tgz#ee7682ec0a60494b38d48a88f05f3b0ac931377d"
5625 integrity sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==
5626 dependencies:
5627 pug-code-gen "^2.0.2"
5628 pug-filters "^3.1.1"
5629 pug-lexer "^4.1.0"
5630 pug-linker "^3.0.6"
5631 pug-load "^2.0.12"
5632 pug-parser "^5.0.1"
5633 pug-runtime "^2.0.5"
5634 pug-strip-comments "^1.0.4"
5635
4831pump@^2.0.0: 5636pump@^2.0.0:
4832 version "2.0.1" 5637 version "2.0.1"
4833 resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909" 5638 resolved "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz#12399add6e4cf7526d973cbc8b5ce2e2908b3909"
@@ -4868,6 +5673,11 @@ qs@^6.5.1:
4868 resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" 5673 resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e"
4869 integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== 5674 integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw==
4870 5675
5676qs@^6.9.1:
5677 version "6.9.4"
5678 resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
5679 integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==
5680
4871qs@~6.5.2: 5681qs@~6.5.2:
4872 version "6.5.2" 5682 version "6.5.2"
4873 resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 5683 resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
@@ -5083,6 +5893,16 @@ reflect-metadata@^0.1.12:
5083 resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08" 5893 resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.13.tgz#67ae3ca57c972a2aa1642b10fe363fe32d49dc08"
5084 integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg== 5894 integrity sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==
5085 5895
5896regenerator-runtime@^0.11.0:
5897 version "0.11.1"
5898 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
5899 integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
5900
5901regenerator-runtime@^0.13.4:
5902 version "0.13.5"
5903 resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz#d878a1d094b4306d10b9096484b33ebd55e26697"
5904 integrity sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==
5905
5086regexpp@^2.0.1: 5906regexpp@^2.0.1:
5087 version "2.0.1" 5907 version "2.0.1"
5088 resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 5908 resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
@@ -5119,6 +5939,11 @@ render-media@^3.0.0:
5119 stream-to-blob-url "^3.0.0" 5939 stream-to-blob-url "^3.0.0"
5120 videostream "^3.2.0" 5940 videostream "^3.2.0"
5121 5941
5942repeat-string@^1.5.2:
5943 version "1.6.1"
5944 resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637"
5945 integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc=
5946
5122request@^2.81.0, request@^2.88.0, request@~2.88.0: 5947request@^2.81.0, request@^2.88.0, request@~2.88.0:
5123 version "2.88.2" 5948 version "2.88.2"
5124 resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" 5949 resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
@@ -5172,6 +5997,13 @@ resolve-pkg@^1.0.0:
5172 dependencies: 5997 dependencies:
5173 resolve-from "^2.0.0" 5998 resolve-from "^2.0.0"
5174 5999
6000resolve@^1.1.6:
6001 version "1.17.0"
6002 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz#b25941b54968231cc2d1bb76a79cb7f2c0bf8444"
6003 integrity sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==
6004 dependencies:
6005 path-parse "^1.0.6"
6006
5175resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1: 6007resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1:
5176 version "1.15.1" 6008 version "1.15.1"
5177 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8" 6009 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8"
@@ -5199,6 +6031,13 @@ revalidator@0.1.x:
5199 resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" 6031 resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b"
5200 integrity sha1-/s5hv6DBtSoga9axgZgYS91SOjs= 6032 integrity sha1-/s5hv6DBtSoga9axgZgYS91SOjs=
5201 6033
6034right-align@^0.1.1:
6035 version "0.1.3"
6036 resolved "https://registry.yarnpkg.com/right-align/-/right-align-0.1.3.tgz#61339b722fe6a3515689210d24e14c96148613ef"
6037 integrity sha1-YTObci/mo1FWiSENJOFMlhSGE+8=
6038 dependencies:
6039 align-text "^0.1.1"
6040
5202rimraf@2.6.3: 6041rimraf@2.6.3:
5203 version "2.6.3" 6042 version "2.6.3"
5204 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" 6043 resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
@@ -5264,7 +6103,7 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2,
5264 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519" 6103 resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.0.tgz#b74daec49b1148f88c64b68d49b1e815c1f2f519"
5265 integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg== 6104 integrity sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==
5266 6105
5267"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: 6106"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@^2.1.2, safer-buffer@~2.1.0:
5268 version "2.1.2" 6107 version "2.1.2"
5269 resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 6108 resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
5270 integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 6109 integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
@@ -5502,6 +6341,11 @@ slice-ansi@^2.1.0:
5502 astral-regex "^1.0.0" 6341 astral-regex "^1.0.0"
5503 is-fullwidth-code-point "^2.0.0" 6342 is-fullwidth-code-point "^2.0.0"
5504 6343
6344slick@^1.12.2:
6345 version "1.12.2"
6346 resolved "https://registry.yarnpkg.com/slick/-/slick-1.12.2.tgz#bd048ddb74de7d1ca6915faa4a57570b3550c2d7"
6347 integrity sha1-vQSN23TefRymkV+qSldXCzVQwtc=
6348
5505smtp-connection@4.0.2: 6349smtp-connection@4.0.2:
5506 version "4.0.2" 6350 version "4.0.2"
5507 resolved "https://registry.yarnpkg.com/smtp-connection/-/smtp-connection-4.0.2.tgz#d9dd68d38569f3ad9265473670d09d8f3ea518db" 6351 resolved "https://registry.yarnpkg.com/smtp-connection/-/smtp-connection-4.0.2.tgz#d9dd68d38569f3ad9265473670d09d8f3ea518db"
@@ -5613,11 +6457,16 @@ source-map-support@^0.5.0, source-map-support@^0.5.6:
5613 buffer-from "^1.0.0" 6457 buffer-from "^1.0.0"
5614 source-map "^0.6.0" 6458 source-map "^0.6.0"
5615 6459
5616source-map@^0.6.0: 6460source-map@^0.6.0, source-map@~0.6.0:
5617 version "0.6.1" 6461 version "0.6.1"
5618 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 6462 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
5619 integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 6463 integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
5620 6464
6465source-map@~0.5.1:
6466 version "0.5.7"
6467 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
6468 integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
6469
5621spawn-command@^0.0.2-1: 6470spawn-command@^0.0.2-1:
5622 version "0.0.2-1" 6471 version "0.0.2-1"
5623 resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0" 6472 resolved "https://registry.yarnpkg.com/spawn-command/-/spawn-command-0.0.2-1.tgz#62f5e9466981c1b796dc5929937e11c9c6921bd0"
@@ -5668,6 +6517,11 @@ split@^1.0.0:
5668 dependencies: 6517 dependencies:
5669 through "2" 6518 through "2"
5670 6519
6520sprintf-js@^1.1.2:
6521 version "1.1.2"
6522 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673"
6523 integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==
6524
5671sprintf-js@~1.0.2: 6525sprintf-js@~1.0.2:
5672 version "1.0.3" 6526 version "1.0.3"
5673 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 6527 resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
@@ -6096,6 +6950,16 @@ timers-ext@^0.1.5:
6096 es5-ext "~0.10.46" 6950 es5-ext "~0.10.46"
6097 next-tick "1" 6951 next-tick "1"
6098 6952
6953titleize@^2.1.0:
6954 version "2.1.0"
6955 resolved "https://registry.yarnpkg.com/titleize/-/titleize-2.1.0.tgz#5530de07c22147a0488887172b5bd94f5b30a48f"
6956 integrity sha512-m+apkYlfiQTKLW+sI4vqUkwMEzfgEUEYSqljx1voUE3Wz/z1ZsxyzSxvH2X8uKVrOp7QkByWt0rA6+gvhCKy6g==
6957
6958tlds@1.207.0:
6959 version "1.207.0"
6960 resolved "https://registry.yarnpkg.com/tlds/-/tlds-1.207.0.tgz#459264e644cf63ddc0965fece3898913286b1afd"
6961 integrity sha512-k7d7Q1LqjtAvhtEOs3yN14EabsNO8ZCoY6RESSJDB9lst3bTx3as/m1UuAeCKzYxiyhR1qq72ZPhpSf+qlqiwg==
6962
6099tmp@0.0.x, tmp@^0.0.33: 6963tmp@0.0.x, tmp@^0.0.33:
6100 version "0.0.33" 6964 version "0.0.33"
6101 resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 6965 resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9"
@@ -6113,6 +6977,11 @@ to-arraybuffer@^1.0.1:
6113 resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" 6977 resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43"
6114 integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M= 6978 integrity sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=
6115 6979
6980to-fast-properties@^1.0.3:
6981 version "1.0.3"
6982 resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
6983 integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
6984
6116to-regex-range@^5.0.1: 6985to-regex-range@^5.0.1:
6117 version "5.0.1" 6986 version "5.0.1"
6118 resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 6987 resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
@@ -6136,6 +7005,11 @@ toidentifier@1.0.0:
6136 resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" 7005 resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
6137 integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw== 7006 integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
6138 7007
7008token-stream@0.0.1:
7009 version "0.0.1"
7010 resolved "https://registry.yarnpkg.com/token-stream/-/token-stream-0.0.1.tgz#ceeefc717a76c4316f126d0b9dbaa55d7e7df01a"
7011 integrity sha1-zu78cXp2xDFvEm0LnbqlXX598Bo=
7012
6139toposort-class@^1.0.1: 7013toposort-class@^1.0.1:
6140 version "1.0.1" 7014 version "1.0.1"
6141 resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988" 7015 resolved "https://registry.yarnpkg.com/toposort-class/-/toposort-class-1.0.1.tgz#7ffd1f78c8be28c3ba45cd4e1a3f5ee193bd9988"
@@ -6298,6 +7172,26 @@ typescript@^3.7.2:
6298 resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061" 7172 resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.8.3.tgz#409eb8544ea0335711205869ec458ab109ee1061"
6299 integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w== 7173 integrity sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==
6300 7174
7175uc.micro@^1.0.1:
7176 version "1.0.6"
7177 resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
7178 integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==
7179
7180uglify-js@^2.6.1:
7181 version "2.8.29"
7182 resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.29.tgz#29c5733148057bb4e1f75df35b7a9cb72e6a59dd"
7183 integrity sha1-KcVzMUgFe7Th913zW3qcty5qWd0=
7184 dependencies:
7185 source-map "~0.5.1"
7186 yargs "~3.10.0"
7187 optionalDependencies:
7188 uglify-to-browserify "~1.0.0"
7189
7190uglify-to-browserify@~1.0.0:
7191 version "1.0.2"
7192 resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7"
7193 integrity sha1-bgkk1r2mta/jSeOabWMoUKD4grc=
7194
6301uint64be@^2.0.2: 7195uint64be@^2.0.2:
6302 version "2.0.2" 7196 version "2.0.2"
6303 resolved "https://registry.yarnpkg.com/uint64be/-/uint64be-2.0.2.tgz#ef4a179752fe8f9ddaa29544ecfc13490031e8e5" 7197 resolved "https://registry.yarnpkg.com/uint64be/-/uint64be-2.0.2.tgz#ef4a179752fe8f9ddaa29544ecfc13490031e8e5"
@@ -6312,6 +7206,16 @@ undefsafe@^2.0.2:
6312 dependencies: 7206 dependencies:
6313 debug "^2.2.0" 7207 debug "^2.2.0"
6314 7208
7209underscore.deep@~0.5.1:
7210 version "0.5.1"
7211 resolved "https://registry.yarnpkg.com/underscore.deep/-/underscore.deep-0.5.1.tgz#072671f48d68735c34223fcfef63e69e5276cc2b"
7212 integrity sha1-ByZx9I1oc1w0Ij/P72PmnlJ2zCs=
7213
7214underscore@~1.7.0:
7215 version "1.7.0"
7216 resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.7.0.tgz#6bbaf0877500d36be34ecaa584e0db9fef035209"
7217 integrity sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=
7218
6315uniq@^1.0.1: 7219uniq@^1.0.1:
6316 version "1.0.1" 7220 version "1.0.1"
6317 resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff" 7221 resolved "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz#b31c5ae8254844a3a8281541ce2b04b865a734ff"
@@ -6468,6 +7372,11 @@ v8-compile-cache@^2.0.3:
6468 resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e" 7372 resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz#e14de37b31a6d194f5690d67efc4e7f6fc6ab30e"
6469 integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g== 7373 integrity sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==
6470 7374
7375valid-data-url@^2.0.0:
7376 version "2.0.0"
7377 resolved "https://registry.yarnpkg.com/valid-data-url/-/valid-data-url-2.0.0.tgz#2220fa9f8d4e761ebd3f3bb02770f1212b810537"
7378 integrity sha512-dyCZnv3aCey7yfTgIqdZanKl7xWAEEKCbgmR7SKqyK6QT/Z07ROactrgD1eA37C69ODRj7rNOjzKWVPh0EUjBA==
7379
6471validate-npm-package-license@^3.0.1: 7380validate-npm-package-license@^3.0.1:
6472 version "3.0.4" 7381 version "3.0.4"
6473 resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" 7382 resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
@@ -6522,6 +7431,26 @@ videostream@^3.2.0:
6522 pump "^3.0.0" 7431 pump "^3.0.0"
6523 range-slice-stream "^2.0.0" 7432 range-slice-stream "^2.0.0"
6524 7433
7434void-elements@^2.0.1:
7435 version "2.0.1"
7436 resolved "https://registry.yarnpkg.com/void-elements/-/void-elements-2.0.1.tgz#c066afb582bb1cb4128d60ea92392e94d5e9dbec"
7437 integrity sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=
7438
7439web-resource-inliner@^4.3.3:
7440 version "4.3.4"
7441 resolved "https://registry.yarnpkg.com/web-resource-inliner/-/web-resource-inliner-4.3.4.tgz#07e1b4bcbcbee1021251b018e902bac5713f1be0"
7442 integrity sha512-agVAgRhOOi4GVlvKK34oM23tDgH8390HfLnZY2HZl8OFBwKNvUJkH7t89AT2iluQP8w9VHAAKX6Z8EN7/9tqKA==
7443 dependencies:
7444 async "^3.1.0"
7445 chalk "^2.4.2"
7446 datauri "^2.0.0"
7447 htmlparser2 "^4.0.0"
7448 lodash.unescape "^4.0.1"
7449 request "^2.88.0"
7450 safer-buffer "^2.1.2"
7451 valid-data-url "^2.0.0"
7452 xtend "^4.0.2"
7453
6525webfinger.js@^2.6.6: 7454webfinger.js@^2.6.6:
6526 version "2.7.0" 7455 version "2.7.0"
6527 resolved "https://registry.yarnpkg.com/webfinger.js/-/webfinger.js-2.7.0.tgz#403354a14a65aeeba64c1408c18a387487cea106" 7456 resolved "https://registry.yarnpkg.com/webfinger.js/-/webfinger.js-2.7.0.tgz#403354a14a65aeeba64c1408c18a387487cea106"
@@ -6620,6 +7549,11 @@ wildstring@1.0.9:
6620 resolved "https://registry.yarnpkg.com/wildstring/-/wildstring-1.0.9.tgz#82a696d5653c7d4ec9ba716859b6b53aba2761c5" 7549 resolved "https://registry.yarnpkg.com/wildstring/-/wildstring-1.0.9.tgz#82a696d5653c7d4ec9ba716859b6b53aba2761c5"
6621 integrity sha1-gqaW1WU8fU7JunFoWba1OronYcU= 7550 integrity sha1-gqaW1WU8fU7JunFoWba1OronYcU=
6622 7551
7552window-size@0.1.0:
7553 version "0.1.0"
7554 resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d"
7555 integrity sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=
7556
6623winston-transport@^4.3.0: 7557winston-transport@^4.3.0:
6624 version "4.3.0" 7558 version "4.3.0"
6625 resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.3.0.tgz#df68c0c202482c448d9b47313c07304c2d7c2c66" 7559 resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.3.0.tgz#df68c0c202482c448d9b47313c07304c2d7c2c66"
@@ -6656,6 +7590,14 @@ winston@3.2.1:
6656 triple-beam "^1.3.0" 7590 triple-beam "^1.3.0"
6657 winston-transport "^4.3.0" 7591 winston-transport "^4.3.0"
6658 7592
7593with@^5.0.0:
7594 version "5.1.1"
7595 resolved "https://registry.yarnpkg.com/with/-/with-5.1.1.tgz#fa4daa92daf32c4ea94ed453c81f04686b575dfe"
7596 integrity sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=
7597 dependencies:
7598 acorn "^3.1.0"
7599 acorn-globals "^3.0.0"
7600
6659wkx@^0.4.8: 7601wkx@^0.4.8:
6660 version "0.4.8" 7602 version "0.4.8"
6661 resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.4.8.tgz#a092cf088d112683fdc7182fd31493b2c5820003" 7603 resolved "https://registry.yarnpkg.com/wkx/-/wkx-0.4.8.tgz#a092cf088d112683fdc7182fd31493b2c5820003"
@@ -6668,6 +7610,11 @@ word-wrap@~1.2.3:
6668 resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" 7610 resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c"
6669 integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ== 7611 integrity sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==
6670 7612
7613wordwrap@0.0.2:
7614 version "0.0.2"
7615 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f"
7616 integrity sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=
7617
6671wrap-ansi@^5.1.0: 7618wrap-ansi@^5.1.0:
6672 version "5.1.0" 7619 version "5.1.0"
6673 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" 7620 resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09"
@@ -6762,7 +7709,7 @@ xmlhttprequest-ssl@~1.5.4:
6762 resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e" 7709 resolved "https://registry.yarnpkg.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz#c2876b06168aadc40e57d97e81191ac8f4398b3e"
6763 integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4= 7710 integrity sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=
6764 7711
6765"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.1: 7712"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.2, xtend@~4.0.1:
6766 version "4.0.2" 7713 version "4.0.2"
6767 resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" 7714 resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
6768 integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== 7715 integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
@@ -6853,6 +7800,16 @@ yargs@^15.3.1:
6853 y18n "^4.0.0" 7800 y18n "^4.0.0"
6854 yargs-parser "^18.1.1" 7801 yargs-parser "^18.1.1"
6855 7802
7803yargs@~3.10.0:
7804 version "3.10.0"
7805 resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"
7806 integrity sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=
7807 dependencies:
7808 camelcase "^1.0.2"
7809 cliui "^2.1.0"
7810 decamelize "^1.0.0"
7811 window-size "0.1.0"
7812
6856yeast@0.1.2: 7813yeast@0.1.2:
6857 version "0.1.2" 7814 version "0.1.2"
6858 resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" 7815 resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419"