this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

do script manually

+397 -10
+2
package.json
··· 22 22 "react-markdown": "^9.0.1", 23 23 "reading-time": "^1.5.0", 24 24 "rehype-format": "^5.0.1", 25 + "rehype-raw": "^7.0.0", 25 26 "rehype-sanitize": "^6.0.0", 26 27 "rehype-stringify": "^10.0.1", 28 + "remark-gfm": "^4.0.0", 27 29 "remark-parse": "^11.0.0", 28 30 "remark-rehype": "^11.1.1", 29 31 "rss": "^1.2.2",
+303
pnpm-lock.yaml
··· 41 41 rehype-format: 42 42 specifier: ^5.0.1 43 43 version: 5.0.1 44 + rehype-raw: 45 + specifier: ^7.0.0 46 + version: 7.0.0 44 47 rehype-sanitize: 45 48 specifier: ^6.0.0 46 49 version: 6.0.0 47 50 rehype-stringify: 48 51 specifier: ^10.0.1 49 52 version: 10.0.1 53 + remark-gfm: 54 + specifier: ^4.0.0 55 + version: 4.0.0 50 56 remark-parse: 51 57 specifier: ^11.0.0 52 58 version: 11.0.0 ··· 882 888 resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} 883 889 engines: {node: '>=10.13.0'} 884 890 891 + entities@4.5.0: 892 + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} 893 + engines: {node: '>=0.12'} 894 + 885 895 es-abstract@1.23.3: 886 896 resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} 887 897 engines: {node: '>= 0.4'} ··· 924 934 escape-string-regexp@4.0.0: 925 935 resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 926 936 engines: {node: '>=10'} 937 + 938 + escape-string-regexp@5.0.0: 939 + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} 940 + engines: {node: '>=12'} 927 941 928 942 eslint-config-next@15.0.1: 929 943 resolution: {integrity: sha512-3cYCrgbH6GS/ufApza7XCKz92vtq4dAdYhx++rMFNlH2cAV+/GsAKkrr4+bohYOACmzG2nAOR+uWprKC1Uld6A==} ··· 1198 1212 hast-util-format@1.1.0: 1199 1213 resolution: {integrity: sha512-yY1UDz6bC9rDvCWHpx12aIBGRG7krurX0p0Fm6pT547LwDIZZiNr8a+IHDogorAdreULSEzP82Nlv5SZkHZcjA==} 1200 1214 1215 + hast-util-from-parse5@8.0.1: 1216 + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} 1217 + 1201 1218 hast-util-has-property@3.0.0: 1202 1219 resolution: {integrity: sha512-MNilsvEKLFpV604hwfhVStK0usFY/QmM5zX16bo7EjnAEGofr5YyI37kzopBlZJkHD4t887i+q/C8/tr5Q94cA==} 1203 1220 ··· 1210 1227 hast-util-minify-whitespace@1.0.1: 1211 1228 resolution: {integrity: sha512-L96fPOVpnclQE0xzdWb/D12VT5FabA7SnZOUMtL1DbXmYiHJMXZvFkIZfiMmTCNJHUeO2K9UYNXoVyfz+QHuOw==} 1212 1229 1230 + hast-util-parse-selector@4.0.0: 1231 + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} 1232 + 1213 1233 hast-util-phrasing@3.0.1: 1214 1234 resolution: {integrity: sha512-6h60VfI3uBQUxHqTyMymMZnEbNl1XmEGtOxxKYL7stY2o601COo62AWAYBQR9lZbYXYSBoxag8UpPRXK+9fqSQ==} 1215 1235 1236 + hast-util-raw@9.0.4: 1237 + resolution: {integrity: sha512-LHE65TD2YiNsHD3YuXcKPHXPLuYh/gjp12mOfU8jxSrm1f/yJpsb0F/KKljS6U9LJoP0Ux+tCe8iJ2AsPzTdgA==} 1238 + 1216 1239 hast-util-sanitize@5.0.1: 1217 1240 resolution: {integrity: sha512-IGrgWLuip4O2nq5CugXy4GI2V8kx4sFVy5Hd4vF7AR2gxS0N9s7nEAVUyeMtZKZvzrxVsHt73XdTsno1tClIkQ==} 1218 1241 ··· 1222 1245 hast-util-to-jsx-runtime@2.3.2: 1223 1246 resolution: {integrity: sha512-1ngXYb+V9UT5h+PxNRa1O1FYguZK/XL+gkeqvp7EdHlB9oHUG0eYRo/vY5inBdcqo3RkPMC58/H94HvkbfGdyg==} 1224 1247 1248 + hast-util-to-parse5@8.0.0: 1249 + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} 1250 + 1225 1251 hast-util-whitespace@3.0.0: 1226 1252 resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} 1253 + 1254 + hastscript@8.0.0: 1255 + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} 1227 1256 1228 1257 html-url-attributes@3.0.1: 1229 1258 resolution: {integrity: sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==} ··· 1481 1510 peerDependencies: 1482 1511 react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc 1483 1512 1513 + markdown-table@3.0.4: 1514 + resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} 1515 + 1516 + mdast-util-find-and-replace@3.0.1: 1517 + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} 1518 + 1484 1519 mdast-util-from-markdown@2.0.1: 1485 1520 resolution: {integrity: sha512-aJEUyzZ6TzlsX2s5B4Of7lN7EQtAxvtradMMglCQDyaTFgse6CmtmdJ15ElnVRlCg1vpNyVtbem0PWzlNieZsA==} 1486 1521 1522 + mdast-util-gfm-autolink-literal@2.0.1: 1523 + resolution: {integrity: sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==} 1524 + 1525 + mdast-util-gfm-footnote@2.0.0: 1526 + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} 1527 + 1528 + mdast-util-gfm-strikethrough@2.0.0: 1529 + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} 1530 + 1531 + mdast-util-gfm-table@2.0.0: 1532 + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} 1533 + 1534 + mdast-util-gfm-task-list-item@2.0.0: 1535 + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} 1536 + 1537 + mdast-util-gfm@3.0.0: 1538 + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} 1539 + 1487 1540 mdast-util-mdx-expression@2.0.1: 1488 1541 resolution: {integrity: sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==} 1489 1542 ··· 1511 1564 1512 1565 micromark-core-commonmark@2.0.1: 1513 1566 resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} 1567 + 1568 + micromark-extension-gfm-autolink-literal@2.1.0: 1569 + resolution: {integrity: sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==} 1570 + 1571 + micromark-extension-gfm-footnote@2.1.0: 1572 + resolution: {integrity: sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==} 1573 + 1574 + micromark-extension-gfm-strikethrough@2.1.0: 1575 + resolution: {integrity: sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==} 1576 + 1577 + micromark-extension-gfm-table@2.1.0: 1578 + resolution: {integrity: sha512-Ub2ncQv+fwD70/l4ou27b4YzfNaCJOvyX4HxXU15m7mpYY+rjuWzsLIPZHJL253Z643RpbcP1oeIJlQ/SKW67g==} 1579 + 1580 + micromark-extension-gfm-tagfilter@2.0.0: 1581 + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} 1582 + 1583 + micromark-extension-gfm-task-list-item@2.1.0: 1584 + resolution: {integrity: sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==} 1585 + 1586 + micromark-extension-gfm@3.0.0: 1587 + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} 1514 1588 1515 1589 micromark-factory-destination@2.0.0: 1516 1590 resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} ··· 1705 1779 parse-entities@4.0.1: 1706 1780 resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} 1707 1781 1782 + parse5@7.2.0: 1783 + resolution: {integrity: sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==} 1784 + 1708 1785 path-exists@4.0.0: 1709 1786 resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1710 1787 engines: {node: '>=8'} ··· 1900 1977 rehype-format@5.0.1: 1901 1978 resolution: {integrity: sha512-zvmVru9uB0josBVpr946OR8ui7nJEdzZobwLOOqHb/OOD88W0Vk2SqLwoVOj0fM6IPCCO6TaV9CvQvJMWwukFQ==} 1902 1979 1980 + rehype-raw@7.0.0: 1981 + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} 1982 + 1903 1983 rehype-sanitize@6.0.0: 1904 1984 resolution: {integrity: sha512-CsnhKNsyI8Tub6L4sm5ZFsme4puGfc6pYylvXo1AeqaGbjOYyzNv3qZPwvs0oMJ39eryyeOdmxwUIo94IpEhqg==} 1905 1985 1906 1986 rehype-stringify@10.0.1: 1907 1987 resolution: {integrity: sha512-k9ecfXHmIPuFVI61B9DeLPN0qFHfawM6RsuX48hoqlaKSF61RskNjSm1lI8PhBEM0MRdLxVVm4WmTqJQccH9mA==} 1908 1988 1989 + remark-gfm@4.0.0: 1990 + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} 1991 + 1909 1992 remark-parse@11.0.0: 1910 1993 resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} 1911 1994 1912 1995 remark-rehype@11.1.1: 1913 1996 resolution: {integrity: sha512-g/osARvjkBXb6Wo0XvAeXQohVta8i84ACbenPpoSsxTOQH/Ae0/RGP4WZgnMH5pMLpsj4FG7OHmcIcXxpza8eQ==} 1997 + 1998 + remark-stringify@11.0.0: 1999 + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} 1914 2000 1915 2001 resolve-from@4.0.0: 1916 2002 resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} ··· 2196 2282 util-deprecate@1.0.2: 2197 2283 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 2198 2284 2285 + vfile-location@5.0.3: 2286 + resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} 2287 + 2199 2288 vfile-message@4.0.2: 2200 2289 resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} 2201 2290 2202 2291 vfile@6.0.3: 2203 2292 resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} 2293 + 2294 + web-namespaces@2.0.1: 2295 + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} 2204 2296 2205 2297 which-boxed-primitive@1.0.2: 2206 2298 resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} ··· 3051 3143 graceful-fs: 4.2.11 3052 3144 tapable: 2.2.1 3053 3145 3146 + entities@4.5.0: {} 3147 + 3054 3148 es-abstract@1.23.3: 3055 3149 dependencies: 3056 3150 array-buffer-byte-length: 1.0.1 ··· 3149 3243 3150 3244 escape-string-regexp@4.0.0: {} 3151 3245 3246 + escape-string-regexp@5.0.0: {} 3247 + 3152 3248 eslint-config-next@15.0.1(eslint@9.13.0(jiti@1.21.6))(typescript@5.6.3): 3153 3249 dependencies: 3154 3250 '@next/eslint-plugin-next': 15.0.1 ··· 3519 3615 html-whitespace-sensitive-tag-names: 3.0.1 3520 3616 unist-util-visit-parents: 6.0.1 3521 3617 3618 + hast-util-from-parse5@8.0.1: 3619 + dependencies: 3620 + '@types/hast': 3.0.4 3621 + '@types/unist': 3.0.3 3622 + devlop: 1.1.0 3623 + hastscript: 8.0.0 3624 + property-information: 6.5.0 3625 + vfile: 6.0.3 3626 + vfile-location: 5.0.3 3627 + web-namespaces: 2.0.1 3628 + 3522 3629 hast-util-has-property@3.0.0: 3523 3630 dependencies: 3524 3631 '@types/hast': 3.0.4 ··· 3539 3646 hast-util-whitespace: 3.0.0 3540 3647 unist-util-is: 6.0.0 3541 3648 3649 + hast-util-parse-selector@4.0.0: 3650 + dependencies: 3651 + '@types/hast': 3.0.4 3652 + 3542 3653 hast-util-phrasing@3.0.1: 3543 3654 dependencies: 3544 3655 '@types/hast': 3.0.4 ··· 3547 3658 hast-util-is-body-ok-link: 3.0.1 3548 3659 hast-util-is-element: 3.0.0 3549 3660 3661 + hast-util-raw@9.0.4: 3662 + dependencies: 3663 + '@types/hast': 3.0.4 3664 + '@types/unist': 3.0.3 3665 + '@ungap/structured-clone': 1.2.0 3666 + hast-util-from-parse5: 8.0.1 3667 + hast-util-to-parse5: 8.0.0 3668 + html-void-elements: 3.0.0 3669 + mdast-util-to-hast: 13.2.0 3670 + parse5: 7.2.0 3671 + unist-util-position: 5.0.0 3672 + unist-util-visit: 5.0.0 3673 + vfile: 6.0.3 3674 + web-namespaces: 2.0.1 3675 + zwitch: 2.0.4 3676 + 3550 3677 hast-util-sanitize@5.0.1: 3551 3678 dependencies: 3552 3679 '@types/hast': 3.0.4 ··· 3587 3714 transitivePeerDependencies: 3588 3715 - supports-color 3589 3716 3717 + hast-util-to-parse5@8.0.0: 3718 + dependencies: 3719 + '@types/hast': 3.0.4 3720 + comma-separated-tokens: 2.0.3 3721 + devlop: 1.1.0 3722 + property-information: 6.5.0 3723 + space-separated-tokens: 2.0.2 3724 + web-namespaces: 2.0.1 3725 + zwitch: 2.0.4 3726 + 3590 3727 hast-util-whitespace@3.0.0: 3591 3728 dependencies: 3592 3729 '@types/hast': 3.0.4 3730 + 3731 + hastscript@8.0.0: 3732 + dependencies: 3733 + '@types/hast': 3.0.4 3734 + comma-separated-tokens: 2.0.3 3735 + hast-util-parse-selector: 4.0.0 3736 + property-information: 6.5.0 3737 + space-separated-tokens: 2.0.2 3593 3738 3594 3739 html-url-attributes@3.0.1: {} 3595 3740 ··· 3820 3965 dependencies: 3821 3966 react: 18.3.1 3822 3967 3968 + markdown-table@3.0.4: {} 3969 + 3970 + mdast-util-find-and-replace@3.0.1: 3971 + dependencies: 3972 + '@types/mdast': 4.0.4 3973 + escape-string-regexp: 5.0.0 3974 + unist-util-is: 6.0.0 3975 + unist-util-visit-parents: 6.0.1 3976 + 3823 3977 mdast-util-from-markdown@2.0.1: 3824 3978 dependencies: 3825 3979 '@types/mdast': 4.0.4 ··· 3834 3988 micromark-util-symbol: 2.0.0 3835 3989 micromark-util-types: 2.0.0 3836 3990 unist-util-stringify-position: 4.0.0 3991 + transitivePeerDependencies: 3992 + - supports-color 3993 + 3994 + mdast-util-gfm-autolink-literal@2.0.1: 3995 + dependencies: 3996 + '@types/mdast': 4.0.4 3997 + ccount: 2.0.1 3998 + devlop: 1.1.0 3999 + mdast-util-find-and-replace: 3.0.1 4000 + micromark-util-character: 2.1.0 4001 + 4002 + mdast-util-gfm-footnote@2.0.0: 4003 + dependencies: 4004 + '@types/mdast': 4.0.4 4005 + devlop: 1.1.0 4006 + mdast-util-from-markdown: 2.0.1 4007 + mdast-util-to-markdown: 2.1.0 4008 + micromark-util-normalize-identifier: 2.0.0 4009 + transitivePeerDependencies: 4010 + - supports-color 4011 + 4012 + mdast-util-gfm-strikethrough@2.0.0: 4013 + dependencies: 4014 + '@types/mdast': 4.0.4 4015 + mdast-util-from-markdown: 2.0.1 4016 + mdast-util-to-markdown: 2.1.0 4017 + transitivePeerDependencies: 4018 + - supports-color 4019 + 4020 + mdast-util-gfm-table@2.0.0: 4021 + dependencies: 4022 + '@types/mdast': 4.0.4 4023 + devlop: 1.1.0 4024 + markdown-table: 3.0.4 4025 + mdast-util-from-markdown: 2.0.1 4026 + mdast-util-to-markdown: 2.1.0 4027 + transitivePeerDependencies: 4028 + - supports-color 4029 + 4030 + mdast-util-gfm-task-list-item@2.0.0: 4031 + dependencies: 4032 + '@types/mdast': 4.0.4 4033 + devlop: 1.1.0 4034 + mdast-util-from-markdown: 2.0.1 4035 + mdast-util-to-markdown: 2.1.0 4036 + transitivePeerDependencies: 4037 + - supports-color 4038 + 4039 + mdast-util-gfm@3.0.0: 4040 + dependencies: 4041 + mdast-util-from-markdown: 2.0.1 4042 + mdast-util-gfm-autolink-literal: 2.0.1 4043 + mdast-util-gfm-footnote: 2.0.0 4044 + mdast-util-gfm-strikethrough: 2.0.0 4045 + mdast-util-gfm-table: 2.0.0 4046 + mdast-util-gfm-task-list-item: 2.0.0 4047 + mdast-util-to-markdown: 2.1.0 3837 4048 transitivePeerDependencies: 3838 4049 - supports-color 3839 4050 ··· 3929 4140 micromark-util-symbol: 2.0.0 3930 4141 micromark-util-types: 2.0.0 3931 4142 4143 + micromark-extension-gfm-autolink-literal@2.1.0: 4144 + dependencies: 4145 + micromark-util-character: 2.1.0 4146 + micromark-util-sanitize-uri: 2.0.0 4147 + micromark-util-symbol: 2.0.0 4148 + micromark-util-types: 2.0.0 4149 + 4150 + micromark-extension-gfm-footnote@2.1.0: 4151 + dependencies: 4152 + devlop: 1.1.0 4153 + micromark-core-commonmark: 2.0.1 4154 + micromark-factory-space: 2.0.0 4155 + micromark-util-character: 2.1.0 4156 + micromark-util-normalize-identifier: 2.0.0 4157 + micromark-util-sanitize-uri: 2.0.0 4158 + micromark-util-symbol: 2.0.0 4159 + micromark-util-types: 2.0.0 4160 + 4161 + micromark-extension-gfm-strikethrough@2.1.0: 4162 + dependencies: 4163 + devlop: 1.1.0 4164 + micromark-util-chunked: 2.0.0 4165 + micromark-util-classify-character: 2.0.0 4166 + micromark-util-resolve-all: 2.0.0 4167 + micromark-util-symbol: 2.0.0 4168 + micromark-util-types: 2.0.0 4169 + 4170 + micromark-extension-gfm-table@2.1.0: 4171 + dependencies: 4172 + devlop: 1.1.0 4173 + micromark-factory-space: 2.0.0 4174 + micromark-util-character: 2.1.0 4175 + micromark-util-symbol: 2.0.0 4176 + micromark-util-types: 2.0.0 4177 + 4178 + micromark-extension-gfm-tagfilter@2.0.0: 4179 + dependencies: 4180 + micromark-util-types: 2.0.0 4181 + 4182 + micromark-extension-gfm-task-list-item@2.1.0: 4183 + dependencies: 4184 + devlop: 1.1.0 4185 + micromark-factory-space: 2.0.0 4186 + micromark-util-character: 2.1.0 4187 + micromark-util-symbol: 2.0.0 4188 + micromark-util-types: 2.0.0 4189 + 4190 + micromark-extension-gfm@3.0.0: 4191 + dependencies: 4192 + micromark-extension-gfm-autolink-literal: 2.1.0 4193 + micromark-extension-gfm-footnote: 2.1.0 4194 + micromark-extension-gfm-strikethrough: 2.1.0 4195 + micromark-extension-gfm-table: 2.1.0 4196 + micromark-extension-gfm-tagfilter: 2.0.0 4197 + micromark-extension-gfm-task-list-item: 2.1.0 4198 + micromark-util-combine-extensions: 2.0.0 4199 + micromark-util-types: 2.0.0 4200 + 3932 4201 micromark-factory-destination@2.0.0: 3933 4202 dependencies: 3934 4203 micromark-util-character: 2.1.0 ··· 4187 4456 is-decimal: 2.0.1 4188 4457 is-hexadecimal: 2.0.1 4189 4458 4459 + parse5@7.2.0: 4460 + dependencies: 4461 + entities: 4.5.0 4462 + 4190 4463 path-exists@4.0.0: {} 4191 4464 4192 4465 path-key@3.1.1: {} ··· 4334 4607 '@types/hast': 3.0.4 4335 4608 hast-util-format: 1.1.0 4336 4609 4610 + rehype-raw@7.0.0: 4611 + dependencies: 4612 + '@types/hast': 3.0.4 4613 + hast-util-raw: 9.0.4 4614 + vfile: 6.0.3 4615 + 4337 4616 rehype-sanitize@6.0.0: 4338 4617 dependencies: 4339 4618 '@types/hast': 3.0.4 ··· 4345 4624 hast-util-to-html: 9.0.3 4346 4625 unified: 11.0.5 4347 4626 4627 + remark-gfm@4.0.0: 4628 + dependencies: 4629 + '@types/mdast': 4.0.4 4630 + mdast-util-gfm: 3.0.0 4631 + micromark-extension-gfm: 3.0.0 4632 + remark-parse: 11.0.0 4633 + remark-stringify: 11.0.0 4634 + unified: 11.0.5 4635 + transitivePeerDependencies: 4636 + - supports-color 4637 + 4348 4638 remark-parse@11.0.0: 4349 4639 dependencies: 4350 4640 '@types/mdast': 4.0.4 ··· 4361 4651 mdast-util-to-hast: 13.2.0 4362 4652 unified: 11.0.5 4363 4653 vfile: 6.0.3 4654 + 4655 + remark-stringify@11.0.0: 4656 + dependencies: 4657 + '@types/mdast': 4.0.4 4658 + mdast-util-to-markdown: 2.1.0 4659 + unified: 11.0.5 4364 4660 4365 4661 resolve-from@4.0.0: {} 4366 4662 ··· 4744 5040 4745 5041 util-deprecate@1.0.2: {} 4746 5042 5043 + vfile-location@5.0.3: 5044 + dependencies: 5045 + '@types/unist': 3.0.3 5046 + vfile: 6.0.3 5047 + 4747 5048 vfile-message@4.0.2: 4748 5049 dependencies: 4749 5050 '@types/unist': 3.0.3 ··· 4753 5054 dependencies: 4754 5055 '@types/unist': 3.0.3 4755 5056 vfile-message: 4.0.2 5057 + 5058 + web-namespaces@2.0.1: {} 4756 5059 4757 5060 which-boxed-primitive@1.0.2: 4758 5061 dependencies:
+33 -10
src/app/post/[rkey]/page.tsx
··· 3 3 import { type Metadata } from "next"; 4 4 import Image from "next/image"; 5 5 import Link from "next/link"; 6 - import Script from "next/script"; 7 6 import { Code as SyntaxHighlighter } from "bright"; 8 7 import readingTime from "reading-time"; 9 - import rehypeSanitize from "rehype-sanitize"; 8 + import rehypeRaw from "rehype-raw"; 9 + import rehypeSanitize, { defaultSchema } from "rehype-sanitize"; 10 + import remarkGfm from "remark-gfm"; 10 11 12 + import { BlueskyPostEmbed } from "#/components/bluesky-embed"; 11 13 import { Footer } from "#/components/footer"; 12 14 import { PostInfo } from "#/components/post-info"; 13 15 import { Code, Paragraph, Title } from "#/components/typography"; ··· 63 65 <div className="diagonal-pattern w-full h-3" /> 64 66 </div> 65 67 <Markdown 66 - rehypePlugins={[rehypeSanitize]} 68 + remarkPlugins={[remarkGfm]} 69 + remarkRehypeOptions={{ allowDangerousHtml: true }} 70 + rehypePlugins={[ 71 + rehypeRaw, 72 + [ 73 + rehypeSanitize, 74 + { 75 + ...defaultSchema, 76 + attributes: { 77 + ...defaultSchema.attributes, 78 + blockquote: [ 79 + ...(defaultSchema.attributes?.blockquote ?? []), 80 + "dataBlueskyUri", 81 + "dataBlueskyCid", 82 + ], 83 + }, 84 + } satisfies typeof defaultSchema, 85 + ], 86 + ]} 87 + className="[&>.bluesky-embed]:mt-8 [&>.bluesky-embed]:mb-0" 67 88 components={{ 68 89 h1: (props) => <Title level="h1" {...props} />, 69 90 h2: (props) => <Title level="h2" {...props} />, ··· 77 98 {...props} 78 99 /> 79 100 ), 80 - blockquote: (props) => ( 81 - <blockquote 82 - className="mt-6 border-l-2 pl-4 italic border-slate-200 text-slate-600 dark:border-slate-800 dark:text-slate-400" 83 - {...props} 84 - /> 85 - ), 101 + blockquote: (props) => 102 + "data-bluesky-uri" in props ? ( 103 + <BlueskyPostEmbed uri={props["data-bluesky-uri"] as string} /> 104 + ) : ( 105 + <blockquote 106 + className="mt-6 border-l-2 pl-4 italic border-slate-200 text-slate-600 dark:border-slate-800 dark:text-slate-400" 107 + {...props} 108 + /> 109 + ), 86 110 ul: (props) => ( 87 111 <ul 88 112 className="my-6 ml-6 list-disc [&>ul]:my-2 [&>ol]:my-2 [&>li]:mt-2" ··· 138 162 </article> 139 163 </main> 140 164 <Footer /> 141 - <Script src="https://embed.bsky.app/static/embed.js" async /> 142 165 </div> 143 166 ); 144 167 }
+59
src/components/bluesky-embed.tsx
··· 1 + "use client"; 2 + 3 + import { useEffect, useId, useState } from "react"; 4 + import { usePathname } from "next/navigation"; 5 + 6 + const EMBED_URL = "https://embed.bsky.app"; 7 + 8 + export function BlueskyPostEmbed({ uri }: { uri: string }) { 9 + const id = useId(); 10 + const path = usePathname(); 11 + const [height, setHeight] = useState(0); 12 + 13 + useEffect(() => { 14 + const abortController = new AbortController(); 15 + const { signal } = abortController; 16 + window.addEventListener( 17 + "message", 18 + (event) => { 19 + if (event.origin !== EMBED_URL) { 20 + return; 21 + } 22 + 23 + const iframeId = (event.data as { id: string }).id; 24 + if (id !== iframeId) { 25 + return; 26 + } 27 + 28 + const internalHeight = (event.data as { height: number }).height; 29 + if (internalHeight && typeof internalHeight === "number") { 30 + setHeight(internalHeight); 31 + } 32 + }, 33 + { signal }, 34 + ); 35 + 36 + return () => { 37 + abortController.abort(); 38 + }; 39 + }, [id]); 40 + 41 + return ( 42 + <div 43 + className="mt-8 flex max-w-[600px] w-full bluesky-embed" 44 + data-uri={uri} 45 + > 46 + <iframe 47 + className="w-full block border-none flex-grow" 48 + style={{ height }} 49 + data-bluesky-uri={uri} 50 + src={`${EMBED_URL}/embed/${uri.slice("at://".length)}?id=${id}&ref_url=${encodeURIComponent( 51 + `https://mozzius.dev${path}`, 52 + )}`} 53 + width="100%" 54 + frameBorder="0" 55 + scrolling="no" 56 + /> 57 + </div> 58 + ); 59 + }