Add link previews
Change-Id: I1792958844c18b4f4a65356dd5a07e3b2b39fcbc
diff --git a/package-lock.json b/package-lock.json
index 1df4dd2..47ef570 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -50,6 +50,8 @@
"filesize": "^10.0.5",
"framer-motion": "^7.3.5",
"i18next": "^21.9.2",
+ "linkify-react": "^4.0.2",
+ "linkifyjs": "^4.0.2",
"mime": "^3.0.0",
"qrcode.react": "^3.1.0",
"react": "^18.2.0",
@@ -2497,6 +2499,17 @@
"version": "1.1.1",
"license": "ISC"
},
+ "node_modules/abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "dependencies": {
+ "event-target-shim": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6.5"
+ }
+ },
"node_modules/accepts": {
"version": "1.3.8",
"license": "MIT",
@@ -2906,7 +2919,6 @@
},
"node_modules/boolbase": {
"version": "1.0.0",
- "dev": true,
"license": "ISC"
},
"node_modules/brace-expansion": {
@@ -3190,7 +3202,6 @@
},
"node_modules/cheerio-select": {
"version": "2.1.0",
- "dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"boolbase": "^1.0.0",
@@ -3677,6 +3688,14 @@
"node": ">=10"
}
},
+ "node_modules/cross-fetch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
+ "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
+ "dependencies": {
+ "node-fetch": "2.6.7"
+ }
+ },
"node_modules/cross-spawn": {
"version": "7.0.3",
"dev": true,
@@ -3692,7 +3711,6 @@
},
"node_modules/css-select": {
"version": "5.1.0",
- "dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"boolbase": "^1.0.0",
@@ -3707,7 +3725,6 @@
},
"node_modules/css-what": {
"version": "6.1.0",
- "dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">= 6"
@@ -4020,7 +4037,6 @@
},
"node_modules/dom-serializer": {
"version": "2.0.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"domelementtype": "^2.3.0",
@@ -4033,7 +4049,6 @@
},
"node_modules/domelementtype": {
"version": "2.3.0",
- "dev": true,
"funding": [
{
"type": "github",
@@ -4044,7 +4059,6 @@
},
"node_modules/domhandler": {
"version": "5.0.3",
- "dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"domelementtype": "^2.3.0"
@@ -4058,7 +4072,6 @@
},
"node_modules/domutils": {
"version": "3.0.1",
- "dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"dom-serializer": "^2.0.0",
@@ -4227,7 +4240,6 @@
},
"node_modules/entities": {
"version": "4.4.0",
- "dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
@@ -4805,6 +4817,14 @@
"through": "~2.3.1"
}
},
+ "node_modules/event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/eventemitter2": {
"version": "6.4.7",
"dev": true,
@@ -5860,7 +5880,6 @@
},
"node_modules/htmlparser2": {
"version": "8.0.1",
- "dev": true,
"funding": [
"https://github.com/fb55/htmlparser2?sponsor=1",
{
@@ -7055,6 +7074,57 @@
"version": "1.2.4",
"license": "MIT"
},
+ "node_modules/link-preview-js": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/link-preview-js/-/link-preview-js-3.0.4.tgz",
+ "integrity": "sha512-xsuxMigAZd4xmj6BIwMNuQjjpJdh0DWeIo1NXQgaoWSi9Z/dzz/Kxy6vzzsUonFlMTPJ1i0EC8aeOg/xrOMidg==",
+ "dependencies": {
+ "abort-controller": "^3.0.0",
+ "cheerio": "1.0.0-rc.11",
+ "cross-fetch": "3.1.5",
+ "url": "0.11.0"
+ }
+ },
+ "node_modules/link-preview-js/node_modules/cheerio": {
+ "version": "1.0.0-rc.11",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz",
+ "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==",
+ "dependencies": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "htmlparser2": "^8.0.1",
+ "parse5": "^7.0.0",
+ "parse5-htmlparser2-tree-adapter": "^7.0.0",
+ "tslib": "^2.4.0"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/cheerio?sponsor=1"
+ }
+ },
+ "node_modules/link-preview-js/node_modules/tslib": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
+ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
+ },
+ "node_modules/linkify-react": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/linkify-react/-/linkify-react-4.0.2.tgz",
+ "integrity": "sha512-WFHnwOUo6EeKwrQQy1d+UjeKsv+SPQ9toPpaRIXHV1CMo+0kgZBSIsEBxQrFQIEy7WD20QD+sPwNNaJJpynN6g==",
+ "peerDependencies": {
+ "linkifyjs": "^4.0.0",
+ "react": ">= 15.0.0"
+ }
+ },
+ "node_modules/linkifyjs": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.2.tgz",
+ "integrity": "sha512-/VSoCZiglX0VMsXmL5PN3lRg45M86lrD9PskdkA2abWaTKap1bIcJ11LS4EE55bcUl9ZOR4eZ792UtQ9E/5xLA=="
+ },
"node_modules/lint-staged": {
"version": "13.0.3",
"dev": true,
@@ -7921,7 +7991,6 @@
},
"node_modules/nth-check": {
"version": "2.1.1",
- "dev": true,
"license": "BSD-2-Clause",
"dependencies": {
"boolbase": "^1.0.0"
@@ -8187,7 +8256,6 @@
},
"node_modules/parse5": {
"version": "7.1.1",
- "dev": true,
"license": "MIT",
"dependencies": {
"entities": "^4.4.0"
@@ -8198,7 +8266,6 @@
},
"node_modules/parse5-htmlparser2-tree-adapter": {
"version": "7.0.0",
- "dev": true,
"license": "MIT",
"dependencies": {
"domhandler": "^5.0.2",
@@ -8528,6 +8595,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==",
+ "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.",
+ "engines": {
+ "node": ">=0.4.x"
+ }
+ },
"node_modules/queue-microtask": {
"version": "1.2.3",
"dev": true,
@@ -10090,6 +10166,20 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
+ "dependencies": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ }
+ },
+ "node_modules/url/node_modules/punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw=="
+ },
"node_modules/use-sync-external-store": {
"version": "1.2.0",
"license": "MIT",
@@ -10633,6 +10723,8 @@
"express-async-handler": "^1.2.0",
"helmet": "^6.0.0",
"jose": "^4.10.0",
+ "link-preview-js": "^3.0.4",
+ "linkifyjs": "^4.0.2",
"loglevel": "^1.8.0",
"reflect-metadata": "^0.1.13",
"rxjs": "^7.5.7",
@@ -12154,6 +12246,14 @@
"abbrev": {
"version": "1.1.1"
},
+ "abort-controller": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
+ "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
+ "requires": {
+ "event-target-shim": "^5.0.0"
+ }
+ },
"accepts": {
"version": "1.3.8",
"requires": {
@@ -12408,8 +12508,7 @@
}
},
"boolbase": {
- "version": "1.0.0",
- "dev": true
+ "version": "1.0.0"
},
"brace-expansion": {
"version": "1.1.11",
@@ -12572,7 +12671,6 @@
},
"cheerio-select": {
"version": "2.1.0",
- "dev": true,
"requires": {
"boolbase": "^1.0.0",
"css-select": "^5.1.0",
@@ -12881,6 +12979,14 @@
"yaml": "^1.10.0"
}
},
+ "cross-fetch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz",
+ "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==",
+ "requires": {
+ "node-fetch": "2.6.7"
+ }
+ },
"cross-spawn": {
"version": "7.0.3",
"dev": true,
@@ -12892,7 +12998,6 @@
},
"css-select": {
"version": "5.1.0",
- "dev": true,
"requires": {
"boolbase": "^1.0.0",
"css-what": "^6.1.0",
@@ -12902,8 +13007,7 @@
}
},
"css-what": {
- "version": "6.1.0",
- "dev": true
+ "version": "6.1.0"
},
"css.escape": {
"version": "1.5.1"
@@ -13098,7 +13202,6 @@
},
"dom-serializer": {
"version": "2.0.0",
- "dev": true,
"requires": {
"domelementtype": "^2.3.0",
"domhandler": "^5.0.2",
@@ -13106,19 +13209,16 @@
}
},
"domelementtype": {
- "version": "2.3.0",
- "dev": true
+ "version": "2.3.0"
},
"domhandler": {
"version": "5.0.3",
- "dev": true,
"requires": {
"domelementtype": "^2.3.0"
}
},
"domutils": {
"version": "3.0.1",
- "dev": true,
"requires": {
"dom-serializer": "^2.0.0",
"domelementtype": "^2.3.0",
@@ -13250,8 +13350,7 @@
"dev": true
},
"entities": {
- "version": "4.4.0",
- "dev": true
+ "version": "4.4.0"
},
"eol": {
"version": "0.9.1",
@@ -13625,6 +13724,11 @@
"through": "~2.3.1"
}
},
+ "event-target-shim": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
+ },
"eventemitter2": {
"version": "6.4.7",
"dev": true
@@ -14387,7 +14491,6 @@
},
"htmlparser2": {
"version": "8.0.1",
- "dev": true,
"requires": {
"domelementtype": "^2.3.0",
"domhandler": "^5.0.2",
@@ -14766,6 +14869,8 @@
"framer-motion": "^7.3.5",
"i18next": "^21.9.2",
"i18next-parser": "^6.5.0",
+ "linkify-react": "^4.0.2",
+ "linkifyjs": "^4.0.2",
"mime": "^3.0.0",
"qrcode.react": "^3.1.0",
"react": "^18.2.0",
@@ -14812,6 +14917,8 @@
"express-async-handler": "^1.2.0",
"helmet": "^6.0.0",
"jose": "^4.10.0",
+ "link-preview-js": "^3.0.4",
+ "linkifyjs": "^4.0.2",
"loglevel": "^1.8.0",
"reflect-metadata": "^0.1.13",
"rxjs": "^7.5.7",
@@ -15175,6 +15282,50 @@
"lines-and-columns": {
"version": "1.2.4"
},
+ "link-preview-js": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/link-preview-js/-/link-preview-js-3.0.4.tgz",
+ "integrity": "sha512-xsuxMigAZd4xmj6BIwMNuQjjpJdh0DWeIo1NXQgaoWSi9Z/dzz/Kxy6vzzsUonFlMTPJ1i0EC8aeOg/xrOMidg==",
+ "requires": {
+ "abort-controller": "^3.0.0",
+ "cheerio": "1.0.0-rc.11",
+ "cross-fetch": "3.1.5",
+ "url": "0.11.0"
+ },
+ "dependencies": {
+ "cheerio": {
+ "version": "1.0.0-rc.11",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.11.tgz",
+ "integrity": "sha512-bQwNaDIBKID5ts/DsdhxrjqFXYfLw4ste+wMKqWA8DyKcS4qwsPP4Bk8ZNaTJjvpiX/qW3BT4sU7d6Bh5i+dag==",
+ "requires": {
+ "cheerio-select": "^2.1.0",
+ "dom-serializer": "^2.0.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.0.1",
+ "htmlparser2": "^8.0.1",
+ "parse5": "^7.0.0",
+ "parse5-htmlparser2-tree-adapter": "^7.0.0",
+ "tslib": "^2.4.0"
+ }
+ },
+ "tslib": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz",
+ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA=="
+ }
+ }
+ },
+ "linkify-react": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/linkify-react/-/linkify-react-4.0.2.tgz",
+ "integrity": "sha512-WFHnwOUo6EeKwrQQy1d+UjeKsv+SPQ9toPpaRIXHV1CMo+0kgZBSIsEBxQrFQIEy7WD20QD+sPwNNaJJpynN6g==",
+ "requires": {}
+ },
+ "linkifyjs": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.0.2.tgz",
+ "integrity": "sha512-/VSoCZiglX0VMsXmL5PN3lRg45M86lrD9PskdkA2abWaTKap1bIcJ11LS4EE55bcUl9ZOR4eZ792UtQ9E/5xLA=="
+ },
"lint-staged": {
"version": "13.0.3",
"dev": true,
@@ -15678,7 +15829,6 @@
},
"nth-check": {
"version": "2.1.1",
- "dev": true,
"requires": {
"boolbase": "^1.0.0"
}
@@ -15852,14 +16002,12 @@
},
"parse5": {
"version": "7.1.1",
- "dev": true,
"requires": {
"entities": "^4.4.0"
}
},
"parse5-htmlparser2-tree-adapter": {
"version": "7.0.0",
- "dev": true,
"requires": {
"domhandler": "^5.0.2",
"parse5": "^7.0.0"
@@ -16063,6 +16211,11 @@
"side-channel": "^1.0.4"
}
},
+ "querystring": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
+ "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g=="
+ },
"queue-microtask": {
"version": "1.2.3",
"dev": true
@@ -17065,6 +17218,22 @@
"punycode": "^2.1.0"
}
},
+ "url": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
+ "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==",
+ "requires": {
+ "punycode": "1.3.2",
+ "querystring": "0.2.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
+ "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw=="
+ }
+ }
+ },
"use-sync-external-store": {
"version": "1.2.0",
"requires": {}