diff options
author | Rigel Kent <sendmemail@rigelk.eu> | 2020-05-05 20:22:22 +0200 |
---|---|---|
committer | Rigel Kent <par@rigelk.eu> | 2020-05-08 15:31:51 +0200 |
commit | df4c603dea022146476812cbbc2b9f8f1e5e4870 (patch) | |
tree | c0d27576fb6711b4b64d2186e8dca3f04b9b1dfe | |
parent | 91b8e675e26dd65e1ebb23706cb16b3a3f8bcf73 (diff) | |
download | PeerTube-df4c603dea022146476812cbbc2b9f8f1e5e4870.tar.gz PeerTube-df4c603dea022146476812cbbc2b9f8f1e5e4870.tar.zst PeerTube-df4c603dea022146476812cbbc2b9f8f1e5e4870.zip |
Switch emails to pug templates and provide richer html/text-only versions
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 @@ | |||
1 | import * as express from 'express' | 1 | import * as express from 'express' |
2 | import { UserRight, VideoAbuseCreate, VideoAbuseState } from '../../../../shared' | 2 | import { UserRight, VideoAbuseCreate, VideoAbuseState, VideoAbuse } from '../../../../shared' |
3 | import { logger } from '../../../helpers/logger' | 3 | import { logger } from '../../../helpers/logger' |
4 | import { getFormattedObjects } from '../../../helpers/utils' | 4 | import { getFormattedObjects } from '../../../helpers/utils' |
5 | import { sequelizeTypescript } from '../../../initializers/database' | 5 | import { sequelizeTypescript } from '../../../initializers/database' |
@@ -24,6 +24,7 @@ import { Notifier } from '../../../lib/notifier' | |||
24 | import { sendVideoAbuse } from '../../../lib/activitypub/send/send-flag' | 24 | import { sendVideoAbuse } from '../../../lib/activitypub/send/send-flag' |
25 | import { MVideoAbuseAccountVideo } from '../../../typings/models/video' | 25 | import { MVideoAbuseAccountVideo } from '../../../typings/models/video' |
26 | import { getServerActor } from '@server/models/application/application' | 26 | import { getServerActor } from '@server/models/application/application' |
27 | import { MAccountDefault } from '@server/typings/models' | ||
27 | 28 | ||
28 | const auditLogger = auditLoggerFactory('abuse') | 29 | const auditLogger = auditLoggerFactory('abuse') |
29 | const abuseVideoRouter = express.Router() | 30 | const abuseVideoRouter = express.Router() |
@@ -117,9 +118,11 @@ async function deleteVideoAbuse (req: express.Request, res: express.Response) { | |||
117 | async function reportVideoAbuse (req: express.Request, res: express.Response) { | 118 | async 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' | |||
8 | import { Notifier } from '../../notifier' | 8 | import { Notifier } from '../../notifier' |
9 | import { getAPId } from '../../../helpers/activitypub' | 9 | import { getAPId } from '../../../helpers/activitypub' |
10 | import { APProcessorOptions } from '../../../typings/activitypub-processor.model' | 10 | import { APProcessorOptions } from '../../../typings/activitypub-processor.model' |
11 | import { MActorSignature, MVideoAbuseVideo } from '../../../typings/models' | 11 | import { MActorSignature, MVideoAbuseAccountVideo } from '../../../typings/models' |
12 | import { AccountModel } from '@server/models/account/account' | ||
12 | 13 | ||
13 | async function processFlagActivity (options: APProcessorOptions<ActivityCreate | ActivityFlag>) { | 14 | async 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 @@ | |||
1 | import { createTransport, Transporter } from 'nodemailer' | 1 | import { createTransport, Transporter } from 'nodemailer' |
2 | import { isTestInstance } from '../helpers/core-utils' | 2 | import { isTestInstance, root } from '../helpers/core-utils' |
3 | import { bunyanLogger, logger } from '../helpers/logger' | 3 | import { bunyanLogger, logger } from '../helpers/logger' |
4 | import { CONFIG, isEmailEnabled } from '../initializers/config' | 4 | import { CONFIG, isEmailEnabled } from '../initializers/config' |
5 | import { JobQueue } from './job-queue' | 5 | import { JobQueue } from './job-queue' |
@@ -16,6 +16,12 @@ import { | |||
16 | import { MActorFollowActors, MActorFollowFull, MUser } from '../typings/models' | 16 | import { MActorFollowActors, MActorFollowFull, MUser } from '../typings/models' |
17 | import { MVideoImport, MVideoImportVideo } from '@server/typings/models/video/video-import' | 17 | import { MVideoImport, MVideoImportVideo } from '@server/typings/models/video/video-import' |
18 | import { EmailPayload } from '@shared/models' | 18 | import { EmailPayload } from '@shared/models' |
19 | import { join } from 'path' | ||
20 | import { VideoAbuse } from '../../shared/models/videos' | ||
21 | import { SendEmailOptions } from '../../shared/models/server/emailer.model' | ||
22 | import { merge } from 'lodash' | ||
23 | import { VideoChannelModel } from '@server/models/video/video-channel' | ||
24 | const Email = require('email-templates') | ||
19 | 25 | ||
20 | class Emailer { | 26 | class 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"; | ||
8 | doctype html | ||
9 | head | ||
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 | |||
163 | body(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 | | ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ ‌ | ||
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 @@ | |||
1 | extends base | ||
2 | |||
3 | block 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 @@ | |||
1 | extends greetings | ||
2 | |||
3 | block 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 @@ | |||
1 | mixin 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 @@ | |||
1 | extends ../common/greetings | ||
2 | |||
3 | block title | ||
4 | | Someone just used the contact form | ||
5 | |||
6 | block 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 @@ | |||
1 | extends ../common/greetings | ||
2 | |||
3 | block title | ||
4 | | New follower on your channel | ||
5 | |||
6 | block 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 @@ | |||
1 | extends ../common/greetings | ||
2 | |||
3 | block title | ||
4 | | Password creation for your account | ||
5 | |||
6 | block 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 @@ | |||
1 | extends ../common/greetings | ||
2 | |||
3 | block title | ||
4 | | Password reset for your account | ||
5 | |||
6 | block 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 @@ | |||
1 | extends ../common/greetings | ||
2 | |||
3 | block title | ||
4 | | A new user registered | ||
5 | |||
6 | block 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 @@ | |||
1 | extends ../common/greetings | ||
2 | |||
3 | block title | ||
4 | | Account verification | ||
5 | |||
6 | block 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 @@ | |||
1 | extends ../common/greetings | ||
2 | include ../common/mixins.pug | ||
3 | |||
4 | block title | ||
5 | | A video is pending moderation | ||
6 | |||
7 | block 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 @@ | |||
1 | extends ../common/greetings | ||
2 | include ../common/mixins | ||
3 | |||
4 | block title | ||
5 | | A video is pending moderation | ||
6 | |||
7 | block 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 @@ | |||
1 | extends ../common/greetings | ||
2 | |||
3 | block title | ||
4 | | Someone mentioned you | ||
5 | |||
6 | block 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 @@ | |||
1 | extends ../common/greetings | ||
2 | |||
3 | block title | ||
4 | | Someone commented your video | ||
5 | |||
6 | block 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' | |||
5 | import { UserModel } from '../models/account/user' | 5 | import { UserModel } from '../models/account/user' |
6 | import { PeerTubeSocket } from './peertube-socket' | 6 | import { PeerTubeSocket } from './peertube-socket' |
7 | import { CONFIG } from '../initializers/config' | 7 | import { CONFIG } from '../initializers/config' |
8 | import { VideoPrivacy, VideoState } from '../../shared/models/videos' | 8 | import { VideoPrivacy, VideoState, VideoAbuse } from '../../shared/models/videos' |
9 | import { AccountBlocklistModel } from '../models/account/account-blocklist' | 9 | import { AccountBlocklistModel } from '../models/account/account-blocklist' |
10 | import { | 10 | import { |
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 | ||
183 | async function checkVideoIsPublished (base: CheckerBaseParams, videoName: string, videoUUID: string, type: CheckerType) { | 183 | async 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 | ||
206 | async function checkMyVideoImportIsFinished ( | 206 | async 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 | ||
239 | async function checkUserRegistered (base: CheckerBaseParams, username: string, type: CheckerType) { | 239 | async 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 | ||
263 | async function checkNewActorFollow ( | 263 | async 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 | ||
303 | async function checkNewInstanceFollower (base: CheckerBaseParams, followerHost: string, type: CheckerType) { | 303 | async 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 | ||
332 | async function checkAutoInstanceFollowing (base: CheckerBaseParams, followerHost: string, followingHost: string, type: CheckerType) { | 332 | async 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 | ||
363 | async function checkCommentMention ( | 363 | async 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 | ||
397 | let lastEmailCount = 0 | 397 | let 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 | ||
457 | async function checkVideoAutoBlacklistForModerators (base: CheckerBaseParams, videoUUID: string, videoName: string, type: CheckerType) { | 457 | async 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 | ||
482 | async function checkNewBlacklistOnMyVideo ( | 482 | async 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 @@ | |||
1 | export type SendEmailOptions = { | 1 | export 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 | } |
@@ -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 | ||
577 | acorn-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 | |||
519 | acorn-jsx@^5.2.0: | 584 | acorn-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 | ||
589 | acorn@^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 | |||
594 | acorn@^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 | |||
524 | acorn@^7.1.1: | 599 | acorn@^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 | ||
629 | align-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 | |||
554 | ansi-align@^2.0.0: | 638 | ansi-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 | ||
740 | array-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 | |||
656 | array-flatten@1.1.1: | 745 | array-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 | ||
759 | array-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 | |||
670 | array.prototype.flat@^1.2.1: | 764 | array.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 | ||
777 | arrify@^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 | |||
782 | asap@~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 | |||
683 | asn1@~0.2.3: | 787 | asn1@~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 | ||
868 | babel-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 | |||
876 | babel-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 | |||
886 | babylon@^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 | |||
764 | backo2@1.0.2: | 891 | backo2@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 | ||
949 | bluebird@^3.0.5, bluebird@^3.5.0, bluebird@^3.5.1: | 1076 | bluebird@^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 | ||
1102 | boolbase@~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 | |||
1107 | boolean@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 | |||
975 | bowser@2.9.0: | 1112 | bowser@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 | ||
1242 | camelcase@^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 | |||
1105 | camelcase@^4.0.0: | 1247 | camelcase@^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 | ||
1277 | center-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 | |||
1135 | chai-json-schema@^1.5.0: | 1285 | chai-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 | ||
1338 | character-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 | |||
1188 | chardet@^0.7.0: | 1345 | chardet@^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 | ||
1365 | cheerio@^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 | |||
1208 | chokidar@3.3.0: | 1387 | chokidar@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 | ||
1469 | clean-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 | |||
1290 | cli-boxes@^1.0.0: | 1476 | cli-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 | ||
1493 | cliui@^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 | |||
1307 | cliui@^5.0.0: | 1502 | cliui@^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 | ||
1434 | commander@^2.20.0, commander@^2.7.1: | 1629 | commander@^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 | ||
1720 | consolidate@^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 | |||
1727 | constantinople@^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 | |||
1525 | contains-path@^0.1.0: | 1737 | contains-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 | ||
1787 | core-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 | |||
1575 | core-util-is@1.0.2, core-util-is@~1.0.0: | 1792 | core-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 | ||
1805 | country-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 | |||
1588 | create-error-class@^3.0.0: | 1813 | create-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 | ||
1885 | css-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 | |||
1895 | css-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 | |||
1660 | cycle@1.0.x: | 1900 | cycle@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 | ||
1925 | datauri@^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 | |||
1685 | date-fns@^2.0.1: | 1933 | date-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 | ||
1938 | dayjs@^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 | |||
1943 | debug@*, 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 | |||
1690 | debug@2.6.9, debug@^2.2.0, debug@^2.6.9: | 1950 | debug@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 | ||
1704 | debug@^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 | |||
1711 | debug@~3.1.0: | 1964 | debug@~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 | ||
1723 | decamelize@^1.2.0: | 1976 | decamelize@^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 | ||
2111 | doctypes@^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 | |||
2116 | dom-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 | |||
2124 | dom-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 | |||
2132 | domelementtype@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 | |||
2137 | domelementtype@^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 | |||
2142 | domhandler@^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 | |||
2149 | domhandler@^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 | |||
2156 | domutils@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 | |||
2164 | domutils@^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 | |||
2172 | domutils@^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 | |||
1858 | dont-sniff-mimetype@1.1.0: | 2181 | dont-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 | ||
2226 | email-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 | |||
1903 | emoji-regex@^7.0.1: | 2243 | emoji-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 | ||
2265 | encoding-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 | |||
1925 | end-of-stream@^1.0.0, end-of-stream@^1.1.0, end-of-stream@^1.4.1: | 2270 | end-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 | ||
2357 | entities@^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 | |||
2362 | entities@^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 | |||
2012 | env-variable@0.0.x: | 2367 | env-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 | ||
3059 | get-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 | |||
2704 | get-port@^5.1.1: | 3066 | get-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 | ||
2881 | he@1.2.0: | 3243 | he@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 | ||
3313 | html-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 | |||
3323 | htmlparser2@^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 | |||
3335 | htmlparser2@^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 | |||
2951 | http-errors@1.7.2: | 3345 | http-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 | ||
3394 | i18n-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 | |||
3401 | i18n@^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 | |||
3000 | i@0.3.x: | 3413 | i@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 | ||
3425 | iconv-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 | |||
3012 | ieee754@^1.1.4: | 3432 | ieee754@^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 | ||
3464 | image-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 | |||
3044 | immediate-chunk-store@^2.0.0: | 3469 | immediate-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 | ||
3195 | is-buffer@~1.1.1: | 3620 | is-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 | ||
3654 | is-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 | |||
3229 | is-extglob@^2.1.1: | 3662 | is-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 | ||
3738 | is-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 | |||
3305 | is-promise@^2.1, is-promise@^2.1.0: | 3743 | is-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 | ||
3315 | is-regex@^1.0.5: | 3753 | is-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 | ||
3827 | js-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 | |||
3389 | js-tokens@^4.0.0: | 3832 | js-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 | ||
3926 | jstransformer@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 | |||
3934 | juice@^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 | |||
3483 | junk@^3.1.0: | 3947 | junk@^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 | ||
3978 | kind-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 | |||
3514 | kuler@1.0.x: | 3985 | kuler@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 | ||
4004 | lazy-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 | |||
3533 | levn@^0.3.0, levn@~0.3.0: | 4009 | levn@^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 | ||
4017 | libbase64@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 | |||
4022 | libmime@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 | |||
4032 | libqp@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 | |||
3541 | libxmljs@0.19.7: | 4037 | libxmljs@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 | ||
4046 | linkify-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 | |||
3550 | load-ip-set@^2.1.0: | 4053 | load-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 | ||
3594 | lodash.defaults@^4.2.0: | 4097 | lodash.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 | |||
4102 | lodash.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 | |||
4107 | lodash.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 | ||
3599 | lodash.flatten@^4.4.0: | 4112 | lodash.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 | |||
4117 | lodash.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 | ||
4122 | lodash.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 | |||
3604 | lodash.get@^4.4.2: | 4127 | lodash.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 | ||
3614 | lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15: | 4137 | lodash.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 | |||
4142 | lodash.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 | |||
4147 | lodash.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 | |||
4152 | lodash.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 | |||
4157 | lodash.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 | |||
4162 | lodash.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 | |||
4167 | lodash.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 | |||
4172 | lodash@^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 | ||
4195 | longest@^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 | |||
3637 | lowercase-keys@^1.0.0: | 4200 | lowercase-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 | ||
4269 | mailparser@^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 | |||
4284 | mailsplit@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 | |||
3706 | make-dir@^1.0.0: | 4293 | make-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 | ||
4305 | make-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 | |||
4312 | make-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 | |||
3718 | marked-man@^0.7.0: | 4317 | marked-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 | ||
4327 | math-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 | |||
3728 | md5@^2.2.1: | 4332 | md5@^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 | ||
4374 | mensch@^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 | |||
3770 | merge-descriptors@1.0.1: | 4379 | merge-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 | ||
4389 | messageformat-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 | |||
4394 | messageformat-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 | |||
4399 | messageformat@^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 | |||
3780 | methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: | 4408 | methods@^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 | ||
4435 | mimer@^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 | |||
3807 | mimic-fn@^2.1.0: | 4440 | mimic-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 | ||
4624 | multimatch@^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 | |||
3991 | multistream@^4.0.0: | 4635 | multistream@^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 | ||
4642 | mustache@^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 | |||
3998 | mute-stream@0.0.8, mute-stream@~0.0.4: | 4647 | mute-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 | ||
4783 | nodemailer@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 | |||
4134 | nodemailer@^3.1.1: | 4788 | nodemailer@^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 | ||
4139 | nodemailer@^6.0.0: | 4793 | nodemailer@^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 | ||
4894 | nth-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 | |||
4240 | number-is-nan@^1.0.0: | 4901 | number-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 | ||
4262 | object-assign@^4, object-assign@^4.1.0, object-assign@^4.1.1: | 4923 | object-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 | ||
5012 | open@^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 | |||
4351 | openapi-types@^1.3.5: | 5019 | openapi-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 | ||
5366 | pify@^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 | |||
5371 | pify@^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 | |||
4698 | pkg-dir@^2.0.0: | 5376 | pkg-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 | ||
5446 | preview-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 | |||
4768 | process-nextick-args@~2.0.0: | 5461 | process-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 | ||
5480 | promise@^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 | |||
4787 | promisify-any@^2.0.1: | 5487 | promisify-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 | ||
5531 | pug-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 | |||
5540 | pug-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 | |||
5554 | pug-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 | |||
5559 | pug-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 | |||
5572 | pug-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 | |||
5581 | pug-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 | |||
5589 | pug-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 | |||
5597 | pug-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 | |||
5605 | pug-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 | |||
5610 | pug-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 | |||
5617 | pug-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 | |||
5622 | pug@^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 | |||
4831 | pump@^2.0.0: | 5636 | pump@^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 | ||
5676 | qs@^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 | |||
4871 | qs@~6.5.2: | 5681 | qs@~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 | ||
5896 | regenerator-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 | |||
5901 | regenerator-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 | |||
5086 | regexpp@^2.0.1: | 5906 | regexpp@^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 | ||
5942 | repeat-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 | |||
5122 | request@^2.81.0, request@^2.88.0, request@~2.88.0: | 5947 | request@^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 | ||
6000 | resolve@^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 | |||
5175 | resolve@^1.10.0, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.13.1: | 6007 | resolve@^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 | ||
6034 | right-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 | |||
5202 | rimraf@2.6.3: | 6041 | rimraf@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 | ||
6344 | slick@^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 | |||
5505 | smtp-connection@4.0.2: | 6349 | smtp-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 | ||
5616 | source-map@^0.6.0: | 6460 | source-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 | ||
6465 | source-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 | |||
5621 | spawn-command@^0.0.2-1: | 6470 | spawn-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 | ||
6520 | sprintf-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 | |||
5671 | sprintf-js@~1.0.2: | 6525 | sprintf-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 | ||
6953 | titleize@^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 | |||
6958 | tlds@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 | |||
6099 | tmp@0.0.x, tmp@^0.0.33: | 6963 | tmp@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 | ||
6980 | to-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 | |||
6116 | to-regex-range@^5.0.1: | 6985 | to-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 | ||
7008 | token-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 | |||
6139 | toposort-class@^1.0.1: | 7013 | toposort-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 | ||
7175 | uc.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 | |||
7180 | uglify-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 | |||
7190 | uglify-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 | |||
6301 | uint64be@^2.0.2: | 7195 | uint64be@^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 | ||
7209 | underscore.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 | |||
7214 | underscore@~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 | |||
6315 | uniq@^1.0.1: | 7219 | uniq@^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 | ||
7375 | valid-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 | |||
6471 | validate-npm-package-license@^3.0.1: | 7380 | validate-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 | ||
7434 | void-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 | |||
7439 | web-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 | |||
6525 | webfinger.js@^2.6.6: | 7454 | webfinger.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 | ||
7552 | window-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 | |||
6623 | winston-transport@^4.3.0: | 7557 | winston-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 | ||
7593 | with@^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 | |||
6659 | wkx@^0.4.8: | 7601 | wkx@^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 | ||
7613 | wordwrap@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 | |||
6671 | wrap-ansi@^5.1.0: | 7618 | wrap-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 | ||
7803 | yargs@~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 | |||
6856 | yeast@0.1.2: | 7813 | yeast@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" |