From 52c185eabfd4ec2dae30d7101bdc70a665bd2d13 Mon Sep 17 00:00:00 2001 From: DIYgod Date: Tue, 23 Aug 2022 15:18:48 +0100 Subject: [PATCH] feat: use ipfs protocol in content and change ipfs service --- package.json | 5 +- pnpm-lock.yaml | 414 ++++++++++++++++++++--- src/components/common/BlockchainInfo.tsx | 8 +- src/components/ui/Avatar.tsx | 6 +- src/lib/ipfs-parser.ts | 13 + src/lib/upload-file.ts | 29 +- src/markdown/rehype-image.ts | 7 +- src/markdown/rehyper-external-link.ts | 7 +- 8 files changed, 419 insertions(+), 70 deletions(-) create mode 100644 src/lib/ipfs-parser.ts diff --git a/package.json b/package.json index 6c954aa4..271c9db7 100644 --- a/package.json +++ b/package.json @@ -42,10 +42,11 @@ "@trpc/server": "^9.23.2", "@web-std/form-data": "^3.0.2", "async-busboy": "^1.1.0", + "axios": "^0.27.2", "busboy": "^1.6.0", "clsx": "^1.1.1", "cookie": "^0.5.0", - "crossbell.js": "^0.10.17", + "crossbell.js": "^0.10.20", "dayjs": "^1.11.1", "dotenv": "^16.0.0", "emoji-mart": "^5.2.0", @@ -77,7 +78,7 @@ "remark-rehype": "^10.1.0", "sortablejs": "^1.15.0", "ua-parser-js": "^1.0.2", - "unidata.js": "^0.6.14", + "unidata.js": "^0.6.16", "unified": "^10.1.2", "unist-builder": "^3.0.0", "unist-util-visit": "^4.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 12b47be6..88e56bf4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,11 +46,12 @@ specifiers: '@web-std/form-data': ^3.0.2 async-busboy: ^1.1.0 autoprefixer: ^10.4.7 + axios: ^0.27.2 busboy: ^1.6.0 clsx: ^1.1.1 cookie: ^0.5.0 cross-spawn: ^7.0.3 - crossbell.js: ^0.10.17 + crossbell.js: ^0.10.20 dayjs: ^1.11.1 dotenv: ^16.0.0 emoji-mart: ^5.2.0 @@ -93,7 +94,7 @@ specifiers: tailwindcss: ^3.0.24 typescript: ^4.5.5 ua-parser-js: ^1.0.2 - unidata.js: ^0.6.14 + unidata.js: ^0.6.16 unified: ^10.1.2 unist-builder: ^3.0.0 unist-util-visit: ^4.1.0 @@ -130,10 +131,11 @@ dependencies: '@trpc/server': 9.25.3 '@web-std/form-data': 3.0.2 async-busboy: 1.1.0 + axios: 0.27.2 busboy: 1.6.0 clsx: 1.1.1 cookie: 0.5.0 - crossbell.js: 0.10.17 + crossbell.js: 0.10.20 dayjs: 1.11.3 dotenv: 16.0.1 emoji-mart: 5.2.0 @@ -165,7 +167,7 @@ dependencies: remark-rehype: 10.1.0 sortablejs: 1.15.0 ua-parser-js: 1.0.2 - unidata.js: 0.6.14 + unidata.js: 0.6.16 unified: 10.1.2 unist-builder: 3.0.0 unist-util-visit: 4.1.0 @@ -676,6 +678,20 @@ packages: '@ethersproject/strings': 5.6.1 dev: false + /@ethersproject/abi/5.7.0: + resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + /@ethersproject/abstract-provider/5.6.1: resolution: {integrity: sha512-BxlIgogYJtp1FS8Muvj8YfdClk3unZH0vRMVX791Z9INBNT/kuACZ9GzaY1Y4yFq+YSy6/w4gzj3HCRKrK9hsQ==} dependencies: @@ -688,6 +704,18 @@ packages: '@ethersproject/web': 5.6.1 dev: false + /@ethersproject/abstract-provider/5.7.0: + resolution: {integrity: sha512-R41c9UkchKCpAqStMYUpdunjo3pkEvZC3FAwZn5S5MGbXoMQOHIdHItezTETxAO5bevtMApSyEhn9+CHcDsWBw==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.0 + dev: false + /@ethersproject/abstract-signer/5.6.2: resolution: {integrity: sha512-n1r6lttFBG0t2vNiI3HoWaS/KdOt8xyDjzlP2cuevlWLG6EX0OwcKLyG/Kp/cuwNxdy/ous+R/DEMdTUwWQIjQ==} dependencies: @@ -698,6 +726,16 @@ packages: '@ethersproject/properties': 5.6.0 dev: false + /@ethersproject/abstract-signer/5.7.0: + resolution: {integrity: sha512-a16V8bq1/Cz+TGCkE2OPMTOUDLS3grCpdjoJCYNnVBbdYEMSgKrU0+B90s8b6H+ByYTBZN7a3g76jdIJi7UfKQ==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: false + /@ethersproject/address/5.6.1: resolution: {integrity: sha512-uOgF0kS5MJv9ZvCz7x6T2EXJSzotiybApn4XlOgoTX0xdtyVIJ7pF+6cGPxiEq/dpBiTfMiw7Yc81JcwhSYA0Q==} dependencies: @@ -708,12 +746,28 @@ packages: '@ethersproject/rlp': 5.6.1 dev: false + /@ethersproject/address/5.7.0: + resolution: {integrity: sha512-9wYhYt7aghVGo758POM5nqcOMaE168Q6aRLJZwUmiqSrAungkG74gSSeKEIR7ukixesdRZGPgVqme6vmxs1fkA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/rlp': 5.7.0 + dev: false + /@ethersproject/base64/5.6.1: resolution: {integrity: sha512-qB76rjop6a0RIYYMiB4Eh/8n+Hxu2NIZm8S/Q7kNo5pmZfXhHGHmS4MinUainiBC54SCyRnwzL+KZjj8zbsSsw==} dependencies: '@ethersproject/bytes': 5.6.1 dev: false + /@ethersproject/base64/5.7.0: + resolution: {integrity: sha512-Dr8tcHt2mEbsZr/mwTPIQAf3Ai0Bks/7gTw9dSqk1mQvhW3XvRlmDJr/4n+wg1JmCl16NZue17CDh8xb/vZ0sQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + dev: false + /@ethersproject/basex/5.6.1: resolution: {integrity: sha512-a52MkVz4vuBXR06nvflPMotld1FJWSj2QT0985v7P/emPZO00PucFAkbcmq2vpVU7Ts7umKiSI6SppiLykVWsA==} dependencies: @@ -721,6 +775,13 @@ packages: '@ethersproject/properties': 5.6.0 dev: false + /@ethersproject/basex/5.7.0: + resolution: {integrity: sha512-ywlh43GwZLv2Voc2gQVTKBoVQ1mti3d8HK5aMxsfu/nRDnMmNqaSJ3r3n85HBByT8OpoY96SXM1FogC533T4zw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/properties': 5.7.0 + dev: false + /@ethersproject/bignumber/5.6.2: resolution: {integrity: sha512-v7+EEUbhGqT3XJ9LMPsKvXYHFc8eHxTowFCG/HgJErmq4XHJ2WR7aeyICg3uTOAQ7Icn0GFHAohXEhxQHq4Ubw==} dependencies: @@ -729,18 +790,38 @@ packages: bn.js: 5.2.1 dev: false + /@ethersproject/bignumber/5.7.0: + resolution: {integrity: sha512-n1CAdIHRWjSucQO3MC1zPSVgV/6dy/fjL9pMrPP9peL+QxEg9wOsVqwD4+818B6LUEtaXzVHQiuivzRoxPxUGw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + bn.js: 5.2.1 + dev: false + /@ethersproject/bytes/5.6.1: resolution: {integrity: sha512-NwQt7cKn5+ZE4uDn+X5RAXLp46E1chXoaMmrxAyA0rblpxz8t58lVkrHXoRIn0lz1joQElQ8410GqhTqMOwc6g==} dependencies: '@ethersproject/logger': 5.6.0 dev: false + /@ethersproject/bytes/5.7.0: + resolution: {integrity: sha512-nsbxwgFXWh9NyYWo+U8atvmMsSdKJprTcICAkvbBffT75qDocbuggBU0SJiVK2MuTrp0q+xvLkTnGMPK1+uA9A==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + /@ethersproject/constants/5.6.1: resolution: {integrity: sha512-QSq9WVnZbxXYFftrjSjZDUshp6/eKp6qrtdBtUCm0QxCV5z1fG/w3kdlcsjMCQuQHUnAclKoK7XpXMezhRDOLg==} dependencies: '@ethersproject/bignumber': 5.6.2 dev: false + /@ethersproject/constants/5.7.0: + resolution: {integrity: sha512-DHI+y5dBNvkpYUMiRQyxRBYBefZkJfo70VUkUAsRjcPs47muV9evftfZ0PJVCXYbAiCgght0DtcF9srFQmIgWA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + dev: false + /@ethersproject/contracts/5.6.2: resolution: {integrity: sha512-hguUA57BIKi6WY0kHvZp6PwPlWF87MCeB4B7Z7AbUpTxfFXFdn/3b0GmjZPagIHS+3yhcBJDnuEfU4Xz+Ks/8g==} dependencies: @@ -756,6 +837,21 @@ packages: '@ethersproject/transactions': 5.6.2 dev: false + /@ethersproject/contracts/5.7.0: + resolution: {integrity: sha512-5GJbzEU3X+d33CdfPhcyS+z8MzsTrBGk/sc+G+59+tPa9yFkl6HQ9D6L0QMgNTA9q8dT0XKxxkyp883XsQvbbg==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/transactions': 5.7.0 + dev: false + /@ethersproject/hash/5.6.1: resolution: {integrity: sha512-L1xAHurbaxG8VVul4ankNX5HgQ8PNCTrnVXEiFnE9xoRnaUcgfD12tZINtDinSllxPLCtGwguQxJ5E6keE84pA==} dependencies: @@ -769,6 +865,20 @@ packages: '@ethersproject/strings': 5.6.1 dev: false + /@ethersproject/hash/5.7.0: + resolution: {integrity: sha512-qX5WrQfnah1EFnO5zJv1v46a8HW0+E5xuBBDTwMFZLuVTx0tbU2kkx15NqdjxecrLGatQN9FGQKpb1FKdHCt+g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + /@ethersproject/hdnode/5.6.2: resolution: {integrity: sha512-tERxW8Ccf9CxW2db3WsN01Qao3wFeRsfYY9TCuhmG0xNpl2IO8wgXU3HtWIZ49gUWPggRy4Yg5axU0ACaEKf1Q==} dependencies: @@ -786,6 +896,23 @@ packages: '@ethersproject/wordlists': 5.6.1 dev: false + /@ethersproject/hdnode/5.7.0: + resolution: {integrity: sha512-OmyYo9EENBPPf4ERhR7oj6uAtUAhYGqOnIS+jE5pTXvdKBS99ikzq1E7Iv0ZQZ5V36Lqx1qZLeak0Ra16qpeOg==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: false + /@ethersproject/json-wallets/5.6.1: resolution: {integrity: sha512-KfyJ6Zwz3kGeX25nLihPwZYlDqamO6pfGKNnVMWWfEVVp42lTfCZVXXy5Ie8IZTN0HKwAngpIPi7gk4IJzgmqQ==} dependencies: @@ -804,6 +931,24 @@ packages: scrypt-js: 3.0.1 dev: false + /@ethersproject/json-wallets/5.7.0: + resolution: {integrity: sha512-8oee5Xgu6+RKgJTkvEMl2wDgSPSAQ9MB/3JYjFV9jlKvcYHUXZC+cQp0njgmxdHkYWn8s6/IqIZYm0YWCjO/0g==} + dependencies: + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + dev: false + /@ethersproject/keccak256/5.6.1: resolution: {integrity: sha512-bB7DQHCTRDooZZdL3lk9wpL0+XuG3XLGHLh3cePnybsO3V0rdCAOQGpn/0R3aODmnTOOkCATJiD2hnL+5bwthA==} dependencies: @@ -811,16 +956,33 @@ packages: js-sha3: 0.8.0 dev: false + /@ethersproject/keccak256/5.7.0: + resolution: {integrity: sha512-2UcPboeL/iW+pSg6vZ6ydF8tCnv3Iu/8tUmLLzWWGzxWKFFqOBQFLo6uLUv6BDrLgCDfN28RJ/wtByx+jZ4KBg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + js-sha3: 0.8.0 + dev: false + /@ethersproject/logger/5.6.0: resolution: {integrity: sha512-BiBWllUROH9w+P21RzoxJKzqoqpkyM1pRnEKG69bulE9TSQD8SAIvTQqIMZmmCO8pUNkgLP1wndX1gKghSpBmg==} dev: false + /@ethersproject/logger/5.7.0: + resolution: {integrity: sha512-0odtFdXu/XHtjQXJYA3u9G0G8btm0ND5Cu8M7i5vhEcE8/HmF4Lbdqanwyv4uQTr2tx6b7fQRmgLrsnpQlmnig==} + dev: false + /@ethersproject/networks/5.6.4: resolution: {integrity: sha512-KShHeHPahHI2UlWdtDMn2lJETcbtaJge4k7XSjDR9h79QTd6yQJmv6Cp2ZA4JdqWnhszAOLSuJEd9C0PRw7hSQ==} dependencies: '@ethersproject/logger': 5.6.0 dev: false + /@ethersproject/networks/5.7.0: + resolution: {integrity: sha512-MG6oHSQHd4ebvJrleEQQ4HhVu8Ichr0RDYEfHzsVAVjHNM+w36x9wp9r+hf1JstMXtseXDtkiVoARAG6M959AA==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + /@ethersproject/pbkdf2/5.6.1: resolution: {integrity: sha512-k4gRQ+D93zDRPNUfmduNKq065uadC2YjMP/CqwwX5qG6R05f47boq6pLZtV/RnC4NZAYOPH1Cyo54q0c9sshRQ==} dependencies: @@ -828,12 +990,25 @@ packages: '@ethersproject/sha2': 5.6.1 dev: false + /@ethersproject/pbkdf2/5.7.0: + resolution: {integrity: sha512-oR/dBRZR6GTyaofd86DehG72hY6NpAjhabkhxgr3X2FpJtJuodEl2auADWBZfhDHgVCbu3/H/Ocq2uC6dpNjjw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/sha2': 5.7.0 + dev: false + /@ethersproject/properties/5.6.0: resolution: {integrity: sha512-szoOkHskajKePTJSZ46uHUWWkbv7TzP2ypdEK6jGMqJaEt2sb0jCgfBo0gH0m2HBpRixMuJ6TBRaQCF7a9DoCg==} dependencies: '@ethersproject/logger': 5.6.0 dev: false + /@ethersproject/properties/5.7.0: + resolution: {integrity: sha512-J87jy8suntrAkIZtecpxEPxY//szqr1mlBaYlQ0r4RCaiD2hjheqF9s1LVE8vVuJCXisjIP+JgtK/Do54ej4Sw==} + dependencies: + '@ethersproject/logger': 5.7.0 + dev: false + /@ethersproject/providers/5.6.8: resolution: {integrity: sha512-Wf+CseT/iOJjrGtAOf3ck9zS7AgPmr2fZ3N97r4+YXN3mBePTG2/bJ8DApl9mVwYL+RpYbNxMEkEp4mPGdwG/w==} dependencies: @@ -862,6 +1037,34 @@ packages: - utf-8-validate dev: false + /@ethersproject/providers/5.7.0: + resolution: {integrity: sha512-+TTrrINMzZ0aXtlwO/95uhAggKm4USLm1PbeCBR/3XZ7+Oey+3pMyddzZEyRhizHpy1HXV0FRWRMI1O3EGYibA==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/web': 5.7.0 + bech32: 1.1.4 + ws: 7.4.6 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /@ethersproject/random/5.6.1: resolution: {integrity: sha512-/wtPNHwbmng+5yi3fkipA8YBT59DdkGRoC2vWk09Dci/q5DlgnMkhIycjHlavrvrjJBkFjO/ueLyT+aUDfc4lA==} dependencies: @@ -869,6 +1072,13 @@ packages: '@ethersproject/logger': 5.6.0 dev: false + /@ethersproject/random/5.7.0: + resolution: {integrity: sha512-19WjScqRA8IIeWclFme75VMXSBvi4e6InrUNuaR4s5pTF2qNhcGdCUwdxUVGtDDqC00sDLCO93jPQoDUH4HVmQ==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + /@ethersproject/rlp/5.6.1: resolution: {integrity: sha512-uYjmcZx+DKlFUk7a5/W9aQVaoEC7+1MOBgNtvNg13+RnuUwT4F0zTovC0tmay5SmRslb29V1B7Y5KCri46WhuQ==} dependencies: @@ -876,6 +1086,13 @@ packages: '@ethersproject/logger': 5.6.0 dev: false + /@ethersproject/rlp/5.7.0: + resolution: {integrity: sha512-rBxzX2vK8mVF7b0Tol44t5Tb8gomOHkj5guL+HhzQ1yBh/ydjGnpw6at+X6Iw0Kp3OzzzkcKp8N9r0W4kYSs9w==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + /@ethersproject/sha2/5.6.1: resolution: {integrity: sha512-5K2GyqcW7G4Yo3uenHegbXRPDgARpWUiXc6RiF7b6i/HXUoWlb7uCARh7BAHg7/qT/Q5ydofNwiZcim9qpjB6g==} dependencies: @@ -884,6 +1101,14 @@ packages: hash.js: 1.1.7 dev: false + /@ethersproject/sha2/5.7.0: + resolution: {integrity: sha512-gKlH42riwb3KYp0reLsFTokByAKoJdgFCwI+CCiX/k+Jm2mbNs6oOaCjYQSlI1+XBVejwH2KrmCbMAT/GnRDQw==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + hash.js: 1.1.7 + dev: false + /@ethersproject/signing-key/5.6.2: resolution: {integrity: sha512-jVbu0RuP7EFpw82vHcL+GP35+KaNruVAZM90GxgQnGqB6crhBqW/ozBfFvdeImtmb4qPko0uxXjn8l9jpn0cwQ==} dependencies: @@ -895,6 +1120,17 @@ packages: hash.js: 1.1.7 dev: false + /@ethersproject/signing-key/5.7.0: + resolution: {integrity: sha512-MZdy2nL3wO0u7gkB4nA/pEf8lu1TlFswPNmy8AiYkfKTdO6eXBJyUdmHO/ehm/htHw9K/qF8ujnTyUAD+Ry54Q==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + bn.js: 5.2.1 + elliptic: 6.5.4 + hash.js: 1.1.7 + dev: false + /@ethersproject/solidity/5.6.1: resolution: {integrity: sha512-KWqVLkUUoLBfL1iwdzUVlkNqAUIFMpbbeH0rgCfKmJp0vFtY4AsaN91gHKo9ZZLkC4UOm3cI3BmMV4N53BOq4g==} dependencies: @@ -906,6 +1142,17 @@ packages: '@ethersproject/strings': 5.6.1 dev: false + /@ethersproject/solidity/5.7.0: + resolution: {integrity: sha512-HmabMd2Dt/raavyaGukF4XxizWKhKQ24DoLtdNbBmNKUOPqwjsKQSdV9GQtj9CBEea9DlzETlVER1gYeXXBGaA==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + /@ethersproject/strings/5.6.1: resolution: {integrity: sha512-2X1Lgk6Jyfg26MUnsHiT456U9ijxKUybz8IM1Vih+NJxYtXhmvKBcHOmvGqpFSVJ0nQ4ZCoIViR8XlRw1v/+Cw==} dependencies: @@ -914,6 +1161,14 @@ packages: '@ethersproject/logger': 5.6.0 dev: false + /@ethersproject/strings/5.7.0: + resolution: {integrity: sha512-/9nu+lj0YswRNSH0NXYqrh8775XNyEdUQAuf3f+SmOrnVewcJ5SBNAjF7lpgehKi4abvNNXyf+HX86czCdJ8Mg==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + /@ethersproject/transactions/5.6.2: resolution: {integrity: sha512-BuV63IRPHmJvthNkkt9G70Ullx6AcM+SDc+a8Aw/8Yew6YwT51TcBKEp1P4oOQ/bP25I18JJr7rcFRgFtU9B2Q==} dependencies: @@ -928,6 +1183,20 @@ packages: '@ethersproject/signing-key': 5.6.2 dev: false + /@ethersproject/transactions/5.7.0: + resolution: {integrity: sha512-kmcNicCp1lp8qanMTC3RIikGgoJ80ztTyvtsFvCYpSCfkjhD0jZ2LOrnbcuxuToLIUYYf+4XwD1rP+B/erDIhQ==} + dependencies: + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + dev: false + /@ethersproject/units/5.6.1: resolution: {integrity: sha512-rEfSEvMQ7obcx3KWD5EWWx77gqv54K6BKiZzKxkQJqtpriVsICrktIQmKl8ReNToPeIYPnFHpXvKpi068YFZXw==} dependencies: @@ -936,6 +1205,14 @@ packages: '@ethersproject/logger': 5.6.0 dev: false + /@ethersproject/units/5.7.0: + resolution: {integrity: sha512-pD3xLMy3SJu9kG5xDGI7+xhTEmGXlEqXU4OfNapmfnxLVY4EMSSRp7j1k7eezutBPH7RBN/7QPnwR7hzNlEFeg==} + dependencies: + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/logger': 5.7.0 + dev: false + /@ethersproject/wallet/5.6.2: resolution: {integrity: sha512-lrgh0FDQPuOnHcF80Q3gHYsSUODp6aJLAdDmDV0xKCN/T7D99ta1jGVhulg3PY8wiXEngD0DfM0I2XKXlrqJfg==} dependencies: @@ -956,6 +1233,26 @@ packages: '@ethersproject/wordlists': 5.6.1 dev: false + /@ethersproject/wallet/5.7.0: + resolution: {integrity: sha512-MhmXlJXEJFBFVKrDLB4ZdDzxcBxQ3rLyCkhNqVu3CDYvR97E+8r01UgrI+TI99Le+aYm/in/0vp86guJuM7FCA==} + dependencies: + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + dev: false + /@ethersproject/web/5.6.1: resolution: {integrity: sha512-/vSyzaQlNXkO1WV+RneYKqCJwualcUdx/Z3gseVovZP0wIlOFcCE1hkRhKBH8ImKbGQbMl9EAAyJFrJu7V0aqA==} dependencies: @@ -966,6 +1263,16 @@ packages: '@ethersproject/strings': 5.6.1 dev: false + /@ethersproject/web/5.7.0: + resolution: {integrity: sha512-ApHcbbj+muRASVDSCl/tgxaH2LBkRMEYfLOLVa0COipx0+nlu0QKet7U2lEg0vdkh8XRSLf2nd1f1Uk9SrVSGA==} + dependencies: + '@ethersproject/base64': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + /@ethersproject/wordlists/5.6.1: resolution: {integrity: sha512-wiPRgBpNbNwCQFoCr8bcWO8o5I810cqO6mkdtKfLKFlLxeCWcnzDi4Alu8iyNzlhYuS9npCwivMbRWF19dyblw==} dependencies: @@ -976,6 +1283,16 @@ packages: '@ethersproject/strings': 5.6.1 dev: false + /@ethersproject/wordlists/5.7.0: + resolution: {integrity: sha512-S2TFNJNfHWVHNE6cNDjbVlZ6MgE17MIxMbMg2zv3wn+3XSJGosL1m9ZVv3GXCf/2ymSsQ+hRI5IzoMJTG6aoVA==} + dependencies: + '@ethersproject/bytes': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/strings': 5.7.0 + dev: false + /@floating-ui/core/0.7.3: resolution: {integrity: sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg==} dev: false @@ -1685,8 +2002,8 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/lodash/4.14.183: - resolution: {integrity: sha512-UXavyuxzXKMqJPEpFPri6Ku5F9af6ZJXUneHhvQJxavrEjuHkFp2YnDWHcxJiG7hk8ZkWqjcyNeW1s/smZv5cw==} + /@types/lodash/4.14.184: + resolution: {integrity: sha512-RoZphVtHbxPZizt4IcILciSWiC6dcn+eZ8oX9IWEYfDMcocdd42f7NPI6fQj+6zI8y4E0L7gu2pcZKLGTRaV9Q==} dev: false /@types/long/4.0.2: @@ -3199,11 +3516,11 @@ packages: which: 2.0.2 dev: true - /crossbell.js/0.10.17: - resolution: {integrity: sha512-BRgclp6m0QsI9eA48mlBXaIIEBnYYNOW3hJPnegPqqrtaWafSdJhJPLP/qoKY13YdGEQBLszpjivrRYc+GKFhA==} + /crossbell.js/0.10.20: + resolution: {integrity: sha512-OdXWPA2kAETDnKzola8n1aZnwQjvu/3gIMXp4cGD7YnMTTYWALwJyvWVaTya4JnDWhX6xgAtx/ZTExKD6rlUXQ==} dependencies: async-retry: 1.3.3 - ethers: 5.6.9 + ethers: 5.7.0 fetch-undici: 3.0.1 is-ipfs: 6.0.2 query-string: 7.1.1 @@ -4315,6 +4632,44 @@ packages: - utf-8-validate dev: false + /ethers/5.7.0: + resolution: {integrity: sha512-5Xhzp2ZQRi0Em+0OkOcRHxPzCfoBfgtOQA+RUylSkuHbhTEaQklnYi2hsWbRgs3ztJsXVXd9VKBcO1ScWL8YfA==} + dependencies: + '@ethersproject/abi': 5.7.0 + '@ethersproject/abstract-provider': 5.7.0 + '@ethersproject/abstract-signer': 5.7.0 + '@ethersproject/address': 5.7.0 + '@ethersproject/base64': 5.7.0 + '@ethersproject/basex': 5.7.0 + '@ethersproject/bignumber': 5.7.0 + '@ethersproject/bytes': 5.7.0 + '@ethersproject/constants': 5.7.0 + '@ethersproject/contracts': 5.7.0 + '@ethersproject/hash': 5.7.0 + '@ethersproject/hdnode': 5.7.0 + '@ethersproject/json-wallets': 5.7.0 + '@ethersproject/keccak256': 5.7.0 + '@ethersproject/logger': 5.7.0 + '@ethersproject/networks': 5.7.0 + '@ethersproject/pbkdf2': 5.7.0 + '@ethersproject/properties': 5.7.0 + '@ethersproject/providers': 5.7.0 + '@ethersproject/random': 5.7.0 + '@ethersproject/rlp': 5.7.0 + '@ethersproject/sha2': 5.7.0 + '@ethersproject/signing-key': 5.7.0 + '@ethersproject/solidity': 5.7.0 + '@ethersproject/strings': 5.7.0 + '@ethersproject/transactions': 5.7.0 + '@ethersproject/units': 5.7.0 + '@ethersproject/wallet': 5.7.0 + '@ethersproject/web': 5.7.0 + '@ethersproject/wordlists': 5.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + /ethjs-unit/0.1.6: resolution: {integrity: sha512-/Sn9Y0oKl0uqQuvgFk/zQgR7aw1g36qX/jzSQ5lSwlO0GigPymk4eGQfeNTD03w1dPOqfz8V77Cy43jH56pagw==} engines: {node: '>=6.5.0', npm: '>=3'} @@ -6399,8 +6754,8 @@ packages: dns-over-http-resolver: 1.2.3 err-code: 3.0.1 is-ip: 3.1.0 - multiformats: 9.7.0 - uint8arrays: 3.0.0 + multiformats: 9.7.1 + uint8arrays: 3.1.0 varint: 6.0.0 transitivePeerDependencies: - node-fetch @@ -7710,7 +8065,7 @@ packages: dependencies: elliptic: 6.5.4 node-addon-api: 2.0.2 - node-gyp-build: 4.4.0 + node-gyp-build: 4.5.0 dev: false /semver/5.7.1: @@ -8310,23 +8665,21 @@ packages: engines: {node: '>=12.18'} dev: false - /unidata.js/0.6.14: - resolution: {integrity: sha512-T6aQfebvrG+Y67z1a5lKHo6cf5yRL5quO9xqphxmFY1wS+0aOdaFc2TDRSdwnOGEWGtr/rEkPVzDiLUGJMpZCw==} + /unidata.js/0.6.16: + resolution: {integrity: sha512-dlIc0B89w97H3YWoisJuOHbUKcGHy0R8QvxPd1/eUdQ/KdKALVjLMQZYnrjs7X1xptUf2LLF0auKwWtU2MaaHg==} dependencies: - '@types/lodash': 4.14.183 + '@types/lodash': 4.14.184 '@urql/core': 2.5.0_graphql@16.5.0 axios: 0.27.2 - crossbell.js: 0.10.17 + crossbell.js: 0.10.20 ethers: 5.6.9 graphql: 16.5.0 lodash: 4.17.21 lodash-es: 4.17.21 mime: 3.0.0 - web3.storage: 4.2.0 transitivePeerDependencies: - bufferutil - debug - - encoding - node-fetch - supports-color - utf-8-validate @@ -8764,31 +9117,6 @@ packages: utf8: 3.0.0 dev: false - /web3.storage/4.2.0: - resolution: {integrity: sha512-s7yf9nR9TsnKyPdijQMq48q7NV9WNZ8AWyMroa1F0ZOVExUpx9DVIxsLCCZRJEuMZsitnLSbvXK2CexMNyYKKg==} - dependencies: - '@ipld/car': 3.2.4 - '@web-std/blob': 3.0.4 - '@web-std/fetch': 3.0.3 - '@web-std/file': 3.0.2 - '@web3-storage/parse-link-header': 3.1.0 - browser-readablestream-to-it: 1.0.3 - carbites: 1.0.6 - cborg: 1.9.4 - files-from-path: 0.2.6 - ipfs-car: 0.7.0 - ipns: 0.16.0 - libp2p-crypto: 0.21.2 - p-retry: 4.6.2 - streaming-iterables: 6.2.0 - throttled-queue: 2.1.4 - uint8arrays: 3.1.0 - transitivePeerDependencies: - - encoding - - node-fetch - - supports-color - dev: false - /web3.storage/4.3.0: resolution: {integrity: sha512-9IKn+4dyF7cMXC9etVzW3qmCV/6sL+Za4kcUUn7D3qRt4s1DrKUGJdAe9VvYcpHwbnnYoKNBu06lGO++daDo8w==} dependencies: diff --git a/src/components/common/BlockchainInfo.tsx b/src/components/common/BlockchainInfo.tsx index edf0f00d..7929059e 100644 --- a/src/components/common/BlockchainInfo.tsx +++ b/src/components/common/BlockchainInfo.tsx @@ -4,6 +4,7 @@ import { Profile, Note } from "~/lib/types" import { Disclosure } from "@headlessui/react" import { ChevronUpIcon } from "@heroicons/react/solid" import { BlockchainIcon } from "~/components/icons/BlockchainIcon" +import { toIPFS, toGateway } from "~/lib/ipfs-parser" export const BlockchainInfo: React.FC<{ site?: Profile @@ -97,7 +98,7 @@ export const BlockchainInfo: React.FC<{ href={url} key={url} > - {url.replace(IPFS_GATEWAY, "ipfs://")} + {toIPFS(url)} ) }) @@ -106,10 +107,7 @@ export const BlockchainInfo: React.FC<{ target="_blank" rel="noreferrer" className="inline-block mr-4 break-all" - href={site?.metadata?.uri.replace( - "ipfs://", - IPFS_GATEWAY, - )} + href={toGateway(site?.metadata?.uri)} key={site?.metadata?.uri} > {site?.metadata?.uri} diff --git a/src/components/ui/Avatar.tsx b/src/components/ui/Avatar.tsx index b85f7a8c..5706b76b 100644 --- a/src/components/ui/Avatar.tsx +++ b/src/components/ui/Avatar.tsx @@ -1,6 +1,7 @@ import clsx from "clsx" import React, { useMemo } from "react" import { IPFS_GATEWAY } from "~/lib/env" +import { toGateway } from "~/lib/ipfs-parser" export const Avatar: React.FC< { @@ -22,10 +23,7 @@ export const Avatar: React.FC< const image = useMemo(() => { for (const image of images) { - if (image) - return image - .replace("ipfs://", IPFS_GATEWAY) - .replace("https://gateway.ipfs.io/ipfs/", IPFS_GATEWAY) + if (image) return toGateway(image) } }, [images]) diff --git a/src/lib/ipfs-parser.ts b/src/lib/ipfs-parser.ts new file mode 100644 index 00000000..d42dd0df --- /dev/null +++ b/src/lib/ipfs-parser.ts @@ -0,0 +1,13 @@ +import { IPFS_GATEWAY } from "~/lib/env" + +export const toGateway = (url: string) => { + return url + ?.replace("ipfs://", IPFS_GATEWAY) + .replace("https://gateway.ipfs.io/ipfs/", IPFS_GATEWAY) + .replace("https://ipfs.io/ipfs/", IPFS_GATEWAY) + .replace("https://cf-ipfs.com/ipfs/", IPFS_GATEWAY) +} + +export const toIPFS = (url: string) => { + return url?.replace(IPFS_GATEWAY, "ipfs://") +} diff --git a/src/lib/upload-file.ts b/src/lib/upload-file.ts index bf2d14bd..41e27509 100644 --- a/src/lib/upload-file.ts +++ b/src/lib/upload-file.ts @@ -1,18 +1,19 @@ -import { Web3Storage } from "web3.storage" -import { IPFS_GATEWAY } from "../lib/env" +import axios from "axios" -export const UploadFile = async (blob: Blob, filename: string) => { - const file = new File([blob], filename) - const web3Storage = new Web3Storage({ - token: - "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJkaWQ6ZXRocjoweDAyMDIwODZmRjU5OUU0Y0YyMzM4MkUzNjg1Y0NmZUEyOGNBODBCOTAiLCJpc3MiOiJ3ZWIzLXN0b3JhZ2UiLCJpYXQiOjE2NTIzNjM1Njk3NDUsIm5hbWUiOiJVbmlkYXRhIn0.XmsAuXvbTj4BFhZlJK4xXfbd0ltVZJCEhqdYcW_kLOo", - } as any) - const cid = await web3Storage.put([file], { - name: file.name, - maxRetries: 3, - wrapWithDirectory: false, - }) +export const UploadFile = async (blob: Blob) => { + const formData = new FormData() + formData.append("file", blob) + + const res = await axios.post( + "https://ipfs-relay.crossbell.io/upload", + formData, + { + headers: { + "Content-Type": "multipart/form-data", + }, + }, + ) return { - key: `${IPFS_GATEWAY}${cid}`, + key: res.data.url, } } diff --git a/src/markdown/rehype-image.ts b/src/markdown/rehype-image.ts index b78092e4..613a8119 100644 --- a/src/markdown/rehype-image.ts +++ b/src/markdown/rehype-image.ts @@ -2,6 +2,7 @@ import { Root } from "rehype-raw" import { Plugin } from "unified" import { visit } from "unist-util-visit" import { getUserContentsUrl } from "~/lib/user-contents" +import { toGateway } from "~/lib/ipfs-parser" const isExternLink = (url: string) => /^https?:\/\//.test(url) @@ -10,12 +11,16 @@ export const rehypeImage: Plugin, Root> = () => { visit(tree, { tagName: "img" }, (node) => { if (!node.properties) return - const url = node.properties.src + let url = node.properties.src if (!url || typeof url !== "string") { return } + const ipfsUrl = toGateway(url) + node.properties.src = ipfsUrl + url = ipfsUrl + if (isExternLink(url)) { if (!url.startsWith("https:")) { throw new Error(`External image url must start with https`) diff --git a/src/markdown/rehyper-external-link.ts b/src/markdown/rehyper-external-link.ts index a6f31cf3..1f6664c5 100644 --- a/src/markdown/rehyper-external-link.ts +++ b/src/markdown/rehyper-external-link.ts @@ -1,6 +1,7 @@ import { Root } from "rehype-raw" import { Plugin } from "unified" import { visit } from "unist-util-visit" +import { toGateway } from "~/lib/ipfs-parser" const isExternLink = (url: string) => /^https?:\/\//.test(url) @@ -9,12 +10,16 @@ export const rehypeExternalLink: Plugin, Root> = () => { visit(tree, { type: "element", tagName: "a" }, (node) => { if (!node.properties) return - const url = node.properties.href + let url = node.properties.href if (!url || typeof url !== "string") { return } + const ipfsUrl = toGateway(url) + node.properties.href = ipfsUrl + url = ipfsUrl + if (isExternLink(url)) { node.properties.target = "_blank" node.properties.rel = "noopener noreferrer"