Error
+Follower handle is required.
++ Go back +
+diff --git a/CHANGES.md b/CHANGES.md
index 9e02463..25593c3 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -6,6 +6,15 @@ Version 0.4.0
To be released.
+### @fedify/botkit
+
+ - Added remote follow button. [[#10], [#14] by Hyeonseo Kim]
+
+ - Added Follow button and modal on main page.
+ - Added `POST /follow` route to handle remote follow action.
+
+[#10]: https://github.com/fedify-dev/botkit/issues/10
+[#14]: https://github.com/fedify-dev/botkit/pull/14
Version 0.3.0
-------------
diff --git a/deno.json b/deno.json
index 34491cb..a754c93 100644
--- a/deno.json
+++ b/deno.json
@@ -8,7 +8,7 @@
"temporal"
],
"imports": {
- "@fedify/fedify": "jsr:@fedify/fedify@^1.8.8",
+ "@fedify/fedify": "jsr:@fedify/fedify@1.9.0-dev.1516+8f42bff1",
"@logtape/logtape": "jsr:@logtape/logtape@^1.0.4",
"@std/fs": "jsr:@std/fs@^1.0.19",
"@std/path": "jsr:@std/path@^1.1.1",
diff --git a/deno.lock b/deno.lock
index 5640581..a92aa59 100644
--- a/deno.lock
+++ b/deno.lock
@@ -2,11 +2,11 @@
"version": "5",
"specifiers": {
"jsr:@es-toolkit/es-toolkit@^1.39.5": "1.39.10",
- "jsr:@fedify/fedify@^1.8.8": "1.8.8",
+ "jsr:@fedify/fedify@1.9.0-dev.1516+8f42bff1": "1.9.0-dev.1516+8f42bff1",
"jsr:@fedify/markdown-it-hashtag@0.3": "0.3.0",
"jsr:@fedify/markdown-it-mention@0.3": "0.3.0",
"jsr:@hongminhee/x-forwarded-fetch@0.2": "0.2.0",
- "jsr:@hono/hono@^4.8.2": "4.9.4",
+ "jsr:@hono/hono@^4.8.2": "4.9.6",
"jsr:@hugoalh/http-header-link@^1.0.2": "1.0.3",
"jsr:@hugoalh/is-string-singleline@^1.0.4": "1.0.5",
"jsr:@logtape/logtape@1": "1.0.4",
@@ -34,7 +34,7 @@
"npm:multicodec@^3.2.1": "3.2.1",
"npm:pkijs@^3.2.4": "3.2.5",
"npm:structured-field-values@^2.0.4": "2.0.4",
- "npm:tsdown@~0.12.8": "0.12.9_rolldown@1.0.0-beta.34",
+ "npm:tsdown@~0.12.8": "0.12.9_rolldown@1.0.0-beta.33",
"npm:uri-template-router@^0.0.17": "0.0.17",
"npm:url-template@^3.1.1": "3.1.1",
"npm:uuid@^11.1.0": "11.1.0",
@@ -44,8 +44,8 @@
"@es-toolkit/es-toolkit@1.39.10": {
"integrity": "8757072a13aa64b3b349ba2b9d7d22fbe7ea6f138506c6cd2222d767cd79918f"
},
- "@fedify/fedify@1.8.8": {
- "integrity": "6f8d83e26771415e2b062a264a6d09bc4800eff2519ea23cbb26e6e38c6a0396",
+ "@fedify/fedify@1.9.0-dev.1516+8f42bff1": {
+ "integrity": "346a26175f9b552e77b44ba56936acff5483b3387d0dc29bec23fe85db2ba5cc",
"dependencies": [
"jsr:@es-toolkit/es-toolkit",
"jsr:@hugoalh/http-header-link",
@@ -91,6 +91,9 @@
"@hono/hono@4.9.4": {
"integrity": "de006e32f3bab18e5a5bed4c75c5e0aaa46958d3653e6646b534a874d690dccc"
},
+ "@hono/hono@4.9.6": {
+ "integrity": "b85abb0013d167a290b1808d1d4d542dee269df31d4f47122023259fdd7e184b"
+ },
"@hugoalh/http-header-link@1.0.3": {
"integrity": "3372096a73d755e3351f7fbd7155db7725874c2682a594a655580e3866563024",
"dependencies": [
@@ -236,11 +239,11 @@
"@opentelemetry/semantic-conventions@1.36.0": {
"integrity": "sha512-TtxJSRD8Ohxp6bKkhrm27JRHAxPczQA7idtcTOMYI+wQRRrfgqxHv1cFbCApcSnNjtXkmzFozn6jQtFrOmbjPQ=="
},
- "@oxc-project/runtime@0.82.3": {
- "integrity": "sha512-LNh5GlJvYHAnMurO+EyA8jJwN1rki7l3PSHuosDh2I7h00T6/u9rCkUjg/SvPmT1CZzvhuW0y+gf7jcqUy/Usg=="
+ "@oxc-project/runtime@0.82.2": {
+ "integrity": "sha512-cYxcj5CPn/vo5QSpCZcYzBiLidU5+GlFSqIeNaMgBDtcVRBsBJHZg3pHw999W6nHamFQ1EHuPPByB26tjaJiJw=="
},
- "@oxc-project/types@0.82.3": {
- "integrity": "sha512-6nCUxBnGX0c6qfZW5MaF6/fmu5dHJDMiMPaioKHKs5mi5+8/FHQ7WGjgQIz1zxpmceMYfdIXkOaLYE+ejbuOtA=="
+ "@oxc-project/types@0.82.2": {
+ "integrity": "sha512-WMGSwd9FsNBs/WfqIOH0h3k1LBdjZJQGYjGnC+vla/fh6HUsu5HzGPerRljiq1hgMQ6gs031YJR12VyP57b/hQ=="
},
"@phensley/language-tag@1.13.1": {
"integrity": "sha512-0cqJT7yC1wz0LlT63gs6lfTSgvedWA+Msg2tDbp9b5NCF9CTyLZ/9UbncBlXRHHvugbhtlT3NjM6lvwK3mrIoA==",
@@ -254,80 +257,80 @@
"quansync"
]
},
- "@rolldown/binding-android-arm64@1.0.0-beta.34": {
- "integrity": "sha512-jf5GNe5jP3Sr1Tih0WKvg2bzvh5T/1TA0fn1u32xSH7ca/p5t+/QRr4VRFCV/na5vjwKEhwWrChsL2AWlY+eoA==",
+ "@rolldown/binding-android-arm64@1.0.0-beta.33": {
+ "integrity": "sha512-xhDQXKftRkEULIxCddrKMR8y0YO/Y+6BKk/XrQP2B29YjV2wr8DByoEz+AHX9BfLHb2srfpdN46UquBW2QXWpQ==",
"os": ["android"],
"cpu": ["arm64"]
},
- "@rolldown/binding-darwin-arm64@1.0.0-beta.34": {
- "integrity": "sha512-2F/TqH4QuJQ34tgWxqBjFL3XV1gMzeQgUO8YRtCPGBSP0GhxtoFzsp7KqmQEothsxztlv+KhhT9Dbg3HHwHViQ==",
+ "@rolldown/binding-darwin-arm64@1.0.0-beta.33": {
+ "integrity": "sha512-7lhhY08v5ZtRq8JJQaJ49fnJombAPnqllKKCDLU/UvaqNAOEyTGC8J1WVOLC4EA4zbXO5U3CCRgVGyAFNH2VtQ==",
"os": ["darwin"],
"cpu": ["arm64"]
},
- "@rolldown/binding-darwin-x64@1.0.0-beta.34": {
- "integrity": "sha512-E1QuFslgLWbHQ8Qli/AqUKdfg0pockQPwRxVbhNQ74SciZEZpzLaujkdmOLSccMlSXDfFCF8RPnMoRAzQ9JV8Q==",
+ "@rolldown/binding-darwin-x64@1.0.0-beta.33": {
+ "integrity": "sha512-U2iGjcDV7NWyYyhap8YuY0nwrLX6TvX/9i7gBtdEMPm9z3wIUVGNMVdGlA43uqg7xDpRGpEqGnxbeDgiEwYdnA==",
"os": ["darwin"],
"cpu": ["x64"]
},
- "@rolldown/binding-freebsd-x64@1.0.0-beta.34": {
- "integrity": "sha512-VS8VInNCwnkpI9WeQaWu3kVBq9ty6g7KrHdLxYMzeqz24+w9hg712TcWdqzdY6sn+24lUoMD9jTZrZ/qfVpk0g==",
+ "@rolldown/binding-freebsd-x64@1.0.0-beta.33": {
+ "integrity": "sha512-gd6ASromVHFLlzrjJWMG5CXHkS7/36DEZ8HhvGt2NN8eZALCIuyEx8HMMLqvKA7z4EAztVkdToVrdxpGMsKZxw==",
"os": ["freebsd"],
"cpu": ["x64"]
},
- "@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.34": {
- "integrity": "sha512-4St4emjcnULnxJYb/5ZDrH/kK/j6PcUgc3eAqH5STmTrcF+I9m/X2xvSF2a2bWv1DOQhxBewThu0KkwGHdgu5w==",
+ "@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.33": {
+ "integrity": "sha512-xmeLfkfGthuynO1EpCdyTVr0r4G+wqvnKCuyR6rXOet+hLrq5HNAC2XtP/jU2TB4Bc6aiLYxl868B8CGtFDhcw==",
"os": ["linux"],
"cpu": ["arm"]
},
- "@rolldown/binding-linux-arm64-gnu@1.0.0-beta.34": {
- "integrity": "sha512-a737FTqhFUoWfnebS2SnQ2BS50p0JdukdkUBwy2J06j4hZ6Eej0zEB8vTfAqoCjn8BQKkXBy+3Sx0IRkgwz1gA==",
+ "@rolldown/binding-linux-arm64-gnu@1.0.0-beta.33": {
+ "integrity": "sha512-cHGp8yfHL4pes6uaLbO5L58ceFkUK4efd8iE86jClD1QPPDLKiqEXJCFYeuK3OfODuF5EBOmf0SlcUZNEYGdmw==",
"os": ["linux"],
"cpu": ["arm64"]
},
- "@rolldown/binding-linux-arm64-musl@1.0.0-beta.34": {
- "integrity": "sha512-NH+FeQWKyuw0k+PbXqpFWNfvD8RPvfJk766B/njdaWz4TmiEcSB0Nb6guNw1rBpM1FmltQYb3fFnTumtC6pRfA==",
+ "@rolldown/binding-linux-arm64-musl@1.0.0-beta.33": {
+ "integrity": "sha512-wZ1t7JAvVeFgskH1L9y7c47ITitPytpL0s8FmAT8pVfXcaTmS58ZyoXT+y6cz8uCkQnETjrX3YezTGI18u3ecg==",
"os": ["linux"],
"cpu": ["arm64"]
},
- "@rolldown/binding-linux-x64-gnu@1.0.0-beta.34": {
- "integrity": "sha512-Q3RSCivp8pNadYK8ke3hLnQk08BkpZX9BmMjgwae2FWzdxhxxUiUzd9By7kneUL0vRQ4uRnhD9VkFQ+Haeqdvw==",
+ "@rolldown/binding-linux-x64-gnu@1.0.0-beta.33": {
+ "integrity": "sha512-cDndWo3VEYbm7yeujOV6Ie2XHz0K8YX/R/vbNmMo03m1QwtBKKvbYNSyJb3B9+8igltDjd8zNM9mpiNNrq/ekQ==",
"os": ["linux"],
"cpu": ["x64"]
},
- "@rolldown/binding-linux-x64-musl@1.0.0-beta.34": {
- "integrity": "sha512-wDd/HrNcVoBhWWBUW3evJHoo7GJE/RofssBy3Dsiip05YUBmokQVrYAyrboOY4dzs/lJ7HYeBtWQ9hj8wlyF0A==",
+ "@rolldown/binding-linux-x64-musl@1.0.0-beta.33": {
+ "integrity": "sha512-bl7uzi6es/l6LT++NZcBpiX43ldLyKXCPwEZGY1rZJ99HQ7m1g3KxWwYCcGxtKjlb2ExVvDZicF6k+96vxOJKg==",
"os": ["linux"],
"cpu": ["x64"]
},
- "@rolldown/binding-openharmony-arm64@1.0.0-beta.34": {
- "integrity": "sha512-dH3FTEV6KTNWpYSgjSXZzeX7vLty9oBYn6R3laEdhwZftQwq030LKL+5wyQdlbX5pnbh4h127hpv3Hl1+sj8dg==",
+ "@rolldown/binding-openharmony-arm64@1.0.0-beta.33": {
+ "integrity": "sha512-TrgzQanpLgcmmzolCbYA9BPZgF1gYxkIGZhU/HROnJPsq67gcyaYw/JBLioqQLjIwMipETkn25YY799D2OZzJA==",
"os": ["openharmony"],
"cpu": ["arm64"]
},
- "@rolldown/binding-wasm32-wasi@1.0.0-beta.34": {
- "integrity": "sha512-y5BUf+QtO0JsIDKA51FcGwvhJmv89BYjUl8AmN7jqD6k/eU55mH6RJYnxwCsODq5m7KSSTigVb6O7/GqB8wbPw==",
+ "@rolldown/binding-wasm32-wasi@1.0.0-beta.33": {
+ "integrity": "sha512-z0LltdUfvoKak9SuaLz/M9AVSg+RTOZjFksbZXzC6Svl1odyW4ai21VHhZy3m2Faeeb/rl/9efVLayj+qYEGxw==",
"dependencies": [
"@napi-rs/wasm-runtime"
],
"cpu": ["wasm32"]
},
- "@rolldown/binding-win32-arm64-msvc@1.0.0-beta.34": {
- "integrity": "sha512-ga5hFhdTwpaNxEiuxZHWnD3ed0GBAzbgzS5tRHpe0ObptxM1a9Xrq6TVfNQirBLwb5Y7T/FJmJi3pmdLy95ljg==",
+ "@rolldown/binding-win32-arm64-msvc@1.0.0-beta.33": {
+ "integrity": "sha512-CpvOHyqDNOYx9riD4giyXQDIu72bWRU2Dwt1xFSPlBudk6NumK0OJl6Ch+LPnkp5podQHcQg0mMauAXPVKct7g==",
"os": ["win32"],
"cpu": ["arm64"]
},
- "@rolldown/binding-win32-ia32-msvc@1.0.0-beta.34": {
- "integrity": "sha512-4/MBp9T9eRnZskxWr8EXD/xHvLhdjWaeX/qY9LPRG1JdCGV3DphkLTy5AWwIQ5jhAy2ZNJR5z2fYRlpWU0sIyQ==",
+ "@rolldown/binding-win32-ia32-msvc@1.0.0-beta.33": {
+ "integrity": "sha512-/tNTvZTWHz6HiVuwpR3zR0kGIyCNb+/tFhnJmti+Aw2fAXs3l7Aj0DcXd0646eFKMX8L2w5hOW9H08FXTUkN0g==",
"os": ["win32"],
"cpu": ["ia32"]
},
- "@rolldown/binding-win32-x64-msvc@1.0.0-beta.34": {
- "integrity": "sha512-7O5iUBX6HSBKlQU4WykpUoEmb0wQmonb6ziKFr3dJTHud2kzDnWMqk344T0qm3uGv9Ddq6Re/94pInxo1G2d4w==",
+ "@rolldown/binding-win32-x64-msvc@1.0.0-beta.33": {
+ "integrity": "sha512-Bb2qK3z7g2mf4zaKRvkohHzweaP1lLbaoBmXZFkY6jJWMm0Z8Pfnh8cOoRlH1IVM1Ufbo8ZZ1WXp1LbOpRMtXw==",
"os": ["win32"],
"cpu": ["x64"]
},
- "@rolldown/pluginutils@1.0.0-beta.34": {
- "integrity": "sha512-LyAREkZHP5pMom7c24meKmJCdhf2hEyvam2q0unr3or9ydwDL+DJ8chTF6Av/RFPb3rH8UFBdMzO5MxTZW97oA=="
+ "@rolldown/pluginutils@1.0.0-beta.33": {
+ "integrity": "sha512-she25NCG6NoEPC/SEB4pHs5STcnfI4VBFOzjeI63maSPrWME5J2XC8ogrBgp8NaE/xzj28/kbpSaebiMvFRj+w=="
},
"@tybys/wasm-util@0.10.0": {
"integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==",
@@ -423,8 +426,8 @@
"diff@8.0.2": {
"integrity": "sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg=="
},
- "dts-resolver@2.1.2": {
- "integrity": "sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg=="
+ "dts-resolver@2.1.1": {
+ "integrity": "sha512-3BiGFhB6mj5Kv+W2vdJseQUYW+SKVzAFJL6YNP6ursbrwy1fXHRotfHi3xLNxe4wZl/K8qbAFeCDjZLjzqxxRw=="
},
"empathic@2.0.0": {
"integrity": "sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA=="
@@ -600,7 +603,7 @@
"resolve-pkg-maps@1.0.0": {
"integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="
},
- "rolldown-plugin-dts@0.13.14_rolldown@1.0.0-beta.34": {
+ "rolldown-plugin-dts@0.13.14_rolldown@1.0.0-beta.33": {
"integrity": "sha512-wjNhHZz9dlN6PTIXyizB6u/mAg1wEFMW9yw7imEVe3CxHSRnNHVyycIX0yDEOVJfDNISLPbkCIPEpFpizy5+PQ==",
"dependencies": [
"@babel/generator",
@@ -614,8 +617,8 @@
"rolldown"
]
},
- "rolldown@1.0.0-beta.34": {
- "integrity": "sha512-Wwh7EwalMzzX3Yy3VN58VEajeR2Si8+HDNMf706jPLIqU7CxneRW+dQVfznf5O0TWTnJyu4npelwg2bzTXB1Nw==",
+ "rolldown@1.0.0-beta.33": {
+ "integrity": "sha512-mgu118ZuRguC8unhPCbdZbyRbjQfEMiWqlojBA5aRIncBelRaBomnHNpGKYkYWeK7twRz5Cql30xgqqrA3Xelw==",
"dependencies": [
"@oxc-project/runtime",
"@oxc-project/types",
@@ -660,7 +663,7 @@
"picomatch"
]
},
- "tsdown@0.12.9_rolldown@1.0.0-beta.34": {
+ "tsdown@0.12.9_rolldown@1.0.0-beta.33": {
"integrity": "sha512-MfrXm9PIlT3saovtWKf/gCJJ/NQCdE0SiREkdNC+9Qy6UHhdeDPxnkFaBD7xttVUmgp0yUHtGirpoLB+OVLuLA==",
"dependencies": [
"ansis",
@@ -739,7 +742,7 @@
},
"workspace": {
"dependencies": [
- "jsr:@fedify/fedify@^1.8.8",
+ "jsr:@fedify/fedify@1.9.0-dev.1516+8f42bff1",
"jsr:@hongminhee/x-forwarded-fetch@0.2",
"jsr:@hono/hono@^4.8.2",
"jsr:@logtape/logtape@^1.0.4",
@@ -757,6 +760,7 @@
"npm:markdown-it@^14.1.0",
"npm:mime-db@^1.54.0",
"npm:tsdown@~0.12.8",
+ "npm:url-template@^3.1.1",
"npm:uuid@^11.1.0",
"npm:xss@^1.0.15"
],
@@ -768,6 +772,7 @@
"npm:html-entities@^2.6.0",
"npm:markdown-it@^14.1.0",
"npm:mime-db@^1.54.0",
+ "npm:url-template@^3.1.1",
"npm:uuid@^11.1.0",
"npm:xss@^1.0.15"
]
diff --git a/packages/botkit/deno.json b/packages/botkit/deno.json
index cee52dc..9b986ae 100644
--- a/packages/botkit/deno.json
+++ b/packages/botkit/deno.json
@@ -23,6 +23,7 @@
"markdown-it": "npm:markdown-it@^14.1.0",
"mime-db": "npm:mime-db@^1.54.0",
"tsdown": "npm:tsdown@^0.12.8",
+ "url-template": "npm:url-template@^3.1.1",
"uuid": "npm:uuid@^11.1.0",
"xss": "npm:xss@^1.0.15"
},
diff --git a/packages/botkit/package.json b/packages/botkit/package.json
index 9633f09..27d4cf2 100644
--- a/packages/botkit/package.json
+++ b/packages/botkit/package.json
@@ -94,6 +94,7 @@
"html-entities": "^2.6.0",
"markdown-it": "^14.1.0",
"mime-db": "^1.54.0",
+ "url-template": "^3.1.1",
"uuid": "^11.1.0",
"x-forwarded-fetch": "catalog:",
"xss": "^1.0.15"
diff --git a/packages/botkit/src/components/FollowButton.tsx b/packages/botkit/src/components/FollowButton.tsx
new file mode 100644
index 0000000..a49ccc7
--- /dev/null
+++ b/packages/botkit/src/components/FollowButton.tsx
@@ -0,0 +1,63 @@
+/** @jsxImportSource hono/jsx */
+import type { BotImpl } from "../bot-impl.ts";
+
+export interface FollowButtonProps {
+ readonly bot: BotImpl
Follower handle is required.
++ Go back +
+
+ No links found in webfinger data for{" "}
+ @{followerHandle}
.
+
+ Go back +
+
+ No follow link found in WebFinger data for{" "}
+ @{followerHandle}
.
+
+ Go back +
++ An internal server error occurred while processing your request. +
++ Go back +
+