[READ-ONLY] Mirror of https://github.com/flo-bit/blog-template. minimalistic astro blog template flo-bit.dev/blog-template/
astro blog template
0

Configure Feed

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

add bluesky likes

Florian (Nov 22, 2024, 5:15 PM +0100) 423ca20b 5b980d0c

+676 -235
+4
astro.config.mjs
··· 54 54 site: SITE, 55 55 base: BASE, 56 56 output: "static", 57 + 58 + experimental: { 59 + contentLayer: true, 60 + }, 57 61 });
+249 -224
package-lock.json
··· 9 9 "version": "0.0.1", 10 10 "license": "MIT", 11 11 "dependencies": { 12 + "@ascorbic/bluesky-loader": "^0.0.3", 12 13 "@astrojs/check": "^0.9.4", 13 - "@astrojs/mdx": "^3.1.8", 14 + "@astrojs/mdx": "^3.1.9", 14 15 "@astrojs/rss": "^4.0.9", 15 16 "@astrojs/sitemap": "^3.2.1", 16 - "@astrojs/svelte": "^5.7.2", 17 + "@astrojs/svelte": "^6.0.2", 17 18 "@astrojs/tailwind": "^5.1.2", 18 19 "@tailwindcss/forms": "^0.5.9", 19 - "astro": "^4.16.7", 20 + "astro": "^4.16.14", 20 21 "astro-og-canvas": "^0.5.4", 21 22 "svelte": "^5.1.1", 22 23 "tailwind-merge": "^2.5.4", ··· 51 52 }, 52 53 "engines": { 53 54 "node": ">=6.0.0" 55 + } 56 + }, 57 + "node_modules/@ascorbic/bluesky-loader": { 58 + "version": "0.0.3", 59 + "resolved": "https://registry.npmjs.org/@ascorbic/bluesky-loader/-/bluesky-loader-0.0.3.tgz", 60 + "integrity": "sha512-jOO+BnjL5Bxw7ak3d88EsE29TeXrsyP/FFJEp8js3RKZ9EdgTxcEQPIcP6XMTQlkkmLfr4kNkUCnozEYpv69GQ==", 61 + "dependencies": { 62 + "@ascorbic/loader-utils": "^1.0.2", 63 + "@atproto/api": "^0.13.14" 64 + }, 65 + "peerDependencies": { 66 + "astro": "^4.14.0 || ^5.0.0-beta.0" 67 + } 68 + }, 69 + "node_modules/@ascorbic/loader-utils": { 70 + "version": "1.0.2", 71 + "resolved": "https://registry.npmjs.org/@ascorbic/loader-utils/-/loader-utils-1.0.2.tgz", 72 + "integrity": "sha512-pg43g83gojVtEsAkXfjWuzJhuXneJp4wM/leBftGkCPV3yxKgB92EWA+nWu735BgbBMph3P7DrVqVc3ikt+dJA==", 73 + "peerDependencies": { 74 + "astro": "^4.14.0 || ^5.0.0-beta.0" 54 75 } 55 76 }, 56 77 "node_modules/@astrojs/check": { ··· 146 167 } 147 168 }, 148 169 "node_modules/@astrojs/mdx": { 149 - "version": "3.1.8", 150 - "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-3.1.8.tgz", 151 - "integrity": "sha512-4o/+pvgoLFG0eG96cFs4t3NzZAIAOYu57fKAprWHXJrnq/qdBV0av6BYDjoESxvxNILUYoj8sdZVWtlPWVDLog==", 170 + "version": "3.1.9", 171 + "resolved": "https://registry.npmjs.org/@astrojs/mdx/-/mdx-3.1.9.tgz", 172 + "integrity": "sha512-3jPD4Bff6lIA20RQoonnZkRtZ9T3i0HFm6fcDF7BMsKIZ+xBP2KXzQWiuGu62lrVCmU612N+SQVGl5e0fI+zWg==", 152 173 "dependencies": { 153 174 "@astrojs/markdown-remark": "5.3.0", 154 - "@mdx-js/mdx": "^3.0.1", 155 - "acorn": "^8.12.1", 175 + "@mdx-js/mdx": "^3.1.0", 176 + "acorn": "^8.14.0", 156 177 "es-module-lexer": "^1.5.4", 157 178 "estree-util-visit": "^2.0.0", 158 179 "gray-matter": "^4.0.3", ··· 203 224 } 204 225 }, 205 226 "node_modules/@astrojs/svelte": { 206 - "version": "5.7.2", 207 - "resolved": "https://registry.npmjs.org/@astrojs/svelte/-/svelte-5.7.2.tgz", 208 - "integrity": "sha512-d3nfPe7OMoDqdw7SXfvYlyCSB4p84p92IIvEsu5E1jDPFbS1mlC76hjAlr0nJHQfV1MZPWifEmmfgDBWLCuS8g==", 227 + "version": "6.0.2", 228 + "resolved": "https://registry.npmjs.org/@astrojs/svelte/-/svelte-6.0.2.tgz", 229 + "integrity": "sha512-Jn60LLH+AbjtLIOQuL0SUI0fxMwpT89VraoGkEwF33ZgCT59H8fMQOj9eNf632P/SHRbKpD+Q+PJjODn5OcKoQ==", 209 230 "dependencies": { 210 - "@sveltejs/vite-plugin-svelte": "^3.1.2", 211 - "svelte2tsx": "^0.7.21" 231 + "@sveltejs/vite-plugin-svelte": "^4.0.0", 232 + "svelte2tsx": "^0.7.22", 233 + "vite": "^5.4.10" 212 234 }, 213 235 "engines": { 214 236 "node": "^18.17.1 || ^20.3.0 || >=21.0.0" 215 237 }, 216 238 "peerDependencies": { 217 239 "astro": "^4.0.0", 218 - "svelte": "^4.0.0 || ^5.0.0-next.190", 240 + "svelte": "^5.1.16", 219 241 "typescript": "^5.3.3" 220 242 } 221 243 }, ··· 258 280 "yaml": "^2.5.0" 259 281 } 260 282 }, 261 - "node_modules/@babel/code-frame": { 262 - "version": "7.25.9", 263 - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.9.tgz", 264 - "integrity": "sha512-z88xeGxnzehn2sqZ8UdGQEvYErF1odv2CftxInpSYJt6uHuPe9YjahKZITGs3l5LeI9d2ROG+obuDAoSlqbNfQ==", 283 + "node_modules/@atproto/api": { 284 + "version": "0.13.17", 285 + "resolved": "https://registry.npmjs.org/@atproto/api/-/api-0.13.17.tgz", 286 + "integrity": "sha512-yfNBb7U4Ma1q3vYUdpvE4JeoR6RAKtVZKMgQnayVRpz4+0vVY3VjTYzNrrHi8cw4+NQyikzk1LU+Sw0luliXiA==", 265 287 "dependencies": { 266 - "@babel/highlight": "^7.25.9", 288 + "@atproto/common-web": "^0.3.1", 289 + "@atproto/lexicon": "^0.4.3", 290 + "@atproto/syntax": "^0.3.1", 291 + "@atproto/xrpc": "^0.6.4", 292 + "await-lock": "^2.2.2", 293 + "multiformats": "^9.9.0", 294 + "tlds": "^1.234.0", 295 + "zod": "^3.23.8" 296 + } 297 + }, 298 + "node_modules/@atproto/common-web": { 299 + "version": "0.3.1", 300 + "resolved": "https://registry.npmjs.org/@atproto/common-web/-/common-web-0.3.1.tgz", 301 + "integrity": "sha512-N7wiTnus5vAr+lT//0y8m/FaHHLJ9LpGuEwkwDAeV3LCiPif4m/FS8x/QOYrx1PdZQwKso95RAPzCGWQBH5j6Q==", 302 + "dependencies": { 303 + "graphemer": "^1.4.0", 304 + "multiformats": "^9.9.0", 305 + "uint8arrays": "3.0.0", 306 + "zod": "^3.23.8" 307 + } 308 + }, 309 + "node_modules/@atproto/lexicon": { 310 + "version": "0.4.3", 311 + "resolved": "https://registry.npmjs.org/@atproto/lexicon/-/lexicon-0.4.3.tgz", 312 + "integrity": "sha512-lFVZXe1S1pJP0dcxvJuHP3r/a+EAIBwwU7jUK+r8iLhIja+ml6NmYv8KeFHmIJATh03spEQ9s02duDmFVdCoXg==", 313 + "dependencies": { 314 + "@atproto/common-web": "^0.3.1", 315 + "@atproto/syntax": "^0.3.1", 316 + "iso-datestring-validator": "^2.2.2", 317 + "multiformats": "^9.9.0", 318 + "zod": "^3.23.8" 319 + } 320 + }, 321 + "node_modules/@atproto/syntax": { 322 + "version": "0.3.1", 323 + "resolved": "https://registry.npmjs.org/@atproto/syntax/-/syntax-0.3.1.tgz", 324 + "integrity": "sha512-fzW0Mg1QUOVCWUD3RgEsDt6d1OZ6DdFmbKcDdbzUfh0t4rhtRAC05KbZYmxuMPWDAiJ4BbbQ5dkAc/mNypMXkw==" 325 + }, 326 + "node_modules/@atproto/xrpc": { 327 + "version": "0.6.4", 328 + "resolved": "https://registry.npmjs.org/@atproto/xrpc/-/xrpc-0.6.4.tgz", 329 + "integrity": "sha512-9ZAJ8nsXTqC4XFyS0E1Wlg7bAvonhXQNQ3Ocs1L1LIwFLXvsw/4fNpIHXxvXvqTCVeyHLbImOnE9UiO1c/qIYA==", 330 + "dependencies": { 331 + "@atproto/lexicon": "^0.4.3", 332 + "zod": "^3.23.8" 333 + } 334 + }, 335 + "node_modules/@babel/code-frame": { 336 + "version": "7.26.2", 337 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", 338 + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", 339 + "dependencies": { 340 + "@babel/helper-validator-identifier": "^7.25.9", 341 + "js-tokens": "^4.0.0", 267 342 "picocolors": "^1.0.0" 268 343 }, 269 344 "engines": { ··· 279 354 } 280 355 }, 281 356 "node_modules/@babel/core": { 282 - "version": "7.25.9", 283 - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.9.tgz", 284 - "integrity": "sha512-WYvQviPw+Qyib0v92AwNIrdLISTp7RfDkM7bPqBvpbnhY4wq8HvHBZREVdYDXk98C8BkOIVnHAY3yvj7AVISxQ==", 357 + "version": "7.26.0", 358 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", 359 + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", 285 360 "dependencies": { 286 361 "@ampproject/remapping": "^2.2.0", 287 - "@babel/code-frame": "^7.25.9", 288 - "@babel/generator": "^7.25.9", 362 + "@babel/code-frame": "^7.26.0", 363 + "@babel/generator": "^7.26.0", 289 364 "@babel/helper-compilation-targets": "^7.25.9", 290 - "@babel/helper-module-transforms": "^7.25.9", 291 - "@babel/helpers": "^7.25.9", 292 - "@babel/parser": "^7.25.9", 365 + "@babel/helper-module-transforms": "^7.26.0", 366 + "@babel/helpers": "^7.26.0", 367 + "@babel/parser": "^7.26.0", 293 368 "@babel/template": "^7.25.9", 294 369 "@babel/traverse": "^7.25.9", 295 - "@babel/types": "^7.25.9", 370 + "@babel/types": "^7.26.0", 296 371 "convert-source-map": "^2.0.0", 297 372 "debug": "^4.1.0", 298 373 "gensync": "^1.0.0-beta.2", ··· 316 391 } 317 392 }, 318 393 "node_modules/@babel/generator": { 319 - "version": "7.25.9", 320 - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.9.tgz", 321 - "integrity": "sha512-omlUGkr5EaoIJrhLf9CJ0TvjBRpd9+AXRG//0GEQ9THSo8wPiTlbpy1/Ow8ZTrbXpjd9FHXfbFQx32I04ht0FA==", 394 + "version": "7.26.2", 395 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", 396 + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", 322 397 "dependencies": { 323 - "@babel/types": "^7.25.9", 398 + "@babel/parser": "^7.26.2", 399 + "@babel/types": "^7.26.0", 324 400 "@jridgewell/gen-mapping": "^0.3.5", 325 401 "@jridgewell/trace-mapping": "^0.3.25", 326 402 "jsesc": "^3.0.2" ··· 376 452 } 377 453 }, 378 454 "node_modules/@babel/helper-module-transforms": { 379 - "version": "7.25.9", 380 - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.9.tgz", 381 - "integrity": "sha512-TvLZY/F3+GvdRYFZFyxMvnsKi+4oJdgZzU3BoGN9Uc2d9C6zfNwJcKKhjqLAhK8i46mv93jsO74fDh3ih6rpHA==", 455 + "version": "7.26.0", 456 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", 457 + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", 382 458 "dependencies": { 383 459 "@babel/helper-module-imports": "^7.25.9", 384 - "@babel/helper-simple-access": "^7.25.9", 385 460 "@babel/helper-validator-identifier": "^7.25.9", 386 461 "@babel/traverse": "^7.25.9" 387 462 }, ··· 396 471 "version": "7.25.9", 397 472 "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", 398 473 "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", 399 - "engines": { 400 - "node": ">=6.9.0" 401 - } 402 - }, 403 - "node_modules/@babel/helper-simple-access": { 404 - "version": "7.25.9", 405 - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz", 406 - "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==", 407 - "dependencies": { 408 - "@babel/traverse": "^7.25.9", 409 - "@babel/types": "^7.25.9" 410 - }, 411 474 "engines": { 412 475 "node": ">=6.9.0" 413 476 } ··· 437 500 } 438 501 }, 439 502 "node_modules/@babel/helpers": { 440 - "version": "7.25.9", 441 - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.9.tgz", 442 - "integrity": "sha512-oKWp3+usOJSzDZOucZUAMayhPz/xVjzymyDzUN8dk0Wd3RWMlGLXi07UCQ/CgQVb8LvXx3XBajJH4XGgkt7H7g==", 503 + "version": "7.26.0", 504 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", 505 + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", 443 506 "dependencies": { 444 507 "@babel/template": "^7.25.9", 445 - "@babel/types": "^7.25.9" 446 - }, 447 - "engines": { 448 - "node": ">=6.9.0" 449 - } 450 - }, 451 - "node_modules/@babel/highlight": { 452 - "version": "7.25.9", 453 - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", 454 - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", 455 - "dependencies": { 456 - "@babel/helper-validator-identifier": "^7.25.9", 457 - "chalk": "^2.4.2", 458 - "js-tokens": "^4.0.0", 459 - "picocolors": "^1.0.0" 508 + "@babel/types": "^7.26.0" 460 509 }, 461 510 "engines": { 462 511 "node": ">=6.9.0" 463 512 } 464 513 }, 465 514 "node_modules/@babel/parser": { 466 - "version": "7.25.9", 467 - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.9.tgz", 468 - "integrity": "sha512-aI3jjAAO1fh7vY/pBGsn1i9LDbRP43+asrRlkPuTXW5yHXtd1NgTEMudbBoDDxrf1daEEfPJqR+JBMakzrR4Dg==", 515 + "version": "7.26.2", 516 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", 517 + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", 469 518 "dependencies": { 470 - "@babel/types": "^7.25.9" 519 + "@babel/types": "^7.26.0" 471 520 }, 472 521 "bin": { 473 522 "parser": "bin/babel-parser.js" ··· 539 588 } 540 589 }, 541 590 "node_modules/@babel/types": { 542 - "version": "7.25.9", 543 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.9.tgz", 544 - "integrity": "sha512-OwS2CM5KocvQ/k7dFJa8i5bNGJP0hXWfVCfDkqRFP1IreH1JDC7wG6eCYCi0+McbfT8OR/kNqsI0UU0xP9H6PQ==", 591 + "version": "7.26.0", 592 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", 593 + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", 545 594 "dependencies": { 546 595 "@babel/helper-string-parser": "^7.25.9", 547 596 "@babel/helper-validator-identifier": "^7.25.9" ··· 1766 1815 ] 1767 1816 }, 1768 1817 "node_modules/@shikijs/core": { 1769 - "version": "1.22.1", 1770 - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.1.tgz", 1771 - "integrity": "sha512-bqAhT/Ri5ixV4oYsvJNH8UJjpjbINWlWyXY6tBTsP4OmD6XnFv43nRJ+lTdxd2rmG5pgam/x+zGR6kLRXrpEKA==", 1818 + "version": "1.23.1", 1819 + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.23.1.tgz", 1820 + "integrity": "sha512-NuOVgwcHgVC6jBVH5V7iblziw6iQbWWHrj5IlZI3Fqu2yx9awH7OIQkXIcsHsUmY19ckwSgUMgrqExEyP5A0TA==", 1772 1821 "dependencies": { 1773 - "@shikijs/engine-javascript": "1.22.1", 1774 - "@shikijs/engine-oniguruma": "1.22.1", 1775 - "@shikijs/types": "1.22.1", 1822 + "@shikijs/engine-javascript": "1.23.1", 1823 + "@shikijs/engine-oniguruma": "1.23.1", 1824 + "@shikijs/types": "1.23.1", 1776 1825 "@shikijs/vscode-textmate": "^9.3.0", 1777 1826 "@types/hast": "^3.0.4", 1778 1827 "hast-util-to-html": "^9.0.3" 1779 1828 } 1780 1829 }, 1781 1830 "node_modules/@shikijs/engine-javascript": { 1782 - "version": "1.22.1", 1783 - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.1.tgz", 1784 - "integrity": "sha512-540pyoy0LWe4jj2BVbgELwOFu1uFvRI7lg4hdsExrSXA9x7gqfzZ/Nnh4RfX86aDAgJ647gx4TCmRwACbnQSvw==", 1831 + "version": "1.23.1", 1832 + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.23.1.tgz", 1833 + "integrity": "sha512-i/LdEwT5k3FVu07SiApRFwRcSJs5QM9+tod5vYCPig1Ywi8GR30zcujbxGQFJHwYD7A5BUqagi8o5KS+LEVgBg==", 1785 1834 "dependencies": { 1786 - "@shikijs/types": "1.22.1", 1835 + "@shikijs/types": "1.23.1", 1787 1836 "@shikijs/vscode-textmate": "^9.3.0", 1788 - "oniguruma-to-js": "0.4.3" 1837 + "oniguruma-to-es": "0.4.1" 1789 1838 } 1790 1839 }, 1791 1840 "node_modules/@shikijs/engine-oniguruma": { 1792 - "version": "1.22.1", 1793 - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.1.tgz", 1794 - "integrity": "sha512-L+1Vmd+a2kk8HtogUFymQS6BjUfJnzcWoUp1BUgxoDiklbKSMvrsMuLZGevTOP1m0rEjgnC5MsDmsr8lX1lC+Q==", 1841 + "version": "1.23.1", 1842 + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.23.1.tgz", 1843 + "integrity": "sha512-KQ+lgeJJ5m2ISbUZudLR1qHeH3MnSs2mjFg7bnencgs5jDVPeJ2NVDJ3N5ZHbcTsOIh0qIueyAJnwg7lg7kwXQ==", 1795 1844 "dependencies": { 1796 - "@shikijs/types": "1.22.1", 1845 + "@shikijs/types": "1.23.1", 1797 1846 "@shikijs/vscode-textmate": "^9.3.0" 1798 1847 } 1799 1848 }, 1800 1849 "node_modules/@shikijs/types": { 1801 - "version": "1.22.1", 1802 - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.1.tgz", 1803 - "integrity": "sha512-+45f8mu/Hxqs6Kyhfm98Nld5n7Q7lwhjU8UtdQwrOPs7BnM4VAb929O3IQ2ce+4D7SlNFlZGd8CnKRSnwbQreQ==", 1850 + "version": "1.23.1", 1851 + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.23.1.tgz", 1852 + "integrity": "sha512-98A5hGyEhzzAgQh2dAeHKrWW4HfCMeoFER2z16p5eJ+vmPeF6lZ/elEne6/UCU551F/WqkopqRsr1l2Yu6+A0g==", 1804 1853 "dependencies": { 1805 1854 "@shikijs/vscode-textmate": "^9.3.0", 1806 1855 "@types/hast": "^3.0.4" ··· 2110 2159 "integrity": "sha512-pUrWq3V5PiSGFLeLxoGqReTZmiiXwY3jRkIG5sLLKjyqNxrwm/04b4nw7LSmGWJcKk59XOM/YRTUwOzo4MMlow==" 2111 2160 }, 2112 2161 "node_modules/acorn": { 2113 - "version": "8.13.0", 2114 - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.13.0.tgz", 2115 - "integrity": "sha512-8zSiw54Oxrdym50NlZ9sUusyO1Z1ZchgRLWRaK6c86XJFClyCgFKetdowBg5bKxyp/u+CDBJG4Mpp0m3HLZl9w==", 2162 + "version": "8.14.0", 2163 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", 2164 + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", 2116 2165 "bin": { 2117 2166 "acorn": "bin/acorn" 2118 2167 }, ··· 2207 2256 "url": "https://github.com/chalk/ansi-regex?sponsor=1" 2208 2257 } 2209 2258 }, 2210 - "node_modules/ansi-styles": { 2211 - "version": "3.2.1", 2212 - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 2213 - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 2214 - "dependencies": { 2215 - "color-convert": "^1.9.0" 2216 - }, 2217 - "engines": { 2218 - "node": ">=4" 2219 - } 2220 - }, 2221 2259 "node_modules/any-promise": { 2222 2260 "version": "1.3.0", 2223 2261 "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", ··· 2282 2320 } 2283 2321 }, 2284 2322 "node_modules/astro": { 2285 - "version": "4.16.7", 2286 - "resolved": "https://registry.npmjs.org/astro/-/astro-4.16.7.tgz", 2287 - "integrity": "sha512-nON+8MUEkWTFwXbS4zsQIq4t0Fs42eulM4x236AL+qNnWfqNAOOqAnFxO1dxfJ1q+XopIBbbT9Mtev+0zH47PQ==", 2323 + "version": "4.16.14", 2324 + "resolved": "https://registry.npmjs.org/astro/-/astro-4.16.14.tgz", 2325 + "integrity": "sha512-2IuLkIp4idyspugq+F52rHZyNqHHi2AdQzuKp3SGytg/YAm50dNeWhP/7l+enjgWZLloLq5xsH5gVQpoDFoyFg==", 2288 2326 "dependencies": { 2289 2327 "@astrojs/compiler": "^2.10.3", 2290 2328 "@astrojs/internal-helpers": "0.4.1", 2291 2329 "@astrojs/markdown-remark": "5.3.0", 2292 2330 "@astrojs/telemetry": "3.1.0", 2293 - "@babel/core": "^7.25.8", 2294 - "@babel/plugin-transform-react-jsx": "^7.25.7", 2295 - "@babel/types": "^7.25.8", 2331 + "@babel/core": "^7.26.0", 2332 + "@babel/plugin-transform-react-jsx": "^7.25.9", 2333 + "@babel/types": "^7.26.0", 2296 2334 "@oslojs/encoding": "^1.1.0", 2297 - "@rollup/pluginutils": "^5.1.2", 2335 + "@rollup/pluginutils": "^5.1.3", 2298 2336 "@types/babel__core": "^7.20.5", 2299 2337 "@types/cookie": "^0.6.0", 2300 - "acorn": "^8.13.0", 2338 + "acorn": "^8.14.0", 2301 2339 "aria-query": "^5.3.2", 2302 2340 "axobject-query": "^4.1.0", 2303 2341 "boxen": "8.0.1", ··· 2328 2366 "micromatch": "^4.0.8", 2329 2367 "mrmime": "^2.0.0", 2330 2368 "neotraverse": "^0.6.18", 2331 - "ora": "^8.1.0", 2369 + "ora": "^8.1.1", 2332 2370 "p-limit": "^6.1.0", 2333 2371 "p-queue": "^8.0.1", 2334 2372 "preferred-pm": "^4.0.0", 2335 2373 "prompts": "^2.4.2", 2336 2374 "rehype": "^13.0.2", 2337 2375 "semver": "^7.6.3", 2338 - "shiki": "^1.22.0", 2376 + "shiki": "^1.22.2", 2339 2377 "tinyexec": "^0.3.1", 2340 2378 "tsconfck": "^3.1.4", 2341 2379 "unist-util-visit": "^5.0.0", 2342 2380 "vfile": "^6.0.3", 2343 - "vite": "^5.4.9", 2381 + "vite": "^5.4.10", 2344 2382 "vitefu": "^1.0.3", 2345 2383 "which-pm": "^3.0.0", 2346 2384 "xxhash-wasm": "^1.0.2", 2347 2385 "yargs-parser": "^21.1.1", 2348 2386 "zod": "^3.23.8", 2349 - "zod-to-json-schema": "^3.23.3", 2387 + "zod-to-json-schema": "^3.23.5", 2350 2388 "zod-to-ts": "^1.2.0" 2351 2389 }, 2352 2390 "bin": { ··· 2413 2451 "postcss": "^8.1.0" 2414 2452 } 2415 2453 }, 2454 + "node_modules/await-lock": { 2455 + "version": "2.2.2", 2456 + "resolved": "https://registry.npmjs.org/await-lock/-/await-lock-2.2.2.tgz", 2457 + "integrity": "sha512-aDczADvlvTGajTDjcjpJMqRkOF6Qdz3YbPZm/PyW6tKPkx2hlYBzxMhEywM/tU72HrVZjgl5VCdRuMlA7pZ8Gw==" 2458 + }, 2416 2459 "node_modules/axobject-query": { 2417 2460 "version": "4.1.0", 2418 2461 "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", ··· 2470 2513 }, 2471 2514 "funding": { 2472 2515 "url": "https://github.com/sponsors/sindresorhus" 2473 - } 2474 - }, 2475 - "node_modules/boxen/node_modules/chalk": { 2476 - "version": "5.3.0", 2477 - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", 2478 - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", 2479 - "engines": { 2480 - "node": "^12.17.0 || ^14.13 || >=16.0.0" 2481 - }, 2482 - "funding": { 2483 - "url": "https://github.com/chalk/chalk?sponsor=1" 2484 2516 } 2485 2517 }, 2486 2518 "node_modules/brace-expansion": { ··· 2589 2621 } 2590 2622 }, 2591 2623 "node_modules/chalk": { 2592 - "version": "2.4.2", 2593 - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 2594 - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 2595 - "dependencies": { 2596 - "ansi-styles": "^3.2.1", 2597 - "escape-string-regexp": "^1.0.5", 2598 - "supports-color": "^5.3.0" 2599 - }, 2624 + "version": "5.3.0", 2625 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", 2626 + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", 2600 2627 "engines": { 2601 - "node": ">=4" 2628 + "node": "^12.17.0 || ^14.13 || >=16.0.0" 2629 + }, 2630 + "funding": { 2631 + "url": "https://github.com/chalk/chalk?sponsor=1" 2602 2632 } 2603 2633 }, 2604 2634 "node_modules/character-entities": { ··· 2827 2857 "node": ">=12.5.0" 2828 2858 } 2829 2859 }, 2830 - "node_modules/color-convert": { 2831 - "version": "1.9.3", 2832 - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 2833 - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 2834 - "dependencies": { 2835 - "color-name": "1.1.3" 2836 - } 2837 - }, 2838 2860 "node_modules/color-name": { 2839 2861 "version": "1.1.3", 2840 2862 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 2841 - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" 2863 + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", 2864 + "optional": true 2842 2865 }, 2843 2866 "node_modules/color-string": { 2844 2867 "version": "1.9.1", ··· 3069 3092 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", 3070 3093 "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==" 3071 3094 }, 3095 + "node_modules/emoji-regex-xs": { 3096 + "version": "1.0.0", 3097 + "resolved": "https://registry.npmjs.org/emoji-regex-xs/-/emoji-regex-xs-1.0.0.tgz", 3098 + "integrity": "sha512-LRlerrMYoIDrT6jgpeZ2YYl/L8EulRTt5hQcYjy5AInh7HWXKimpqx68aknBFpGL2+/IcogTcaydJEgaTmOpDg==" 3099 + }, 3072 3100 "node_modules/entities": { 3073 3101 "version": "4.5.0", 3074 3102 "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", ··· 3158 3186 "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 3159 3187 "engines": { 3160 3188 "node": ">=6" 3161 - } 3162 - }, 3163 - "node_modules/escape-string-regexp": { 3164 - "version": "1.0.5", 3165 - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 3166 - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", 3167 - "engines": { 3168 - "node": ">=0.8.0" 3169 3189 } 3170 3190 }, 3171 3191 "node_modules/esm-env": { ··· 3527 3547 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", 3528 3548 "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" 3529 3549 }, 3550 + "node_modules/graphemer": { 3551 + "version": "1.4.0", 3552 + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", 3553 + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" 3554 + }, 3530 3555 "node_modules/gray-matter": { 3531 3556 "version": "4.0.3", 3532 3557 "resolved": "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz", ··· 3559 3584 }, 3560 3585 "bin": { 3561 3586 "js-yaml": "bin/js-yaml.js" 3562 - } 3563 - }, 3564 - "node_modules/has-flag": { 3565 - "version": "3.0.0", 3566 - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 3567 - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", 3568 - "engines": { 3569 - "node": ">=4" 3570 3587 } 3571 3588 }, 3572 3589 "node_modules/hasown": { ··· 4014 4031 } 4015 4032 }, 4016 4033 "node_modules/is-reference": { 4017 - "version": "3.0.2", 4018 - "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", 4019 - "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", 4034 + "version": "3.0.3", 4035 + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", 4036 + "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", 4020 4037 "dependencies": { 4021 - "@types/estree": "*" 4038 + "@types/estree": "^1.0.6" 4022 4039 } 4023 4040 }, 4024 4041 "node_modules/is-unicode-supported": { ··· 4050 4067 "version": "2.0.0", 4051 4068 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 4052 4069 "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" 4070 + }, 4071 + "node_modules/iso-datestring-validator": { 4072 + "version": "2.2.2", 4073 + "resolved": "https://registry.npmjs.org/iso-datestring-validator/-/iso-datestring-validator-2.2.2.tgz", 4074 + "integrity": "sha512-yLEMkBbLZTlVQqOnQ4FiMujR6T4DEcCb1xizmvXS+OxuhwcbtynoosRzdMA69zZCShCNAbi+gJ71FxZBBXx1SA==" 4053 4075 }, 4054 4076 "node_modules/jackspeak": { 4055 4077 "version": "3.4.3", ··· 4239 4261 }, 4240 4262 "funding": { 4241 4263 "url": "https://github.com/sponsors/sindresorhus" 4242 - } 4243 - }, 4244 - "node_modules/log-symbols/node_modules/chalk": { 4245 - "version": "5.3.0", 4246 - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", 4247 - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", 4248 - "engines": { 4249 - "node": "^12.17.0 || ^14.13 || >=16.0.0" 4250 - }, 4251 - "funding": { 4252 - "url": "https://github.com/chalk/chalk?sponsor=1" 4253 4264 } 4254 4265 }, 4255 4266 "node_modules/log-symbols/node_modules/is-unicode-supported": { ··· 5395 5406 "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", 5396 5407 "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==" 5397 5408 }, 5409 + "node_modules/multiformats": { 5410 + "version": "9.9.0", 5411 + "resolved": "https://registry.npmjs.org/multiformats/-/multiformats-9.9.0.tgz", 5412 + "integrity": "sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==" 5413 + }, 5398 5414 "node_modules/mz": { 5399 5415 "version": "2.7.0", 5400 5416 "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", ··· 5502 5518 "url": "https://github.com/sponsors/sindresorhus" 5503 5519 } 5504 5520 }, 5505 - "node_modules/oniguruma-to-js": { 5506 - "version": "0.4.3", 5507 - "resolved": "https://registry.npmjs.org/oniguruma-to-js/-/oniguruma-to-js-0.4.3.tgz", 5508 - "integrity": "sha512-X0jWUcAlxORhOqqBREgPMgnshB7ZGYszBNspP+tS9hPD3l13CdaXcHbgImoHUHlrvGx/7AvFEkTRhAGYh+jzjQ==", 5521 + "node_modules/oniguruma-to-es": { 5522 + "version": "0.4.1", 5523 + "resolved": "https://registry.npmjs.org/oniguruma-to-es/-/oniguruma-to-es-0.4.1.tgz", 5524 + "integrity": "sha512-rNcEohFz095QKGRovP/yqPIKc+nP+Sjs4YTHMv33nMePGKrq/r2eu9Yh4646M5XluGJsUnmwoXuiXE69KDs+fQ==", 5509 5525 "dependencies": { 5510 - "regex": "^4.3.2" 5511 - }, 5512 - "funding": { 5513 - "url": "https://github.com/sponsors/antfu" 5526 + "emoji-regex-xs": "^1.0.0", 5527 + "regex": "^5.0.0", 5528 + "regex-recursion": "^4.2.1" 5514 5529 } 5515 5530 }, 5516 5531 "node_modules/ora": { 5517 - "version": "8.1.0", 5518 - "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.0.tgz", 5519 - "integrity": "sha512-GQEkNkH/GHOhPFXcqZs3IDahXEQcQxsSjEkK4KvEEST4t7eNzoMjxTzef+EZ+JluDEV+Raoi3WQ2CflnRdSVnQ==", 5532 + "version": "8.1.1", 5533 + "resolved": "https://registry.npmjs.org/ora/-/ora-8.1.1.tgz", 5534 + "integrity": "sha512-YWielGi1XzG1UTvOaCFaNgEnuhZVMSHYkW/FQ7UX8O26PtlpdM84c0f7wLPlkvx2RfiQmnzd61d/MGxmpQeJPw==", 5520 5535 "dependencies": { 5521 5536 "chalk": "^5.3.0", 5522 5537 "cli-cursor": "^5.0.0", ··· 5533 5548 }, 5534 5549 "funding": { 5535 5550 "url": "https://github.com/sponsors/sindresorhus" 5536 - } 5537 - }, 5538 - "node_modules/ora/node_modules/chalk": { 5539 - "version": "5.3.0", 5540 - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", 5541 - "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", 5542 - "engines": { 5543 - "node": "^12.17.0 || ^14.13 || >=16.0.0" 5544 - }, 5545 - "funding": { 5546 - "url": "https://github.com/chalk/chalk?sponsor=1" 5547 5551 } 5548 5552 }, 5549 5553 "node_modules/p-limit": { ··· 6100 6104 } 6101 6105 }, 6102 6106 "node_modules/regex": { 6103 - "version": "4.3.3", 6104 - "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.3.tgz", 6105 - "integrity": "sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg==" 6107 + "version": "5.0.2", 6108 + "resolved": "https://registry.npmjs.org/regex/-/regex-5.0.2.tgz", 6109 + "integrity": "sha512-/pczGbKIQgfTMRV0XjABvc5RzLqQmwqxLHdQao2RTXPk+pmTXB2P0IaUHYdYyk412YLwUIkaeMd5T+RzVgTqnQ==", 6110 + "dependencies": { 6111 + "regex-utilities": "^2.3.0" 6112 + } 6113 + }, 6114 + "node_modules/regex-recursion": { 6115 + "version": "4.2.1", 6116 + "resolved": "https://registry.npmjs.org/regex-recursion/-/regex-recursion-4.2.1.tgz", 6117 + "integrity": "sha512-QHNZyZAeKdndD1G3bKAbBEKOSSK4KOHQrAJ01N1LJeb0SoH4DJIeFhp0uUpETgONifS4+P3sOgoA1dhzgrQvhA==", 6118 + "dependencies": { 6119 + "regex-utilities": "^2.3.0" 6120 + } 6121 + }, 6122 + "node_modules/regex-utilities": { 6123 + "version": "2.3.0", 6124 + "resolved": "https://registry.npmjs.org/regex-utilities/-/regex-utilities-2.3.0.tgz", 6125 + "integrity": "sha512-8VhliFJAWRaUiVvREIiW2NXXTmHs4vMNnSzuJVhscgmGav3g9VDxLrQndI3dZZVVdp0ZO/5v0xmX516/7M9cng==" 6106 6126 }, 6107 6127 "node_modules/rehype": { 6108 6128 "version": "13.0.2", ··· 6525 6545 } 6526 6546 }, 6527 6547 "node_modules/shiki": { 6528 - "version": "1.22.1", 6529 - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.1.tgz", 6530 - "integrity": "sha512-PbJ6XxrWLMwB2rm3qdjIHNm3zq4SfFnOx0B3rEoi4AN8AUngsdyZ1tRe5slMPtn6jQkbUURLNZPpLR7Do3k78g==", 6548 + "version": "1.23.1", 6549 + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.23.1.tgz", 6550 + "integrity": "sha512-8kxV9TH4pXgdKGxNOkrSMydn1Xf6It8lsle0fiqxf7a1149K1WGtdOu3Zb91T5r1JpvRPxqxU3C2XdZZXQnrig==", 6531 6551 "dependencies": { 6532 - "@shikijs/core": "1.22.1", 6533 - "@shikijs/engine-javascript": "1.22.1", 6534 - "@shikijs/engine-oniguruma": "1.22.1", 6535 - "@shikijs/types": "1.22.1", 6552 + "@shikijs/core": "1.23.1", 6553 + "@shikijs/engine-javascript": "1.23.1", 6554 + "@shikijs/engine-oniguruma": "1.23.1", 6555 + "@shikijs/types": "1.23.1", 6536 6556 "@shikijs/vscode-textmate": "^9.3.0", 6537 6557 "@types/hast": "^3.0.4" 6538 6558 } ··· 6782 6802 "node": ">=16 || 14 >=14.17" 6783 6803 } 6784 6804 }, 6785 - "node_modules/supports-color": { 6786 - "version": "5.5.0", 6787 - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 6788 - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 6789 - "dependencies": { 6790 - "has-flag": "^3.0.0" 6791 - }, 6792 - "engines": { 6793 - "node": ">=4" 6794 - } 6795 - }, 6796 6805 "node_modules/supports-preserve-symlinks-flag": { 6797 6806 "version": "1.0.0", 6798 6807 "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", ··· 6805 6814 } 6806 6815 }, 6807 6816 "node_modules/svelte": { 6808 - "version": "5.1.1", 6809 - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.1.1.tgz", 6810 - "integrity": "sha512-JiUZpRawsXuxrkOQWdmO6jPiCXPwQd/5gImDj3d2u3+pys5x5LnFIyLuDw1f8S4etBM5YDoYKDHRJQRmbXdZcg==", 6817 + "version": "5.2.7", 6818 + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.2.7.tgz", 6819 + "integrity": "sha512-cEhPGuLHiH2+Z8B1FwQgiZJgA39uUmJR4516TKrM5zrp0/cuwJkfhUfcTxhAkznanAF5fXUKzvYR4o+Ksx3ZCQ==", 6811 6820 "dependencies": { 6812 6821 "@ampproject/remapping": "^2.3.0", 6813 6822 "@jridgewell/sourcemap-codec": "^1.5.0", ··· 6818 6827 "axobject-query": "^4.1.0", 6819 6828 "esm-env": "^1.0.0", 6820 6829 "esrap": "^1.2.2", 6821 - "is-reference": "^3.0.2", 6830 + "is-reference": "^3.0.3", 6822 6831 "locate-character": "^3.0.0", 6823 6832 "magic-string": "^0.30.11", 6824 6833 "zimmerframe": "^1.1.2" ··· 6984 6993 "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.1.tgz", 6985 6994 "integrity": "sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==" 6986 6995 }, 6996 + "node_modules/tlds": { 6997 + "version": "1.255.0", 6998 + "resolved": "https://registry.npmjs.org/tlds/-/tlds-1.255.0.tgz", 6999 + "integrity": "sha512-tcwMRIioTcF/FcxLev8MJWxCp+GUALRhFEqbDoZrnowmKSGqPrl5pqS+Sut2m8BgJ6S4FExCSSpGffZ0Tks6Aw==", 7000 + "bin": { 7001 + "tlds": "bin.js" 7002 + } 7003 + }, 6987 7004 "node_modules/to-regex-range": { 6988 7005 "version": "5.0.1", 6989 7006 "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", ··· 7076 7093 "integrity": "sha512-ztlGq1CB0TX9wKv3DJPRBiT5GJf0Gio1bRzcXElEZMjW1VlyZifiZqk6No3OS1XwNBx+n74dSbH2Bjy+5fN5Xw==", 7077 7094 "dependencies": { 7078 7095 "semver": "^7.3.8" 7096 + } 7097 + }, 7098 + "node_modules/uint8arrays": { 7099 + "version": "3.0.0", 7100 + "resolved": "https://registry.npmjs.org/uint8arrays/-/uint8arrays-3.0.0.tgz", 7101 + "integrity": "sha512-HRCx0q6O9Bfbp+HHSfQQKD7wU70+lydKVt4EghkdOvlK/NlrF90z+eXV34mUd48rNvVJXwkrMSPpCATkct8fJA==", 7102 + "dependencies": { 7103 + "multiformats": "^9.4.2" 7079 7104 } 7080 7105 }, 7081 7106 "node_modules/undici-types": {
+4 -3
package.json
··· 11 11 "format": "prettier --write ." 12 12 }, 13 13 "dependencies": { 14 + "@ascorbic/bluesky-loader": "^0.0.3", 14 15 "@astrojs/check": "^0.9.4", 15 - "@astrojs/mdx": "^3.1.8", 16 + "@astrojs/mdx": "^3.1.9", 16 17 "@astrojs/rss": "^4.0.9", 17 18 "@astrojs/sitemap": "^3.2.1", 18 - "@astrojs/svelte": "^5.7.2", 19 + "@astrojs/svelte": "^6.0.2", 19 20 "@astrojs/tailwind": "^5.1.2", 20 21 "@tailwindcss/forms": "^0.5.9", 21 - "astro": "^4.16.7", 22 + "astro": "^4.16.14", 22 23 "astro-og-canvas": "^0.5.4", 23 24 "svelte": "^5.1.1", 24 25 "tailwind-merge": "^2.5.4",
+5 -3
src/config.json
··· 16 16 "LINKEDIN_URL": "", 17 17 "YOUTUBE_URL": "", 18 18 "SUBSTACK_URL": "https://flo-bit.substack.com", 19 - "EMAIL": "flo.bit.dev@gmail.com" 19 + "EMAIL": "flo.bit.dev@gmail.com", 20 + "BLUESKY_URL": "https://bsky.app/profile/flo-bit.dev" 20 21 }, 22 + "BLUESKY_IDENTIFIER": "flo-bit.dev", 21 23 "MANUAL_SITE_BASE": false, 22 - "SITE": "https://hello.there", 23 - "BASE": "" 24 + "SITE": "https://flo-bit.dev", 25 + "BASE": "/blog" 24 26 }
+2
.github/workflows/deploy.yml
··· 4 4 push: 5 5 branches: [main] 6 6 workflow_dispatch: 7 + schedule: 8 + - cron: '0 */12 * * *' # every 12 hours 7 9 8 10 permissions: 9 11 contents: read
src/assets/likes.png

