aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorKimsible <1877318+kimsible@users.noreply.github.com>2020-11-07 22:59:58 +0100
committerGitHub <noreply@github.com>2020-11-07 22:59:58 +0100
commit98b94643127d881cbc09a12812185aed44173f16 (patch)
tree69759b1a15c1f013c2f4ee411a7abf4d19298bc1
parenta4879b53759ac8db1405351103c7a4a8a700a768 (diff)
downloadPeerTube-98b94643127d881cbc09a12812185aed44173f16.tar.gz
PeerTube-98b94643127d881cbc09a12812185aed44173f16.tar.zst
PeerTube-98b94643127d881cbc09a12812185aed44173f16.zip
render html/markdown for new comment notification email (#3255)
Co-authored-by: kimsible <kimsible@users.noreply.github.com> Co-authored-by: Rigel Kent <sendmemail@rigelk.eu>
-rw-r--r--client/package.json2
-rw-r--r--client/yarn.lock8
-rw-r--r--package.json2
-rw-r--r--server/lib/emailer.ts51
-rw-r--r--server/lib/emails/video-comment-mention/html.pug6
-rw-r--r--server/lib/emails/video-comment-new/html.pug6
-rw-r--r--yarn.lock140
7 files changed, 181 insertions, 34 deletions
diff --git a/client/package.json b/client/package.json
index 986a0a42b..cb6f77166 100644
--- a/client/package.json
+++ b/client/package.json
@@ -94,7 +94,7 @@
94 "karma-jasmine-html-reporter": "^1.5.0", 94 "karma-jasmine-html-reporter": "^1.5.0",
95 "linkifyjs": "^2.1.5", 95 "linkifyjs": "^2.1.5",
96 "lodash-es": "^4.17.4", 96 "lodash-es": "^4.17.4",
97 "markdown-it": "^11.0.0", 97 "markdown-it": "11.x",
98 "node-sass": "^4.9.3", 98 "node-sass": "^4.9.3",
99 "npm-font-source-sans-pro": "^1.0.2", 99 "npm-font-source-sans-pro": "^1.0.2",
100 "p2p-media-loader-hlsjs": "^0.6.2", 100 "p2p-media-loader-hlsjs": "^0.6.2",
diff --git a/client/yarn.lock b/client/yarn.lock
index f55da88a4..cdafe1458 100644
--- a/client/yarn.lock
+++ b/client/yarn.lock
@@ -7218,10 +7218,10 @@ map-visit@^1.0.0:
7218 dependencies: 7218 dependencies:
7219 object-visit "^1.0.0" 7219 object-visit "^1.0.0"
7220 7220
7221markdown-it@^11.0.0: 7221markdown-it@11.x:
7222 version "11.0.0" 7222 version "11.0.1"
7223 resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-11.0.0.tgz#dbfc30363e43d756ebc52c38586b91b90046b876" 7223 resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-11.0.1.tgz#b54f15ec2a2193efa66dda1eb4173baea08993d6"
7224 integrity sha512-+CvOnmbSubmQFSA9dKz1BRiaSMV7rhexl3sngKqFyXSagoA3fBdJQ8oZWtRy2knXdpDXaBw44euz37DeJQ9asg== 7224 integrity sha512-aU1TzmBKcWNNYvH9pjq6u92BML+Hz3h5S/QpfTFwiQF852pLT+9qHsrhM9JYipkOXZxGn+sGH8oyJE9FD9WezQ==
7225 dependencies: 7225 dependencies:
7226 argparse "^1.0.7" 7226 argparse "^1.0.7"
7227 entities "~2.0.0" 7227 entities "~2.0.0"
diff --git a/package.json b/package.json
index 4a571909d..b08e5fe6c 100644
--- a/package.json
+++ b/package.json
@@ -118,6 +118,7 @@
118 "lodash": "^4.17.10", 118 "lodash": "^4.17.10",
119 "lru-cache": "^6.0.0", 119 "lru-cache": "^6.0.0",
120 "magnet-uri": "^5.1.4", 120 "magnet-uri": "^5.1.4",
121 "markdown-it": "11.x",
121 "memoizee": "^0.4.14", 122 "memoizee": "^0.4.14",
122 "morgan": "^1.5.3", 123 "morgan": "^1.5.3",
123 "multer": "^1.1.0", 124 "multer": "^1.1.0",
@@ -133,6 +134,7 @@
133 "redis": "^3.0.2", 134 "redis": "^3.0.2",
134 "reflect-metadata": "^0.1.12", 135 "reflect-metadata": "^0.1.12",
135 "request": "^2.81.0", 136 "request": "^2.81.0",
137 "sanitize-html": "2.x",
136 "scripty": "^2.0.0", 138 "scripty": "^2.0.0",
137 "sequelize": "5.21.13", 139 "sequelize": "5.21.13",
138 "sequelize-typescript": "^1.0.0-beta.4", 140 "sequelize-typescript": "^1.0.0-beta.4",
diff --git a/server/lib/emailer.ts b/server/lib/emailer.ts
index 25b0aaedd..6532fb4b4 100644
--- a/server/lib/emailer.ts
+++ b/server/lib/emailer.ts
@@ -15,6 +15,53 @@ import { MAbuseFull, MAbuseMessage, MAccountDefault, MActorFollowActors, MActorF
15import { MCommentOwnerVideo, MVideo, MVideoAccountLight } from '../types/models/video' 15import { MCommentOwnerVideo, MVideo, MVideoAccountLight } from '../types/models/video'
16import { JobQueue } from './job-queue' 16import { JobQueue } from './job-queue'
17 17
18const sanitizeHtml = require('sanitize-html')
19const markdownItEmoji = require('markdown-it-emoji/light')
20const MarkdownItClass = require('markdown-it')
21const markdownIt = new MarkdownItClass('default', { linkify: true, breaks: true, html: true })
22
23markdownIt.enable([
24 'linkify',
25 'autolink',
26 'emphasis',
27 'link',
28 'newline',
29 'list'
30])
31
32markdownIt.use(markdownItEmoji)
33
34const toSafeHtml = text => {
35 // Restore line feed
36 const textWithLineFeed = text.replace(/<br.?\/?>/g, '\r\n')
37
38 // Convert possible markdown (emojis, emphasis and lists) to html
39 const html = markdownIt.render(textWithLineFeed)
40
41 // Convert to safe Html
42 return sanitizeHtml(html, {
43 allowedTags: [ 'a', 'p', 'span', 'br', 'strong', 'em', 'ul', 'ol', 'li' ],
44 allowedSchemes: [ 'http', 'https' ],
45 allowedAttributes: {
46 a: [ 'href', 'class', 'target', 'rel' ]
47 },
48 transformTags: {
49 a: (tagName, attribs) => {
50 let rel = 'noopener noreferrer'
51 if (attribs.rel === 'me') rel += ' me'
52
53 return {
54 tagName,
55 attribs: Object.assign(attribs, {
56 target: '_blank',
57 rel
58 })
59 }
60 }
61 }
62 })
63}
64
18const Email = require('email-templates') 65const Email = require('email-templates')
19 66
20class Emailer { 67class Emailer {
@@ -236,6 +283,7 @@ class Emailer {
236 const video = comment.Video 283 const video = comment.Video
237 const videoUrl = WEBSERVER.URL + comment.Video.getWatchStaticPath() 284 const videoUrl = WEBSERVER.URL + comment.Video.getWatchStaticPath()
238 const commentUrl = WEBSERVER.URL + comment.getCommentStaticPath() 285 const commentUrl = WEBSERVER.URL + comment.getCommentStaticPath()
286 const commentHtml = toSafeHtml(comment.text)
239 287
240 const emailPayload: EmailPayload = { 288 const emailPayload: EmailPayload = {
241 template: 'video-comment-new', 289 template: 'video-comment-new',
@@ -245,6 +293,7 @@ class Emailer {
245 accountName: comment.Account.getDisplayName(), 293 accountName: comment.Account.getDisplayName(),
246 accountUrl: comment.Account.Actor.url, 294 accountUrl: comment.Account.Actor.url,
247 comment, 295 comment,
296 commentHtml,
248 video, 297 video,
249 videoUrl, 298 videoUrl,
250 action: { 299 action: {
@@ -262,6 +311,7 @@ class Emailer {
262 const video = comment.Video 311 const video = comment.Video
263 const videoUrl = WEBSERVER.URL + comment.Video.getWatchStaticPath() 312 const videoUrl = WEBSERVER.URL + comment.Video.getWatchStaticPath()
264 const commentUrl = WEBSERVER.URL + comment.getCommentStaticPath() 313 const commentUrl = WEBSERVER.URL + comment.getCommentStaticPath()
314 const commentHtml = toSafeHtml(comment.text)
265 315
266 const emailPayload: EmailPayload = { 316 const emailPayload: EmailPayload = {
267 template: 'video-comment-mention', 317 template: 'video-comment-mention',
@@ -269,6 +319,7 @@ class Emailer {
269 subject: 'Mention on video ' + video.name, 319 subject: 'Mention on video ' + video.name,
270 locals: { 320 locals: {
271 comment, 321 comment,
322 commentHtml,
272 video, 323 video,
273 videoUrl, 324 videoUrl,
274 accountName, 325 accountName,
diff --git a/server/lib/emails/video-comment-mention/html.pug b/server/lib/emails/video-comment-mention/html.pug
index 9e9ced62d..a34c6b090 100644
--- a/server/lib/emails/video-comment-mention/html.pug
+++ b/server/lib/emails/video-comment-mention/html.pug
@@ -5,7 +5,7 @@ block title
5 5
6block content 6block content
7 p. 7 p.
8 #[a(href=accountUrl title=handle) #{accountName}] mentioned you in a comment on video 8 #[a(href=accountUrl title=handle) #{accountName}] mentioned you in a comment on video
9 "#[a(href=videoUrl) #{video.name}]": 9 "#[a(href=videoUrl) #{video.name}]":
10 blockquote #{comment.text} 10 blockquote !{commentHtml}
11 br(style="display: none;") \ No newline at end of file 11 br(style="display: none;")
diff --git a/server/lib/emails/video-comment-new/html.pug b/server/lib/emails/video-comment-new/html.pug
index 075af5717..cbb683fee 100644
--- a/server/lib/emails/video-comment-new/html.pug
+++ b/server/lib/emails/video-comment-new/html.pug
@@ -5,7 +5,7 @@ block title
5 5
6block content 6block content
7 p. 7 p.
8 #[a(href=accountUrl title=handle) #{accountName}] added a comment on your video 8 #[a(href=accountUrl title=handle) #{accountName}] added a comment on your video
9 "#[a(href=videoUrl) #{video.name}]": 9 "#[a(href=videoUrl) #{video.name}]":
10 blockquote #{comment.text} 10 blockquote !{commentHtml}
11 br(style="display: none;") \ No newline at end of file 11 br(style="display: none;")
diff --git a/yarn.lock b/yarn.lock
index 3ceb4662e..67275bbf4 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1934,6 +1934,11 @@ color@3.0.x:
1934 color-convert "^1.9.1" 1934 color-convert "^1.9.1"
1935 color-string "^1.5.2" 1935 color-string "^1.5.2"
1936 1936
1937colorette@^1.2.1:
1938 version "1.2.1"
1939 resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b"
1940 integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==
1941
1937colors@1.0.x: 1942colors@1.0.x:
1938 version "1.0.3" 1943 version "1.0.3"
1939 resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" 1944 resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b"
@@ -2348,6 +2353,11 @@ deep-object-diff@^1.1.0:
2348 resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.0.tgz#d6fabf476c2ed1751fc94d5ca693d2ed8c18bc5a" 2353 resolved "https://registry.yarnpkg.com/deep-object-diff/-/deep-object-diff-1.1.0.tgz#d6fabf476c2ed1751fc94d5ca693d2ed8c18bc5a"
2349 integrity sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw== 2354 integrity sha512-b+QLs5vHgS+IoSNcUE4n9HP2NwcHj7aqnJWsjPtuG75Rh5TOaGt0OjAYInh77d5T16V5cRDC+Pw/6ZZZiETBGw==
2350 2355
2356deepmerge@^4.2.2:
2357 version "4.2.2"
2358 resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
2359 integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
2360
2351defer-to-connect@^1.0.1: 2361defer-to-connect@^1.0.1:
2352 version "1.1.3" 2362 version "1.1.3"
2353 resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" 2363 resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591"
@@ -2437,9 +2447,9 @@ dom-serializer@0:
2437 entities "^2.0.0" 2447 entities "^2.0.0"
2438 2448
2439dom-serializer@^1.0.1: 2449dom-serializer@^1.0.1:
2440 version "1.0.1" 2450 version "1.1.0"
2441 resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.0.1.tgz#79695eb49af3cd8abc8d93a73da382deb1ca0795" 2451 resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.1.0.tgz#5f7c828f1bfc44887dc2a315ab5c45691d544b58"
2442 integrity sha512-1Aj1Qy3YLbdslkI75QEOfdp9TkQ3o8LRISAzxOibjBs/xWwr1WxZFOQphFkZuepHFGo+kB8e5FVJSS0faAJ4Rw== 2452 integrity sha512-ox7bvGXt2n+uLWtCRLybYx60IrOlWL/aCebWJk1T0d4m3y2tzf4U3ij9wBMUb6YJZpz06HCCYuyCDveE2xXmzQ==
2443 dependencies: 2453 dependencies:
2444 domelementtype "^2.0.1" 2454 domelementtype "^2.0.1"
2445 domhandler "^3.0.0" 2455 domhandler "^3.0.0"
@@ -2464,9 +2474,9 @@ domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1:
2464 integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== 2474 integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==
2465 2475
2466domelementtype@^2.0.1: 2476domelementtype@^2.0.1:
2467 version "2.0.1" 2477 version "2.0.2"
2468 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz#1f8bdfe91f5a78063274e803b4bdcedf6e94f94d" 2478 resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.2.tgz#f3b6e549201e46f588b59463dd77187131fe6971"
2469 integrity sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ== 2479 integrity sha512-wFwTwCVebUrMgGeAwRL/NhZtHAUyT9n9yg4IMDwf10+6iCMxSkVq9MGCVEH+QZWo1nNidy8kNvwmv4zWHDTqvA==
2470 2480
2471domhandler@^2.3.0: 2481domhandler@^2.3.0:
2472 version "2.4.2" 2482 version "2.4.2"
@@ -2475,10 +2485,10 @@ domhandler@^2.3.0:
2475 dependencies: 2485 dependencies:
2476 domelementtype "1" 2486 domelementtype "1"
2477 2487
2478domhandler@^3.0.0: 2488domhandler@^3.0.0, domhandler@^3.3.0:
2479 version "3.0.0" 2489 version "3.3.0"
2480 resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.0.0.tgz#51cd13efca31da95bbb0c5bee3a48300e333b3e9" 2490 resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a"
2481 integrity sha512-eKLdI5v9m67kbXQbJSNn1zjh0SDzvzWVWtX+qEI3eMjZw8daH9k8rlj1FZY9memPwjiskQFbe7vHVVJIAqoEhw== 2491 integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==
2482 dependencies: 2492 dependencies:
2483 domelementtype "^2.0.1" 2493 domelementtype "^2.0.1"
2484 2494
@@ -2499,13 +2509,13 @@ domutils@^1.5.1:
2499 domelementtype "1" 2509 domelementtype "1"
2500 2510
2501domutils@^2.0.0: 2511domutils@^2.0.0:
2502 version "2.2.0" 2512 version "2.4.2"
2503 resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.2.0.tgz#f3ce1610af5c30280bde1b71f84b018b958f32cf" 2513 resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.4.2.tgz#7ee5be261944e1ad487d9aa0616720010123922b"
2504 integrity sha512-0haAxVr1PR0SqYwCH7mxMpHZUwjih9oPPedqpR/KufsnxPyZ9dyVw1R5093qnJF3WXSbjBkdzRWLw/knJV/fAg== 2514 integrity sha512-NKbgaM8ZJOecTZsIzW5gSuplsX2IWW2mIK7xVr8hTQF2v1CJWTmLZ1HOCh5sH+IzVPAGE5IucooOkvwBRAdowA==
2505 dependencies: 2515 dependencies:
2506 dom-serializer "^1.0.1" 2516 dom-serializer "^1.0.1"
2507 domelementtype "^2.0.1" 2517 domelementtype "^2.0.1"
2508 domhandler "^3.0.0" 2518 domhandler "^3.3.0"
2509 2519
2510dot-prop@^5.2.0: 2520dot-prop@^5.2.0:
2511 version "5.2.0" 2521 version "5.2.0"
@@ -2696,6 +2706,11 @@ entities@^1.1.1, entities@~1.1.1:
2696 integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== 2706 integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==
2697 2707
2698entities@^2.0.0: 2708entities@^2.0.0:
2709 version "2.1.0"
2710 resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5"
2711 integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==
2712
2713entities@~2.0.0:
2699 version "2.0.3" 2714 version "2.0.3"
2700 resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f" 2715 resolved "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz#5c487e5742ab93c15abb5da22759b8590ec03b7f"
2701 integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ== 2716 integrity sha512-MyoZ0jgnLvB2X3Lg5HqpFmn1kybDiIfEQmKzTb5apr51Rb+T3KdmMiqa70T+bhGnyv7bQ6WMj2QMHpGMmlrUYQ==
@@ -2807,6 +2822,11 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5, escape-string-regexp@~1
2807 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 2822 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
2808 integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 2823 integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
2809 2824
2825escape-string-regexp@^4.0.0:
2826 version "4.0.0"
2827 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
2828 integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
2829
2810eslint-config-standard-with-typescript@^18.0.2: 2830eslint-config-standard-with-typescript@^18.0.2:
2811 version "18.0.2" 2831 version "18.0.2"
2812 resolved "https://registry.yarnpkg.com/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-18.0.2.tgz#eb02d5358b17fe083c6f993ff829492c8f96b18f" 2832 resolved "https://registry.yarnpkg.com/eslint-config-standard-with-typescript/-/eslint-config-standard-with-typescript-18.0.2.tgz#eb02d5358b17fe083c6f993ff829492c8f96b18f"
@@ -3589,7 +3609,7 @@ htmlparser2@^3.10.1, htmlparser2@^3.9.1:
3589 inherits "^2.0.1" 3609 inherits "^2.0.1"
3590 readable-stream "^3.1.1" 3610 readable-stream "^3.1.1"
3591 3611
3592htmlparser2@^4.0.0: 3612htmlparser2@^4.0.0, htmlparser2@^4.1.0:
3593 version "4.1.0" 3613 version "4.1.0"
3594 resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78" 3614 resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-4.1.0.tgz#9a4ef161f2e4625ebf7dfbe6c0a2f52d18a59e78"
3595 integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q== 3615 integrity sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==
@@ -4016,6 +4036,11 @@ is-plain-obj@^1.1.0:
4016 resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e" 4036 resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz#71a50c8429dfca773c92a390a4a03b39fcd51d3e"
4017 integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4= 4037 integrity sha1-caUMhCnfync8kqOQpKA7OfzVHT4=
4018 4038
4039is-plain-object@^5.0.0:
4040 version "5.0.0"
4041 resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
4042 integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
4043
4019is-promise@^2.0.0, is-promise@^2.1: 4044is-promise@^2.0.0, is-promise@^2.1:
4020 version "2.2.2" 4045 version "2.2.2"
4021 resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1" 4046 resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
@@ -4070,16 +4095,16 @@ isarray@0.0.1, isarray@~0.0.1:
4070 resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" 4095 resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
4071 integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= 4096 integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
4072 4097
4098isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0:
4099 version "1.0.0"
4100 resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
4101 integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
4102
4073isarray@2.0.1: 4103isarray@2.0.1:
4074 version "2.0.1" 4104 version "2.0.1"
4075 resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e" 4105 resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.1.tgz#a37d94ed9cda2d59865c9f76fe596ee1f338741e"
4076 integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4= 4106 integrity sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=
4077 4107
4078isarray@^1.0.0, isarray@~1.0.0:
4079 version "1.0.0"
4080 resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
4081 integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=
4082
4083isarray@^2.0.5: 4108isarray@^2.0.5:
4084 version "2.0.5" 4109 version "2.0.5"
4085 resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723" 4110 resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
@@ -4095,6 +4120,13 @@ iso-639-3@^2.0.0:
4095 resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-2.1.0.tgz#f3733c7f2754c1bde34a8960b2a17146a4b41053" 4120 resolved "https://registry.yarnpkg.com/iso-639-3/-/iso-639-3-2.1.0.tgz#f3733c7f2754c1bde34a8960b2a17146a4b41053"
4096 integrity sha512-NYcq+YfrCFVGw/xWhRB9mhCSWxlOxYv3eK3WzWzc86P8huEZ7UDQq8Bu0zKqpZFOdq221Gy8VWWLr1aaYc+FJA== 4121 integrity sha512-NYcq+YfrCFVGw/xWhRB9mhCSWxlOxYv3eK3WzWzc86P8huEZ7UDQq8Bu0zKqpZFOdq221Gy8VWWLr1aaYc+FJA==
4097 4122
4123isobject@^2.0.0:
4124 version "2.1.0"
4125 resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89"
4126 integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=
4127 dependencies:
4128 isarray "1.0.0"
4129
4098isstream@0.1.x, isstream@~0.1.2: 4130isstream@0.1.x, isstream@~0.1.2:
4099 version "0.1.2" 4131 version "0.1.2"
4100 resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" 4132 resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@@ -4307,6 +4339,11 @@ kind-of@^3.0.2:
4307 dependencies: 4339 dependencies:
4308 is-buffer "^1.1.5" 4340 is-buffer "^1.1.5"
4309 4341
4342klona@^2.0.3:
4343 version "2.0.4"
4344 resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.4.tgz#7bb1e3affb0cb8624547ef7e8f6708ea2e39dfc0"
4345 integrity sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==
4346
4310kuler@^2.0.0: 4347kuler@^2.0.0:
4311 version "2.0.0" 4348 version "2.0.0"
4312 resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" 4349 resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3"
@@ -4376,7 +4413,15 @@ libxmljs@0.19.7:
4376 nan "~2.14.0" 4413 nan "~2.14.0"
4377 node-pre-gyp "~0.11.0" 4414 node-pre-gyp "~0.11.0"
4378 4415
4379linkify-it@3.0.2: 4416line-column@^1.0.2:
4417 version "1.0.2"
4418 resolved "https://registry.yarnpkg.com/line-column/-/line-column-1.0.2.tgz#d25af2936b6f4849172b312e4792d1d987bc34a2"
4419 integrity sha1-0lryk2tvSEkXKzEuR5LR2Ye8NKI=
4420 dependencies:
4421 isarray "^1.0.0"
4422 isobject "^2.0.0"
4423
4424linkify-it@3.0.2, linkify-it@^3.0.1:
4380 version "3.0.2" 4425 version "3.0.2"
4381 resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.2.tgz#f55eeb8bc1d3ae754049e124ab3bb56d97797fb8" 4426 resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-3.0.2.tgz#f55eeb8bc1d3ae754049e124ab3bb56d97797fb8"
4382 integrity sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ== 4427 integrity sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==
@@ -4677,6 +4722,17 @@ markdown-it-emoji@^1.4.0:
4677 resolved "https://registry.yarnpkg.com/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz#9bee0e9a990a963ba96df6980c4fddb05dfb4dcc" 4722 resolved "https://registry.yarnpkg.com/markdown-it-emoji/-/markdown-it-emoji-1.4.0.tgz#9bee0e9a990a963ba96df6980c4fddb05dfb4dcc"
4678 integrity sha1-m+4OmpkKljupbfaYDE/dsF37Tcw= 4723 integrity sha1-m+4OmpkKljupbfaYDE/dsF37Tcw=
4679 4724
4725markdown-it@11.x:
4726 version "11.0.1"
4727 resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-11.0.1.tgz#b54f15ec2a2193efa66dda1eb4173baea08993d6"
4728 integrity sha512-aU1TzmBKcWNNYvH9pjq6u92BML+Hz3h5S/QpfTFwiQF852pLT+9qHsrhM9JYipkOXZxGn+sGH8oyJE9FD9WezQ==
4729 dependencies:
4730 argparse "^1.0.7"
4731 entities "~2.0.0"
4732 linkify-it "^3.0.1"
4733 mdurl "^1.0.1"
4734 uc.micro "^1.0.5"
4735
4680marked-man@^0.7.0: 4736marked-man@^0.7.0:
4681 version "0.7.0" 4737 version "0.7.0"
4682 resolved "https://registry.yarnpkg.com/marked-man/-/marked-man-0.7.0.tgz#220ba01d275d16f1a98e4e7fc3c5eac0630c68e4" 4738 resolved "https://registry.yarnpkg.com/marked-man/-/marked-man-0.7.0.tgz#220ba01d275d16f1a98e4e7fc3c5eac0630c68e4"
@@ -4701,6 +4757,11 @@ md5@^2.2.1:
4701 crypt "0.0.2" 4757 crypt "0.0.2"
4702 is-buffer "~1.1.6" 4758 is-buffer "~1.1.6"
4703 4759
4760mdurl@^1.0.1:
4761 version "1.0.1"
4762 resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e"
4763 integrity sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=
4764
4704media-typer@0.3.0: 4765media-typer@0.3.0:
4705 version "0.3.0" 4766 version "0.3.0"
4706 resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 4767 resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
@@ -4998,6 +5059,11 @@ nan@~2.14.0:
4998 resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01" 5059 resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
4999 integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw== 5060 integrity sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==
5000 5061
5062nanoid@^3.1.16:
5063 version "3.1.16"
5064 resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.16.tgz#b21f0a7d031196faf75314d7c65d36352beeef64"
5065 integrity sha512-+AK8MN0WHji40lj8AEuwLOvLSbWYApQpre/aFJZD71r43wVRLrOYS4FmJOPQYon1TqB462RzrrxlfA74XRES8w==
5066
5001natural-compare@^1.4.0: 5067natural-compare@^1.4.0:
5002 version "1.4.0" 5068 version "1.4.0"
5003 resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 5069 resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@@ -5516,6 +5582,11 @@ parse-numeric-range@^1.2.0:
5516 resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.2.0.tgz#aa70b00f29624ed13e9f943e9461b306e386b0fa" 5582 resolved "https://registry.yarnpkg.com/parse-numeric-range/-/parse-numeric-range-1.2.0.tgz#aa70b00f29624ed13e9f943e9461b306e386b0fa"
5517 integrity sha512-1q2tXpAOplPxcl8vrIGPWz1dJxxfmdRkCFcpxxMBerDnGuuHalOWF/xj9L8Nn5XoTUoB/6F0CeQBp2fMgkOYFg== 5583 integrity sha512-1q2tXpAOplPxcl8vrIGPWz1dJxxfmdRkCFcpxxMBerDnGuuHalOWF/xj9L8Nn5XoTUoB/6F0CeQBp2fMgkOYFg==
5518 5584
5585parse-srcset@^1.0.2:
5586 version "1.0.2"
5587 resolved "https://registry.yarnpkg.com/parse-srcset/-/parse-srcset-1.0.2.tgz#f2bd221f6cc970a938d88556abc589caaaa2bde1"
5588 integrity sha1-8r0iH2zJcKk42IVWq8WJyqqiveE=
5589
5519parse-torrent@^7.0.0, parse-torrent@^7.1.3: 5590parse-torrent@^7.0.0, parse-torrent@^7.1.3:
5520 version "7.1.3" 5591 version "7.1.3"
5521 resolved "https://registry.yarnpkg.com/parse-torrent/-/parse-torrent-7.1.3.tgz#5981a0d9381b16297a7af053763068e8da5c9610" 5592 resolved "https://registry.yarnpkg.com/parse-torrent/-/parse-torrent-7.1.3.tgz#5981a0d9381b16297a7af053763068e8da5c9610"
@@ -5747,6 +5818,16 @@ pngjs@^3.0.0, pngjs@^3.3.3:
5747 resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f" 5818 resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-3.4.0.tgz#99ca7d725965fb655814eaf65f38f12bbdbf555f"
5748 integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w== 5819 integrity sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==
5749 5820
5821postcss@^8.0.2:
5822 version "8.1.6"
5823 resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.1.6.tgz#b022ba2cfb8701da234d073ed3128c5a384c35ff"
5824 integrity sha512-JuifSl4h8dJ70SiMXKjzCxhalE6p2TnMHuq9G8ftyXj2jg6SXzqCsEuxMj9RkmJoO5D+Z9YrWunNkxqpRT02qg==
5825 dependencies:
5826 colorette "^1.2.1"
5827 line-column "^1.0.2"
5828 nanoid "^3.1.16"
5829 source-map "^0.6.1"
5830
5750postgres-array@~2.0.0: 5831postgres-array@~2.0.0:
5751 version "2.0.0" 5832 version "2.0.0"
5752 resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e" 5833 resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e"
@@ -6544,6 +6625,19 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2,
6544 resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 6625 resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
6545 integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 6626 integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
6546 6627
6628sanitize-html@2.x:
6629 version "2.1.2"
6630 resolved "https://registry.yarnpkg.com/sanitize-html/-/sanitize-html-2.1.2.tgz#184fed43bb186e633c63a7769dfff29392b753a1"
6631 integrity sha512-i/h+fJal+609o6GlWFpQmAL7E5ZL4rrb0QwbDKQue2uift+4WKMe/HViRGawP4Q/UgswdDKxMqjDRrKPtCpBMg==
6632 dependencies:
6633 deepmerge "^4.2.2"
6634 escape-string-regexp "^4.0.0"
6635 htmlparser2 "^4.1.0"
6636 is-plain-object "^5.0.0"
6637 klona "^2.0.3"
6638 parse-srcset "^1.0.2"
6639 postcss "^8.0.2"
6640
6547sax@>=0.6.0, sax@^1.2.4: 6641sax@>=0.6.0, sax@^1.2.4:
6548 version "1.2.4" 6642 version "1.2.4"
6549 resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" 6643 resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
@@ -6894,7 +6988,7 @@ source-map-support@^0.5.0, source-map-support@^0.5.17:
6894 buffer-from "^1.0.0" 6988 buffer-from "^1.0.0"
6895 source-map "^0.6.0" 6989 source-map "^0.6.0"
6896 6990
6897source-map@^0.6.0, source-map@~0.6.0: 6991source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0:
6898 version "0.6.1" 6992 version "0.6.1"
6899 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 6993 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
6900 integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 6994 integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
@@ -7569,7 +7663,7 @@ typescript@^3.7.2:
7569 resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa" 7663 resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.7.tgz#98d600a5ebdc38f40cb277522f12dc800e9e25fa"
7570 integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw== 7664 integrity sha512-BLbiRkiBzAwsjut4x/dsibSTB6yWpwT5qWmC2OfuCg3GgVQCSgMs4vEctYPhsaGtd0AeuuHMkjZ2h2WG8MSzRw==
7571 7665
7572uc.micro@^1.0.1: 7666uc.micro@^1.0.1, uc.micro@^1.0.5:
7573 version "1.0.6" 7667 version "1.0.6"
7574 resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" 7668 resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac"
7575 integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== 7669 integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==