This is a binary file and will not be displayed.

+23 -4
src/components/Footer.astro
··· 1 1 --- 2 - import { 3 - NAME, 4 - SOCIAL_LINKS 5 - } from "../config.json"; 2 + import { NAME, SOCIAL_LINKS } from "../config.json"; 6 3 7 4 const today = new Date(); 8 5 --- ··· 31 28 d="M22 12c0-5.523-4.477-10-10-10S2 6.477 2 12c0 4.991 3.657 9.128 8.438 9.878v-6.987h-2.54V12h2.54V9.797c0-2.506 1.492-3.89 3.777-3.89 1.094 0 2.238.195 2.238.195v2.46h-1.26c-1.243 0-1.63.771-1.63 1.562V12h2.773l-.443 2.89h-2.33v6.988C18.343 21.128 22 16.991 22 12z" 32 29 clip-rule="evenodd" 33 30 /> 31 + </svg> 32 + </a> 33 + ) : null 34 + } 35 + { 36 + SOCIAL_LINKS.BLUESKY_URL ? ( 37 + <a 38 + target="_blank" 39 + href={SOCIAL_LINKS.BLUESKY_URL} 40 + class="text-base-600 hover:text-base-800 dark:text-base-400 dark:hover:text-base-200" 41 + > 42 + <span class="sr-only">Bluesky</span> 43 + 44 + <svg 45 + fill="currentColor" 46 + xmlns="http://www.w3.org/2000/svg" 47 + viewBox="-40 -40 680 620" 48 + version="1.1" 49 + class="h-6 w-6" 50 + aria-hidden="true" 51 + > 52 + <path d="m135.72 44.03c66.496 49.921 138.02 151.14 164.28 205.46 26.262-54.316 97.782-155.54 164.28-205.46 47.98-36.021 125.72-63.892 125.72 24.795 0 17.712-10.155 148.79-16.111 170.07-20.703 73.984-96.144 92.854-163.25 81.433 117.3 19.964 147.14 86.092 82.697 152.22-122.39 125.59-175.91-31.511-189.63-71.766-2.514-7.3797-3.6904-10.832-3.7077-7.8964-0.0174-2.9357-1.1937 0.51669-3.7077 7.8964-13.714 40.255-67.233 197.36-189.63 71.766-64.444-66.128-34.605-132.26 82.697-152.22-67.108 11.421-142.55-7.4491-163.25-81.433-5.9562-21.282-16.111-152.36-16.111-170.07 0-88.687 77.742-60.816 125.72-24.795z" /> 34 53 </svg> 35 54 </a> 36 55 ) : null
+11 -1
src/content/config.ts
··· 38 38 }), 39 39 }); 40 40 41 - export const collections = { blog }; 41 + import { authorFeedLoader } from "@ascorbic/bluesky-loader"; 42 + import { BLUESKY_IDENTIFIER } from "../config.json"; 43 + 44 + 45 + const posts = defineCollection({ 46 + loader: authorFeedLoader({ 47 + identifier: BLUESKY_IDENTIFIER, 48 + }), 49 + }); 50 + 51 + export const collections = { blog, posts };
+37
src/components/bluesky/BlueskyLikes.astro
··· 1 + --- 2 + import { SITE, BASE, BLUESKY_IDENTIFIER } from "../../config.json"; 3 + import { getCollection } from "astro:content"; 4 + import { getLikes } from "./utils"; 5 + import { cn } from "src/utils"; 6 + import Likes from "./Likes.svelte"; 7 + 8 + let posts = await getCollection("posts"); 9 + 10 + console.log(posts.map((post) => post.data.record.embed?.external?.uri)); 11 + 12 + const path = Astro.url.pathname; 13 + 14 + console.log(SITE + BASE + path); 15 + const url = SITE + BASE + path; 16 + 17 + // get first post (sorted by indexedAt) with url in embed.external.uri 18 + const post = posts 19 + .sort( 20 + (a, b) => 21 + new Date(a.data.indexedAt).getTime() - 22 + new Date(b.data.indexedAt).getTime() 23 + ) 24 + .find((post) => post.data.record.embed?.external?.uri === url); 25 + 26 + let likesData = post ? await getLikes(post.data.uri) : []; 27 + 28 + console.log(likesData); 29 + --- 30 + 31 + <Likes 32 + uri={post?.data.uri} 33 + likesData={likesData} 34 + likesCount={post?.data.likeCount} 35 + user={BLUESKY_IDENTIFIER} 36 + client:idle 37 + />
+96
src/components/bluesky/Likes.svelte
··· 1 + <script lang="ts"> 2 + import { onMount } from "svelte"; 3 + import { atUriToPostUri, getUserPosts, getLikes, getPost } from "./utils"; 4 + import { cn } from "src/utils"; 5 + 6 + const { uri, likesCount, likesData, user } = $props(); 7 + 8 + let postUri = $state(uri); 9 + let postLikesCount = $state(likesCount); 10 + let postLikesData = $state(likesData.filter((like) => like.actor.avatar)); 11 + 12 + onMount(async () => { 13 + if (!uri && user) { 14 + let posts = await getUserPosts(user); 15 + 16 + const url = window.location.href; 17 + 18 + const post = posts.find((post) => post.post.embed?.external?.uri === url); 19 + 20 + if (post) { 21 + postUri = post.post.uri; 22 + postLikesCount = post.post.likeCount; 23 + 24 + postLikesData = (await getLikes(post.post.uri)).filter( 25 + (like) => like.actor.avatar 26 + ); 27 + } 28 + } else if (uri) { 29 + postLikesData = (await getLikes(uri)).filter((like) => like.actor.avatar); 30 + 31 + const post = await getPost(uri); 32 + 33 + if (post) { 34 + postUri = post.uri; 35 + postLikesCount = post.likeCount; 36 + } 37 + } 38 + }); 39 + </script> 40 + 41 + {#if postUri} 42 + <div class="not-prose flex flex-col mt-16 gap-4"> 43 + <div class="text-sm text-base-100 font-semibold"> 44 + {postLikesCount} like{postLikesCount === 1 ? "" : "s"} on bluesky 45 + </div> 46 + 47 + <div class="isolate flex -space-x-2 overflow-hidden px-4 flex-wrap"> 48 + {#each postLikesData as user, index} 49 + <a 50 + href={`https://bsky.app/profile/${user.actor.handle}`} 51 + class={cn( 52 + "relative inline-block size-12 rounded-full overflow-hidden ring-2 ring-base-900 bg-base-950", 53 + index === 0 ? "-ml-2" : "" 54 + )} 55 + target="_blank" 56 + > 57 + <img 58 + title={user.actor.handle} 59 + loading="lazy" 60 + src={user.actor.avatar} 61 + alt={"liked by " + user.actor.handle} 62 + /> 63 + </a> 64 + {/each} 65 + 66 + {#if postLikesData.length < postLikesCount} 67 + <div 68 + class="z-10 text-sm text-accent-300 size-12 rounded-full flex items-center justify-center bg-accent-950 ring-2 ring-base-900 font-semibold mb-4" 69 + > 70 + +{postLikesCount - postLikesData.length} 71 + </div> 72 + {/if} 73 + </div> 74 + 75 + <a 76 + target="_blank" 77 + href={atUriToPostUri(postUri)} 78 + class="text-sm text-accent-500 font-semibold inline-flex w-fit items-center gap-1.5 bg-accent-900/30 px-3 py-2 rounded-xl border border-accent-900/50" 79 + > 80 + <svg 81 + xmlns="http://www.w3.org/2000/svg" 82 + viewBox="0 0 24 24" 83 + fill="currentColor" 84 + class="size-6" 85 + aria-hidden="true" 86 + > 87 + <path 88 + d="m11.645 20.91-.007-.003-.022-.012a15.247 15.247 0 0 1-.383-.218 25.18 25.18 0 0 1-4.244-3.17C4.688 15.36 2.25 12.174 2.25 8.25 2.25 5.322 4.714 3 7.688 3A5.5 5.5 0 0 1 12 5.052 5.5 5.5 0 0 1 16.313 3c2.973 0 5.437 2.322 5.437 5.25 0 3.925-2.438 7.111-4.739 9.256a25.175 25.175 0 0 1-4.244 3.17 15.247 15.247 0 0 1-.383.219l-.022.012-.007.004-.003.001a.752.752 0 0 1-.704 0l-.003-.001Z" 89 + ></path> 90 + </svg> 91 + 92 + <span class="sr-only">Like</span> 93 + on bluesky</a 94 + > 95 + </div> 96 + {/if}
+21
src/components/bluesky/types.ts
··· 1 + import { 2 + AppBskyFeedPost, 3 + AppBskyFeedDefs, 4 + AppBskyEmbedRecord, 5 + AppBskyEmbedExternal, 6 + AppBskyEmbedImages, 7 + AppBskyEmbedRecordWithMedia, 8 + AppBskyEmbedVideo, 9 + } from '@atproto/api'; 10 + 11 + export interface Post extends AppBskyFeedDefs.PostView { 12 + record: AppBskyFeedPost.Record; 13 + } 14 + 15 + export type EmbedView = 16 + | AppBskyEmbedRecord.View 17 + | AppBskyEmbedImages.View 18 + | AppBskyEmbedVideo.View 19 + | AppBskyEmbedExternal.View 20 + | AppBskyEmbedRecordWithMedia.View 21 + | { [k: string]: unknown; $type: string };
+197
src/components/bluesky/utils.ts
··· 1 + import { 2 + AppBskyEmbedExternal, 3 + AppBskyEmbedImages, 4 + AppBskyEmbedRecord, 5 + AppBskyEmbedRecordWithMedia, 6 + AppBskyEmbedVideo, 7 + AppBskyFeedDefs, 8 + AtpAgent, 9 + RichText, 10 + } from '@atproto/api'; 11 + import type { Post } from './types'; 12 + 13 + const escapeMap: Record<string, string> = { 14 + '&': '&amp;', 15 + '<': '&lt;', 16 + '>': '&gt;', 17 + '"': '&quot;', 18 + "'": '&#39;', 19 + }; 20 + 21 + export const escapeHTML = (str?: string) => 22 + str?.replace(/[&<>"']/g, (match) => escapeMap[match] || match) ?? ''; 23 + 24 + export function renderPostAsHtml(post?: AppBskyFeedDefs.PostView | Post) { 25 + if (!post) { 26 + return ''; 27 + } 28 + const rt = new RichText(post.record as any); 29 + let html = ''; 30 + for (const segment of rt.segments()) { 31 + if (segment.isLink()) { 32 + html += `<a href="${escapeHTML(segment.link?.uri)}">${escapeHTML( 33 + segment.text 34 + )}</a>`; 35 + } else if (segment.isMention()) { 36 + html += `<a href="https://bsky.app/profile/${escapeHTML( 37 + segment.mention?.did 38 + )}">${escapeHTML(segment.text)}</a>`; 39 + } else if (segment.isTag()) { 40 + html += `<a href="https://bsky.app/hastag/${escapeHTML( 41 + segment.tag?.tag 42 + )}">#${escapeHTML(segment.tag?.tag)}</a>`; 43 + } else { 44 + html += escapeHTML(segment.text); 45 + } 46 + } 47 + return html; 48 + } 49 + 50 + export function viewRecordToPostView( 51 + viewRecord: AppBskyEmbedRecord.ViewRecord 52 + ): AppBskyFeedDefs.PostView { 53 + const { value, embeds, ...rest } = viewRecord; 54 + return { 55 + ...rest, 56 + $type: 'app.bsky.feed.defs#postView', 57 + record: value, 58 + embed: embeds?.[0], 59 + } as AppBskyFeedDefs.PostView; 60 + } 61 + 62 + export function viewRecordToEmbed( 63 + viewRecord: AppBskyEmbedRecord.ViewRecord, 64 + allowNestedQuotes = false 65 + ) { 66 + const { embed } = viewRecordToPostView(viewRecord); 67 + 68 + if (allowNestedQuotes) { 69 + return embed; 70 + } else { 71 + if ( 72 + AppBskyEmbedImages.isView(embed) || 73 + AppBskyEmbedExternal.isView(embed) || 74 + AppBskyEmbedVideo.isView(embed) 75 + ) { 76 + return embed; 77 + } else if ( 78 + AppBskyEmbedRecordWithMedia.isView(embed) && 79 + (AppBskyEmbedImages.isView(embed.media) || 80 + AppBskyEmbedExternal.isView(embed.media) || 81 + AppBskyEmbedVideo.isView(embed.media)) 82 + ) { 83 + return embed.media; 84 + } 85 + } 86 + return undefined; 87 + } 88 + 89 + const agent = new AtpAgent({ 90 + service: 'https://public.api.bsky.app', 91 + }); 92 + 93 + export async function resolvePost( 94 + postUrl: string | Post | AppBskyFeedDefs.PostView 95 + ): Promise<Post | undefined> { 96 + let atUri; 97 + 98 + if (typeof postUrl === 'object') { 99 + return postUrl as Post; 100 + } 101 + 102 + if (postUrl.startsWith('at:')) { 103 + atUri = postUrl; 104 + } else { 105 + if (!postUrl.startsWith('https://bsky.app/')) { 106 + return undefined; 107 + } 108 + const urlParts = new URL(postUrl).pathname.split('/'); 109 + let did = urlParts[2]!; 110 + const postId = urlParts[4]!; 111 + if (!did || !postId) { 112 + return undefined; 113 + } 114 + if (!did.startsWith('did:')) { 115 + try { 116 + const handleResolution = await agent.resolveHandle({ handle: did }); 117 + if (!handleResolution.data.did) { 118 + return undefined; 119 + } 120 + did = handleResolution.data.did; 121 + } catch (e: any) { 122 + console.error( 123 + `[error] astro-embed` + '\n ' + (e?.message ?? e) 124 + ); 125 + return undefined; 126 + } 127 + } 128 + 129 + atUri = `at://${did}/app.bsky.feed.post/${postId}`; 130 + } 131 + 132 + try { 133 + const hydratedPost = await agent.getPosts({ uris: [atUri] }); 134 + return hydratedPost.data.posts[0] as unknown as Post; 135 + } catch (e: any) { 136 + console.error(`[error] astro-embed` + '\n ' + (e?.message ?? e)); 137 + return undefined; 138 + } 139 + } 140 + 141 + export function atUriToPostUri(atUri: string) { 142 + const [, , did, , postId] = atUri.split('/'); 143 + return `https://bsky.app/profile/${did}/post/${postId}`; 144 + } 145 + 146 + export function atUriToStarterPackUri(atUri: string) { 147 + const [, , did, , packId] = atUri.split('/'); 148 + return `https://bsky.app/starter-pack/${did}/${packId}`; 149 + } 150 + 151 + export function atUriToListUri(atUri: string) { 152 + const [, , did, , listId] = atUri.split('/'); 153 + return `https://bsky.app/profile/${did}/lists/${listId}`; 154 + } 155 + 156 + export function starterPackOgImage(uri: string) { 157 + const [, , did, , packId] = uri.split('/'); 158 + return `https://ogcard.cdn.bsky.app/start/${did}/${packId}`; 159 + } 160 + 161 + export async function getLikes(uri: string, getMore = false) { 162 + let allLikes = []; 163 + 164 + let likesData, cursor; 165 + do { 166 + let getLikesURL = `https://public.api.bsky.app/xrpc/app.bsky.feed.getLikes?uri=${uri}&limit=100`; 167 + 168 + if (cursor) { 169 + getLikesURL += `&cursor=${cursor}`; 170 + } 171 + const likes = await fetch(getLikesURL); 172 + 173 + likesData = await likes.json(); 174 + cursor = likesData.cursor; 175 + allLikes.push(...likesData.likes); 176 + } while (cursor && getMore); 177 + 178 + return allLikes; 179 + } 180 + 181 + export async function getPost(uri: string) { 182 + try { 183 + const hydratedPost = await agent.getPosts({ uris: [uri] }); 184 + return hydratedPost.data.posts[0] as unknown as Post; 185 + } catch (e: any) { 186 + console.error(`[error] astro-embed` + '\n ' + (e?.message ?? e)); 187 + return undefined; 188 + } 189 + } 190 + 191 + export async function getUserPosts(actor: string) { 192 + const getPostURL = `https://public.api.bsky.app/xrpc/app.bsky.feed.getAuthorFeed?actor=${actor}&limit=100`; 193 + const posts = await fetch(getPostURL); 194 + const postsData = await posts.json(); 195 + console.log(postsData); 196 + return postsData.feed; 197 + }
+25
src/content/blog/likes-via-bluesky.md
··· 1 + --- 2 + title: "Showing Likes using Bluesky" 3 + description: "how to show likes on your blog posts using bluesky" 4 + pubDate: "Nov 22 2024" 5 + published: true 6 + heroImage: "/src/assets/blog-placeholder-3.jpg" 7 + tags: ["setup"] 8 + --- 9 + 10 + You can show likes on your blog posts using bluesky. 11 + 12 + ## How it works 13 + 14 + Set the `BLUESKY_IDENTIFIER` in your `src/config.json` file to your bluesky handle (without the `@`). 15 + 16 + Then just post a link to your blog post on bluesky and likes will be shown on your blog posts, looking something like this: 17 + 18 + ![likes]($assets/likes.png) 19 + 20 + Note that no like button is shown if there is no post on bluesky linking to your blog post. 21 + 22 + Likes are both server-side rendered on build and updated on the client when you navigate to the page 23 + (so they work without javascript, but might be a bit outdated). 24 + 25 + See a live example below:
+2
src/pages/posts/[...slug].astro
··· 8 8 import FormattedDate from "$components/FormattedDate.astro"; 9 9 import { BASE } from "../../config.json"; 10 10 import { getBlogPosts } from "src/utils"; 11 + import BlueskyLikes from "$components/bluesky/BlueskyLikes.astro"; 11 12 12 13 export async function getStaticPaths() { 13 14 const posts = await getBlogPosts(); ··· 63 64 64 65 <h1 class="mt-4">{post.data.title}</h1> 65 66 <Content /> 67 + <BlueskyLikes /> 66 68 </BlogPost> 67 69 </main> 68 70 <Footer />