From 1b064b0a764ca76d7b159ab6ac89ea21b1822bae Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Mon, 3 Nov 2025 23:41:36 +0900 Subject: [PATCH 01/24] Set nodeModulesDir to auto --- deno.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/deno.json b/deno.json index 4f2987653..a61720703 100644 --- a/deno.json +++ b/deno.json @@ -19,7 +19,8 @@ "./packages/testing", "./packages/vocab-runtime", "./packages/vocab-tools", - "./examples/hono-sample" + "./examples/hono-sample", + "./examples/fresh" ], "imports": { "@cloudflare/workers-types": "npm:@cloudflare/workers-types@^4.20250529.0", @@ -71,7 +72,7 @@ "**/*.md" ] }, - "nodeModulesDir": "none", + "nodeModulesDir": "auto", "tasks": { "codegen": "deno task -f @fedify/cli codegen", "check-versions": "deno run --allow-read --allow-write scripts/check_versions.ts", From 1b80174b842eead23ba8d5d748d2c4c89ada3c1a Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Mon, 3 Nov 2025 23:41:51 +0900 Subject: [PATCH 02/24] Add fresh demo project --- deno.lock | 408 +++++++++---------------- examples/fresh/.gitignore | 13 + examples/fresh/.vscode/extensions.json | 5 + examples/fresh/.vscode/settings.json | 17 ++ examples/fresh/README.md | 17 ++ examples/fresh/assets/styles.css | 144 +++++++++ examples/fresh/client.ts | 2 + examples/fresh/components/Button.tsx | 17 ++ examples/fresh/deno.json | 57 ++++ examples/fresh/islands/Counter.tsx | 16 + examples/fresh/main.ts | 30 ++ examples/fresh/routes/_app.tsx | 16 + examples/fresh/routes/api/[name].tsx | 10 + examples/fresh/routes/index.tsx | 33 ++ examples/fresh/static/favicon.ico | Bin 0 -> 22382 bytes examples/fresh/static/logo.svg | 19 ++ examples/fresh/utils.ts | 9 + examples/fresh/vite.config.ts | 6 + 18 files changed, 561 insertions(+), 258 deletions(-) create mode 100644 examples/fresh/.gitignore create mode 100644 examples/fresh/.vscode/extensions.json create mode 100644 examples/fresh/.vscode/settings.json create mode 100644 examples/fresh/README.md create mode 100644 examples/fresh/assets/styles.css create mode 100644 examples/fresh/client.ts create mode 100644 examples/fresh/components/Button.tsx create mode 100644 examples/fresh/deno.json create mode 100644 examples/fresh/islands/Counter.tsx create mode 100644 examples/fresh/main.ts create mode 100644 examples/fresh/routes/_app.tsx create mode 100644 examples/fresh/routes/api/[name].tsx create mode 100644 examples/fresh/routes/index.tsx create mode 100644 examples/fresh/static/favicon.ico create mode 100644 examples/fresh/static/logo.svg create mode 100644 examples/fresh/utils.ts create mode 100644 examples/fresh/vite.config.ts diff --git a/deno.lock b/deno.lock index 0a0ad14cb..0dafa3f8c 100644 --- a/deno.lock +++ b/deno.lock @@ -1,14 +1,12 @@ { "version": "5", "specifiers": { - "jsr:@alinea/suite@~0.6.3": "0.6.3", "jsr:@david/console-static-text@0.3": "0.3.0", "jsr:@david/dax@~0.43.2": "0.43.2", "jsr:@david/path@0.2": "0.2.0", "jsr:@david/which@~0.4.1": "0.4.1", "jsr:@es-toolkit/es-toolkit@^1.39.5": "1.43.0", "jsr:@hongminhee/localtunnel@0.3": "0.3.0", - "jsr:@hono/hono@^4.7.1": "4.11.1", "jsr:@hono/hono@^4.8.3": "4.11.1", "jsr:@logtape/file@^1.2.2": "1.3.5", "jsr:@logtape/logtape@^1.0.4": "1.3.5", @@ -17,32 +15,21 @@ "jsr:@optique/core@~0.6.1": "0.6.6", "jsr:@optique/core@~0.6.6": "0.6.6", "jsr:@optique/run@~0.6.1": "0.6.6", - "jsr:@std/assert@0.224": "0.224.0", - "jsr:@std/assert@0.226": "0.226.0", - "jsr:@std/assert@^1.0.13": "1.0.16", - "jsr:@std/async@^1.0.13": "1.0.15", "jsr:@std/bytes@^1.0.5": "1.0.6", - "jsr:@std/fmt@0.224": "0.224.0", "jsr:@std/fmt@1": "1.0.8", - "jsr:@std/fs@0.224": "0.224.0", - "jsr:@std/fs@1": "1.0.20", - "jsr:@std/fs@^1.0.3": "1.0.20", - "jsr:@std/internal@0.224": "0.224.0", - "jsr:@std/internal@1": "1.0.12", - "jsr:@std/internal@^1.0.12": "1.0.12", + "jsr:@std/fs@1": "1.0.19", + "jsr:@std/internal@^1.0.10": "1.0.12", + "jsr:@std/internal@^1.0.9": "1.0.12", "jsr:@std/io@0.225": "0.225.2", - "jsr:@std/path@0.224": "0.224.0", - "jsr:@std/path@1": "1.1.3", - "jsr:@std/path@^1.0.6": "1.1.3", - "jsr:@std/path@^1.1.3": "1.1.3", - "jsr:@std/testing@0.224": "0.224.0", - "jsr:@std/yaml@^1.0.8": "1.0.10", + "jsr:@std/path@1": "1.1.2", + "jsr:@std/path@^1.0.6": "1.1.2", + "jsr:@std/path@^1.1.1": "1.1.2", "npm:@alinea/suite@~0.6.3": "0.6.3", "npm:@cfworker/json-schema@^4.1.1": "4.1.1", - "npm:@cloudflare/vitest-pool-workers@~0.8.31": "0.8.71_@vitest+runner@3.2.4_@vitest+snapshot@3.2.4_vitest@3.2.4__@types+node@22.19.3__vite@7.3.0___@types+node@22.19.3___tsx@4.21.0___yaml@2.8.2___picomatch@4.0.3__tsx@4.21.0__yaml@2.8.2_@types+node@22.19.3_@cloudflare+workers-types@4.20251223.0_tsx@4.21.0_yaml@2.8.2", - "npm:@cloudflare/workers-types@^4.20250529.0": "4.20251223.0", - "npm:@cloudflare/workers-types@^4.20250906.0": "4.20251223.0", - "npm:@fxts/core@^1.21.1": "1.21.1", + "npm:@cloudflare/vitest-pool-workers@~0.8.31": "0.8.71_@vitest+runner@3.2.4_@vitest+snapshot@3.2.4_vitest@3.2.4__@types+node@22.19.3__vite@7.3.0___@types+node@22.19.3___tsx@4.21.0___yaml@2.8.2___picomatch@4.0.3__tsx@4.21.0__yaml@2.8.2_@types+node@22.19.3_@cloudflare+workers-types@4.20251224.0_tsx@4.21.0_yaml@2.8.2", + "npm:@cloudflare/workers-types@^4.20250529.0": "4.20251224.0", + "npm:@cloudflare/workers-types@^4.20250906.0": "4.20251224.0", + "npm:@fxts/core@^1.21.1": "1.22.0", "npm:@hongminhee/localtunnel@0.3": "0.3.0", "npm:@inquirer/prompts@^7.8.4": "7.10.1_@types+node@22.19.3", "npm:@jimp/core@^1.6.0": "1.6.0", @@ -57,8 +44,8 @@ "npm:@optique/core@~0.6.1": "0.6.6", "npm:@optique/run@~0.6.1": "0.6.6", "npm:@poppanator/http-constants@^1.1.1": "1.1.1", + "npm:@preact/signals@^2.3.2": "2.5.1_preact@10.19.6", "npm:@sveltejs/kit@2": "2.49.2_@opentelemetry+api@1.9.0_@sveltejs+vite-plugin-svelte@6.2.1__svelte@5.46.0___acorn@8.15.0__vite@7.3.0___@types+node@22.19.3___tsx@4.21.0___yaml@2.8.2___picomatch@4.0.3__@types+node@22.19.3__tsx@4.21.0__yaml@2.8.2_svelte@5.46.0__acorn@8.15.0_vite@7.3.0__@types+node@22.19.3__tsx@4.21.0__yaml@2.8.2__picomatch@4.0.3_acorn@8.15.0_@types+node@22.19.3_tsx@4.21.0_yaml@2.8.2", - "npm:@types/amqplib@*": "0.10.8", "npm:@types/amqplib@~0.10.7": "0.10.8", "npm:@types/eslint@9": "9.6.1", "npm:@types/estree@^1.0.8": "1.0.8", @@ -98,13 +85,14 @@ "npm:json-preserve-indent@^1.1.3": "1.1.3", "npm:jsonld@9": "9.0.0", "npm:koa@2": "2.16.3", - "npm:miniflare@^4.20250523.0": "4.20251217.0", + "npm:miniflare@^4.20250523.0": "4.20250906.0", "npm:multicodec@^3.2.1": "3.2.1", "npm:ora@^8.2.0": "8.2.0", "npm:pkijs@^3.2.4": "3.3.3", "npm:pkijs@^3.2.5": "3.3.3", "npm:postgres@^3.4.7": "3.4.7", "npm:preact@10.19.6": "10.19.6", + "npm:preact@^10.27.2": "10.28.1", "npm:shiki@^1.6.4": "1.29.2", "npm:srvx@~0.8.7": "0.8.16", "npm:structured-field-values@^2.0.4": "2.0.4", @@ -113,15 +101,13 @@ "npm:uri-template-router@1": "1.0.0", "npm:url-template@^3.1.1": "3.1.1", "npm:urlpattern-polyfill@^10.1.0": "10.1.0", + "npm:vite@^7.1.3": "7.3.0_@types+node@22.19.3_tsx@4.21.0_yaml@2.8.2_picomatch@4.0.3", "npm:vitest@3.2": "3.2.4_@types+node@22.19.3_vite@7.3.0__@types+node@22.19.3__tsx@4.21.0__yaml@2.8.2__picomatch@4.0.3_tsx@4.21.0_yaml@2.8.2", - "npm:wrangler@^4.17.0": "4.35.0_@cloudflare+workers-types@4.20251223.0_unenv@2.0.0-rc.21_workerd@1.20250906.0", - "npm:wrangler@^4.21.1": "4.35.0_@cloudflare+workers-types@4.20251223.0_unenv@2.0.0-rc.21_workerd@1.20250906.0", + "npm:wrangler@^4.17.0": "4.35.0_@cloudflare+workers-types@4.20251224.0_unenv@2.0.0-rc.21_workerd@1.20250906.0", + "npm:wrangler@^4.21.1": "4.35.0_@cloudflare+workers-types@4.20251224.0_unenv@2.0.0-rc.21_workerd@1.20250906.0", "npm:yaml@^2.8.1": "2.8.2" }, "jsr": { - "@alinea/suite@0.6.3": { - "integrity": "7d24a38729663b84d8a263d64ff7e3f8c72ac7cbb1db8ec5f414d0416b6b72e2" - }, "@david/console-static-text@0.3.0": { "integrity": "2dfb46ecee525755f7989f94ece30bba85bd8ffe3e8666abc1bf926e1ee0698d" }, @@ -131,8 +117,8 @@ "jsr:@david/console-static-text", "jsr:@david/path", "jsr:@david/which", - "jsr:@std/fmt@1", - "jsr:@std/fs@1", + "jsr:@std/fmt", + "jsr:@std/fs", "jsr:@std/io", "jsr:@std/path@1" ] @@ -140,7 +126,7 @@ "@david/path@0.2.0": { "integrity": "f2d7aa7f02ce5a55e27c09f9f1381794acb09d328f8d3c8a2e3ab3ffc294dccd", "dependencies": [ - "jsr:@std/fs@1", + "jsr:@std/fs", "jsr:@std/path@1" ] }, @@ -177,54 +163,17 @@ "jsr:@optique/core@~0.6.6" ] }, - "@std/assert@0.224.0": { - "integrity": "8643233ec7aec38a940a8264a6e3eed9bfa44e7a71cc6b3c8874213ff401967f", - "dependencies": [ - "jsr:@std/fmt@0.224", - "jsr:@std/internal@0.224" - ] - }, - "@std/assert@0.226.0": { - "integrity": "0dfb5f7c7723c18cec118e080fec76ce15b4c31154b15ad2bd74822603ef75b3", - "dependencies": [ - "jsr:@std/internal@1" - ] - }, - "@std/assert@1.0.16": { - "integrity": "6a7272ed1eaa77defe76e5ff63ca705d9c495077e2d5fd0126d2b53fc5bd6532", - "dependencies": [ - "jsr:@std/internal@^1.0.12" - ] - }, - "@std/async@1.0.15": { - "integrity": "55d1d9d04f99403fe5730ab16bdcc3c47f658a6bf054cafb38a50f046238116e" - }, "@std/bytes@1.0.6": { "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" }, - "@std/fmt@0.224.0": { - "integrity": "e20e9a2312a8b5393272c26191c0a68eda8d2c4b08b046bad1673148f1d69851" - }, "@std/fmt@1.0.8": { "integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7" }, - "@std/fs@0.224.0": { - "integrity": "52a5ec89731ac0ca8f971079339286f88c571a4d61686acf75833f03a89d8e69", - "dependencies": [ - "jsr:@std/path@0.224" - ] - }, - "@std/fs@1.0.20": { - "integrity": "e953206aae48d46ee65e8783ded459f23bec7dd1f3879512911c35e5484ea187", - "dependencies": [ - "jsr:@std/internal@^1.0.12", - "jsr:@std/path@^1.1.3" - ] - }, - "@std/internal@0.224.0": { - "integrity": "afc50644f9cdf4495eeb80523a8f6d27226b4b36c45c7c195dfccad4b8509291", + "@std/fs@1.0.19": { + "integrity": "051968c2b1eae4d2ea9f79a08a3845740ef6af10356aff43d3e2ef11ed09fb06", "dependencies": [ - "jsr:@std/fmt@0.224" + "jsr:@std/internal@^1.0.9", + "jsr:@std/path@^1.1.1" ] }, "@std/internal@1.0.12": { @@ -236,26 +185,11 @@ "jsr:@std/bytes" ] }, - "@std/path@0.224.0": { - "integrity": "55bca6361e5a6d158b9380e82d4981d82d338ec587de02951e2b7c3a24910ee6" - }, - "@std/path@1.1.3": { - "integrity": "b015962d82a5e6daea980c32b82d2c40142149639968549c649031a230b1afb3", - "dependencies": [ - "jsr:@std/internal@^1.0.12" - ] - }, - "@std/testing@0.224.0": { - "integrity": "371b8a929aa7132240d5dd766a439be8f780ef5c176ab194e0bcab72370c761e", + "@std/path@1.1.2": { + "integrity": "c0b13b97dfe06546d5e16bf3966b1cadf92e1cc83e56ba5476ad8b498d9e3038", "dependencies": [ - "jsr:@std/assert@0.224", - "jsr:@std/fmt@0.224", - "jsr:@std/fs@0.224", - "jsr:@std/path@0.224" + "jsr:@std/internal@^1.0.10" ] - }, - "@std/yaml@1.0.10": { - "integrity": "245706ea3511cc50c8c6d00339c23ea2ffa27bd2c7ea5445338f8feff31fa58e" } }, "npm": { @@ -311,13 +245,13 @@ "integrity": "sha512-tsQQagBKjvpd9baa6nWVIv399ejiqcrUBBW6SZx6Z22+ymm+Odv5+cFimyuCsD/fC1fQTwfRmwXBNpzvHSeGCw==", "dependencies": [ "unenv", - "workerd@1.20250906.0" + "workerd" ], "optionalPeers": [ - "workerd@1.20250906.0" + "workerd" ] }, - "@cloudflare/vitest-pool-workers@0.8.71_@vitest+runner@3.2.4_@vitest+snapshot@3.2.4_vitest@3.2.4__@types+node@22.19.3__vite@7.3.0___@types+node@22.19.3___tsx@4.21.0___yaml@2.8.2___picomatch@4.0.3__tsx@4.21.0__yaml@2.8.2_@types+node@22.19.3_@cloudflare+workers-types@4.20251223.0_tsx@4.21.0_yaml@2.8.2": { + "@cloudflare/vitest-pool-workers@0.8.71_@vitest+runner@3.2.4_@vitest+snapshot@3.2.4_vitest@3.2.4__@types+node@22.19.3__vite@7.3.0___@types+node@22.19.3___tsx@4.21.0___yaml@2.8.2___picomatch@4.0.3__tsx@4.21.0__yaml@2.8.2_@types+node@22.19.3_@cloudflare+workers-types@4.20251224.0_tsx@4.21.0_yaml@2.8.2": { "integrity": "sha512-keu2HCLQfRNwbmLBCDXJgCFpANTaYnQpE01fBOo4CNwiWHUT7SZGN7w64RKiSWRHyYppStXBuE5Ng7F42+flpg==", "dependencies": [ "@vitest/runner", @@ -325,7 +259,7 @@ "birpc@0.2.14", "cjs-module-lexer", "devalue", - "miniflare@4.20250906.0", + "miniflare", "semver", "vitest", "wrangler", @@ -337,53 +271,28 @@ "os": ["darwin"], "cpu": ["x64"] }, - "@cloudflare/workerd-darwin-64@1.20251217.0": { - "integrity": "sha512-DN6vT+9ho61d/1/YuILW4VS+N1JBLaixWRL1vqNmhgbf8J8VHwWWotrRruEUYigJKx2yZyw6YsasE+yLXgx/Fw==", - "os": ["darwin"], - "cpu": ["x64"] - }, "@cloudflare/workerd-darwin-arm64@1.20250906.0": { "integrity": "sha512-X5apsZ1SFW4FYTM19ISHf8005FJMPfrcf4U5rO0tdj+TeJgQgXuZ57IG0WeW7SpLVeBo8hM6WC8CovZh41AfnA==", "os": ["darwin"], "cpu": ["arm64"] }, - "@cloudflare/workerd-darwin-arm64@1.20251217.0": { - "integrity": "sha512-5nZOpRTkHmtcTc4Wbr1mj/O3dLb6aHZSiJuVBgtdbVcVmOXueSay3hnw1PXEyR+vpTKGUPkM+omUIslKHWnXDw==", - "os": ["darwin"], - "cpu": ["arm64"] - }, "@cloudflare/workerd-linux-64@1.20250906.0": { "integrity": "sha512-rlKzWgsLnlQ5Nt9W69YBJKcmTmZbOGu0edUsenXPmc6wzULUxoQpi7ZE9k3TfTonJx4WoQsQlzCUamRYFsX+0Q==", "os": ["linux"], "cpu": ["x64"] }, - "@cloudflare/workerd-linux-64@1.20251217.0": { - "integrity": "sha512-uoPGhMaZVXPpCsU0oG3HQzyVpXCGi5rU+jcHRjUI7DXM4EwctBGvZ380Knkja36qtl+ZvSKVR1pUFSGdK+45Pg==", - "os": ["linux"], - "cpu": ["x64"] - }, "@cloudflare/workerd-linux-arm64@1.20250906.0": { "integrity": "sha512-DdedhiQ+SeLzpg7BpcLrIPEZ33QKioJQ1wvL4X7nuLzEB9rWzS37NNNahQzc1+44rhG4fyiHbXBPOeox4B9XVA==", "os": ["linux"], "cpu": ["arm64"] }, - "@cloudflare/workerd-linux-arm64@1.20251217.0": { - "integrity": "sha512-ixHnHKsiz1Xko+eDgCJOZ7EEUZKtmnYq3AjW3nkVcLFypSLks4C29E45zVewdaN4wq8sCLeyQCl6r1kS17+DQQ==", - "os": ["linux"], - "cpu": ["arm64"] - }, "@cloudflare/workerd-windows-64@1.20250906.0": { "integrity": "sha512-Q8Qjfs8jGVILnZL6vUpQ90q/8MTCYaGR3d1LGxZMBqte8Vr7xF3KFHPEy7tFs0j0mMjnqCYzlofmPNY+9ZaDRg==", "os": ["win32"], "cpu": ["x64"] }, - "@cloudflare/workerd-windows-64@1.20251217.0": { - "integrity": "sha512-rP6USX+7ctynz3AtmKi+EvlLP3Xdr1ETrSdcnv693/I5QdUwBxq4yE1Lj6CV7GJizX6opXKYg8QMq0Q4eB9zRQ==", - "os": ["win32"], - "cpu": ["x64"] - }, - "@cloudflare/workers-types@4.20251223.0": { - "integrity": "sha512-r7oxkFjbMcmzhIrzjXaiJlGFDmmeu3+GlwkLlZbUxVWrXHTCkvqu+DrWnNmF6xZEf9j+2/PpuKIS21J522xhJA==" + "@cloudflare/workers-types@4.20251224.0": { + "integrity": "sha512-6Prvhe2L4iH4wL8hDpWabFxnauGqDZ+o66fMChGRE2gLDa1YYDxu8zw15p+Iq5minz6d5DkJ8M0l5uudx/+d4g==" }, "@colors/colors@1.5.0": { "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" @@ -425,8 +334,8 @@ "os": ["aix"], "cpu": ["ppc64"] }, - "@esbuild/aix-ppc64@0.27.0": { - "integrity": "sha512-KuZrd2hRjz01y5JK9mEBSD3Vj3mbCvemhT466rSuJYeE/hjuBrHfjjcjMdTm/sz7au+++sdbJZJmuBwQLuw68A==", + "@esbuild/aix-ppc64@0.27.2": { + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", "os": ["aix"], "cpu": ["ppc64"] }, @@ -435,8 +344,8 @@ "os": ["android"], "cpu": ["arm64"] }, - "@esbuild/android-arm64@0.27.0": { - "integrity": "sha512-CC3vt4+1xZrs97/PKDkl0yN7w8edvU2vZvAFGD16n9F0Cvniy5qvzRXjfO1l94efczkkQE6g1x0i73Qf5uthOQ==", + "@esbuild/android-arm64@0.27.2": { + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", "os": ["android"], "cpu": ["arm64"] }, @@ -445,8 +354,8 @@ "os": ["android"], "cpu": ["arm"] }, - "@esbuild/android-arm@0.27.0": { - "integrity": "sha512-j67aezrPNYWJEOHUNLPj9maeJte7uSMM6gMoxfPC9hOg8N02JuQi/T7ewumf4tNvJadFkvLZMlAq73b9uwdMyQ==", + "@esbuild/android-arm@0.27.2": { + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", "os": ["android"], "cpu": ["arm"] }, @@ -455,8 +364,8 @@ "os": ["android"], "cpu": ["x64"] }, - "@esbuild/android-x64@0.27.0": { - "integrity": "sha512-wurMkF1nmQajBO1+0CJmcN17U4BP6GqNSROP8t0X/Jiw2ltYGLHpEksp9MpoBqkrFR3kv2/te6Sha26k3+yZ9Q==", + "@esbuild/android-x64@0.27.2": { + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", "os": ["android"], "cpu": ["x64"] }, @@ -465,8 +374,8 @@ "os": ["darwin"], "cpu": ["arm64"] }, - "@esbuild/darwin-arm64@0.27.0": { - "integrity": "sha512-uJOQKYCcHhg07DL7i8MzjvS2LaP7W7Pn/7uA0B5S1EnqAirJtbyw4yC5jQ5qcFjHK9l6o/MX9QisBg12kNkdHg==", + "@esbuild/darwin-arm64@0.27.2": { + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", "os": ["darwin"], "cpu": ["arm64"] }, @@ -475,8 +384,8 @@ "os": ["darwin"], "cpu": ["x64"] }, - "@esbuild/darwin-x64@0.27.0": { - "integrity": "sha512-8mG6arH3yB/4ZXiEnXof5MK72dE6zM9cDvUcPtxhUZsDjESl9JipZYW60C3JGreKCEP+p8P/72r69m4AZGJd5g==", + "@esbuild/darwin-x64@0.27.2": { + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", "os": ["darwin"], "cpu": ["x64"] }, @@ -485,8 +394,8 @@ "os": ["freebsd"], "cpu": ["arm64"] }, - "@esbuild/freebsd-arm64@0.27.0": { - "integrity": "sha512-9FHtyO988CwNMMOE3YIeci+UV+x5Zy8fI2qHNpsEtSF83YPBmE8UWmfYAQg6Ux7Gsmd4FejZqnEUZCMGaNQHQw==", + "@esbuild/freebsd-arm64@0.27.2": { + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", "os": ["freebsd"], "cpu": ["arm64"] }, @@ -495,8 +404,8 @@ "os": ["freebsd"], "cpu": ["x64"] }, - "@esbuild/freebsd-x64@0.27.0": { - "integrity": "sha512-zCMeMXI4HS/tXvJz8vWGexpZj2YVtRAihHLk1imZj4efx1BQzN76YFeKqlDr3bUWI26wHwLWPd3rwh6pe4EV7g==", + "@esbuild/freebsd-x64@0.27.2": { + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", "os": ["freebsd"], "cpu": ["x64"] }, @@ -505,8 +414,8 @@ "os": ["linux"], "cpu": ["arm64"] }, - "@esbuild/linux-arm64@0.27.0": { - "integrity": "sha512-AS18v0V+vZiLJyi/4LphvBE+OIX682Pu7ZYNsdUHyUKSoRwdnOsMf6FDekwoAFKej14WAkOef3zAORJgAtXnlQ==", + "@esbuild/linux-arm64@0.27.2": { + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", "os": ["linux"], "cpu": ["arm64"] }, @@ -515,8 +424,8 @@ "os": ["linux"], "cpu": ["arm"] }, - "@esbuild/linux-arm@0.27.0": { - "integrity": "sha512-t76XLQDpxgmq2cNXKTVEB7O7YMb42atj2Re2Haf45HkaUpjM2J0UuJZDuaGbPbamzZ7bawyGFUkodL+zcE+jvQ==", + "@esbuild/linux-arm@0.27.2": { + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", "os": ["linux"], "cpu": ["arm"] }, @@ -525,8 +434,8 @@ "os": ["linux"], "cpu": ["ia32"] }, - "@esbuild/linux-ia32@0.27.0": { - "integrity": "sha512-Mz1jxqm/kfgKkc/KLHC5qIujMvnnarD9ra1cEcrs7qshTUSksPihGrWHVG5+osAIQ68577Zpww7SGapmzSt4Nw==", + "@esbuild/linux-ia32@0.27.2": { + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", "os": ["linux"], "cpu": ["ia32"] }, @@ -535,8 +444,8 @@ "os": ["linux"], "cpu": ["loong64"] }, - "@esbuild/linux-loong64@0.27.0": { - "integrity": "sha512-QbEREjdJeIreIAbdG2hLU1yXm1uu+LTdzoq1KCo4G4pFOLlvIspBm36QrQOar9LFduavoWX2msNFAAAY9j4BDg==", + "@esbuild/linux-loong64@0.27.2": { + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", "os": ["linux"], "cpu": ["loong64"] }, @@ -545,8 +454,8 @@ "os": ["linux"], "cpu": ["mips64el"] }, - "@esbuild/linux-mips64el@0.27.0": { - "integrity": "sha512-sJz3zRNe4tO2wxvDpH/HYJilb6+2YJxo/ZNbVdtFiKDufzWq4JmKAiHy9iGoLjAV7r/W32VgaHGkk35cUXlNOg==", + "@esbuild/linux-mips64el@0.27.2": { + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", "os": ["linux"], "cpu": ["mips64el"] }, @@ -555,8 +464,8 @@ "os": ["linux"], "cpu": ["ppc64"] }, - "@esbuild/linux-ppc64@0.27.0": { - "integrity": "sha512-z9N10FBD0DCS2dmSABDBb5TLAyF1/ydVb+N4pi88T45efQ/w4ohr/F/QYCkxDPnkhkp6AIpIcQKQ8F0ANoA2JA==", + "@esbuild/linux-ppc64@0.27.2": { + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", "os": ["linux"], "cpu": ["ppc64"] }, @@ -565,8 +474,8 @@ "os": ["linux"], "cpu": ["riscv64"] }, - "@esbuild/linux-riscv64@0.27.0": { - "integrity": "sha512-pQdyAIZ0BWIC5GyvVFn5awDiO14TkT/19FTmFcPdDec94KJ1uZcmFs21Fo8auMXzD4Tt+diXu1LW1gHus9fhFQ==", + "@esbuild/linux-riscv64@0.27.2": { + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", "os": ["linux"], "cpu": ["riscv64"] }, @@ -575,8 +484,8 @@ "os": ["linux"], "cpu": ["s390x"] }, - "@esbuild/linux-s390x@0.27.0": { - "integrity": "sha512-hPlRWR4eIDDEci953RI1BLZitgi5uqcsjKMxwYfmi4LcwyWo2IcRP+lThVnKjNtk90pLS8nKdroXYOqW+QQH+w==", + "@esbuild/linux-s390x@0.27.2": { + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", "os": ["linux"], "cpu": ["s390x"] }, @@ -585,8 +494,8 @@ "os": ["linux"], "cpu": ["x64"] }, - "@esbuild/linux-x64@0.27.0": { - "integrity": "sha512-1hBWx4OUJE2cab++aVZ7pObD6s+DK4mPGpemtnAORBvb5l/g5xFGk0vc0PjSkrDs0XaXj9yyob3d14XqvnQ4gw==", + "@esbuild/linux-x64@0.27.2": { + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", "os": ["linux"], "cpu": ["x64"] }, @@ -595,8 +504,8 @@ "os": ["netbsd"], "cpu": ["arm64"] }, - "@esbuild/netbsd-arm64@0.27.0": { - "integrity": "sha512-6m0sfQfxfQfy1qRuecMkJlf1cIzTOgyaeXaiVaaki8/v+WB+U4hc6ik15ZW6TAllRlg/WuQXxWj1jx6C+dfy3w==", + "@esbuild/netbsd-arm64@0.27.2": { + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", "os": ["netbsd"], "cpu": ["arm64"] }, @@ -605,8 +514,8 @@ "os": ["netbsd"], "cpu": ["x64"] }, - "@esbuild/netbsd-x64@0.27.0": { - "integrity": "sha512-xbbOdfn06FtcJ9d0ShxxvSn2iUsGd/lgPIO2V3VZIPDbEaIj1/3nBBe1AwuEZKXVXkMmpr6LUAgMkLD/4D2PPA==", + "@esbuild/netbsd-x64@0.27.2": { + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", "os": ["netbsd"], "cpu": ["x64"] }, @@ -615,8 +524,8 @@ "os": ["openbsd"], "cpu": ["arm64"] }, - "@esbuild/openbsd-arm64@0.27.0": { - "integrity": "sha512-fWgqR8uNbCQ/GGv0yhzttj6sU/9Z5/Sv/VGU3F5OuXK6J6SlriONKrQ7tNlwBrJZXRYk5jUhuWvF7GYzGguBZQ==", + "@esbuild/openbsd-arm64@0.27.2": { + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", "os": ["openbsd"], "cpu": ["arm64"] }, @@ -625,13 +534,13 @@ "os": ["openbsd"], "cpu": ["x64"] }, - "@esbuild/openbsd-x64@0.27.0": { - "integrity": "sha512-aCwlRdSNMNxkGGqQajMUza6uXzR/U0dIl1QmLjPtRbLOx3Gy3otfFu/VjATy4yQzo9yFDGTxYDo1FfAD9oRD2A==", + "@esbuild/openbsd-x64@0.27.2": { + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", "os": ["openbsd"], "cpu": ["x64"] }, - "@esbuild/openharmony-arm64@0.27.0": { - "integrity": "sha512-nyvsBccxNAsNYz2jVFYwEGuRRomqZ149A39SHWk4hV0jWxKM0hjBPm3AmdxcbHiFLbBSwG6SbpIcUbXjgyECfA==", + "@esbuild/openharmony-arm64@0.27.2": { + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", "os": ["openharmony"], "cpu": ["arm64"] }, @@ -640,8 +549,8 @@ "os": ["sunos"], "cpu": ["x64"] }, - "@esbuild/sunos-x64@0.27.0": { - "integrity": "sha512-Q1KY1iJafM+UX6CFEL+F4HRTgygmEW568YMqDA5UV97AuZSm21b7SXIrRJDwXWPzr8MGr75fUZPV67FdtMHlHA==", + "@esbuild/sunos-x64@0.27.2": { + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", "os": ["sunos"], "cpu": ["x64"] }, @@ -650,8 +559,8 @@ "os": ["win32"], "cpu": ["arm64"] }, - "@esbuild/win32-arm64@0.27.0": { - "integrity": "sha512-W1eyGNi6d+8kOmZIwi/EDjrL9nxQIQ0MiGqe/AWc6+IaHloxHSGoeRgDRKHFISThLmsewZ5nHFvGFWdBYlgKPg==", + "@esbuild/win32-arm64@0.27.2": { + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", "os": ["win32"], "cpu": ["arm64"] }, @@ -660,8 +569,8 @@ "os": ["win32"], "cpu": ["ia32"] }, - "@esbuild/win32-ia32@0.27.0": { - "integrity": "sha512-30z1aKL9h22kQhilnYkORFYt+3wp7yZsHWus+wSKAJR8JtdfI76LJ4SBdMsCopTR3z/ORqVu5L1vtnHZWVj4cQ==", + "@esbuild/win32-ia32@0.27.2": { + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", "os": ["win32"], "cpu": ["ia32"] }, @@ -670,8 +579,8 @@ "os": ["win32"], "cpu": ["x64"] }, - "@esbuild/win32-x64@0.27.0": { - "integrity": "sha512-aIitBcjQeyOhMTImhLZmtxfdOcuNRpwlPNmlFKPcHQYPhEssw75Cl1TSXJXpMkzaua9FUetx/4OQKq7eJul5Cg==", + "@esbuild/win32-x64@0.27.2": { + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", "os": ["win32"], "cpu": ["x64"] }, @@ -765,8 +674,8 @@ "ipaddr.js@2.3.0" ] }, - "@fxts/core@1.21.1": { - "integrity": "sha512-c9SkBOSm/g5R9mA6T5jup1v95Ny0Qwy/229widB5+YOIi1udy63hNnwUJWWBpO0iZGJEKSvfI80LUo/OoULtuw==", + "@fxts/core@1.22.0": { + "integrity": "sha512-w4HZT3GW4glbPDn4prYAzivFm2vTY0t9BzV+r0ZoilC8dQRfoDmZPggpqJMLeP1SI4WnN+xYYGsLmPFPtXBgxQ==", "dependencies": [ "tslib" ] @@ -1555,6 +1464,16 @@ "@poppinss/exception@1.2.3": { "integrity": "sha512-dCED+QRChTVatE9ibtoaxc+WkdzOSjYTKi/+uacHWIsfodVfpsueo3+DKpgU5Px8qXjgmXkSvhXvSCz3fnP9lw==" }, + "@preact/signals-core@1.12.1": { + "integrity": "sha512-BwbTXpj+9QutoZLQvbttRg5x3l5468qaV2kufh+51yha1c53ep5dY4kTuZR35+3pAZxpfQerGJiQqg34ZNZ6uA==" + }, + "@preact/signals@2.5.1_preact@10.19.6": { + "integrity": "sha512-VPjk5YFt7i11Fi4UK0tzaEe5xLwfhUxXL3l89ocxQ5aPz7bRo8M5+N73LjBMPklyXKYKz6YsNo4Smp8n6nplng==", + "dependencies": [ + "@preact/signals-core", + "preact@10.19.6" + ] + }, "@quansync/fs@1.0.0": { "integrity": "sha512-4TJ3DFtlf1L5LDMaM6CanJ/0lckGNtJcMjQ1NAV6zDmA0tEHKZtxNKin8EgPaVX1YzljbxckyT2tJrpQKAtngQ==", "dependencies": [ @@ -1873,7 +1792,7 @@ "@types/amqplib@0.10.8": { "integrity": "sha512-vtDp8Pk1wsE/AuQ8/Rgtm6KUZYqcnTgNvEHwzCkX8rL7AGsC6zqAfKAAJhUZXFhM/Pp++tbnUHiam/8vVpPztA==", "dependencies": [ - "@types/node@24.2.0" + "@types/node@24.10.4" ] }, "@types/chai@5.2.3": { @@ -1920,7 +1839,7 @@ "@types/mute-stream@0.0.4": { "integrity": "sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==", "dependencies": [ - "@types/node@24.2.0" + "@types/node@24.10.4" ] }, "@types/node@16.9.1": { @@ -1944,12 +1863,6 @@ "undici-types@7.16.0" ] }, - "@types/node@24.2.0": { - "integrity": "sha512-3xyG3pMCq3oYCNg7/ZP+E1ooTaGB4cG8JWRsqqOYQdbWNY4zbaV0Ennrd7stjiJEFZCaybcIgpTjJWHRfBSIDw==", - "dependencies": [ - "undici-types@7.10.0" - ] - }, "@types/unist@3.0.3": { "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==" }, @@ -2676,35 +2589,35 @@ "scripts": true, "bin": true }, - "esbuild@0.27.0": { - "integrity": "sha512-jd0f4NHbD6cALCyGElNpGAOtWxSq46l9X/sWB0Nzd5er4Kz2YTm+Vl0qKFT9KUJvD8+fiO8AvoHhFvEatfVixA==", + "esbuild@0.27.2": { + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "optionalDependencies": [ - "@esbuild/aix-ppc64@0.27.0", - "@esbuild/android-arm@0.27.0", - "@esbuild/android-arm64@0.27.0", - "@esbuild/android-x64@0.27.0", - "@esbuild/darwin-arm64@0.27.0", - "@esbuild/darwin-x64@0.27.0", - "@esbuild/freebsd-arm64@0.27.0", - "@esbuild/freebsd-x64@0.27.0", - "@esbuild/linux-arm@0.27.0", - "@esbuild/linux-arm64@0.27.0", - "@esbuild/linux-ia32@0.27.0", - "@esbuild/linux-loong64@0.27.0", - "@esbuild/linux-mips64el@0.27.0", - "@esbuild/linux-ppc64@0.27.0", - "@esbuild/linux-riscv64@0.27.0", - "@esbuild/linux-s390x@0.27.0", - "@esbuild/linux-x64@0.27.0", - "@esbuild/netbsd-arm64@0.27.0", - "@esbuild/netbsd-x64@0.27.0", - "@esbuild/openbsd-arm64@0.27.0", - "@esbuild/openbsd-x64@0.27.0", + "@esbuild/aix-ppc64@0.27.2", + "@esbuild/android-arm@0.27.2", + "@esbuild/android-arm64@0.27.2", + "@esbuild/android-x64@0.27.2", + "@esbuild/darwin-arm64@0.27.2", + "@esbuild/darwin-x64@0.27.2", + "@esbuild/freebsd-arm64@0.27.2", + "@esbuild/freebsd-x64@0.27.2", + "@esbuild/linux-arm@0.27.2", + "@esbuild/linux-arm64@0.27.2", + "@esbuild/linux-ia32@0.27.2", + "@esbuild/linux-loong64@0.27.2", + "@esbuild/linux-mips64el@0.27.2", + "@esbuild/linux-ppc64@0.27.2", + "@esbuild/linux-riscv64@0.27.2", + "@esbuild/linux-s390x@0.27.2", + "@esbuild/linux-x64@0.27.2", + "@esbuild/netbsd-arm64@0.27.2", + "@esbuild/netbsd-x64@0.27.2", + "@esbuild/openbsd-arm64@0.27.2", + "@esbuild/openbsd-x64@0.27.2", "@esbuild/openharmony-arm64", - "@esbuild/sunos-x64@0.27.0", - "@esbuild/win32-arm64@0.27.0", - "@esbuild/win32-ia32@0.27.0", - "@esbuild/win32-x64@0.27.0" + "@esbuild/sunos-x64@0.27.2", + "@esbuild/win32-arm64@0.27.2", + "@esbuild/win32-ia32@0.27.2", + "@esbuild/win32-x64@0.27.2" ], "scripts": true, "bin": true @@ -2930,8 +2843,8 @@ "toad-cache" ] }, - "fastq@1.19.1": { - "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "fastq@1.20.1": { + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dependencies": [ "reusify" ] @@ -3645,25 +3558,7 @@ "sharp", "stoppable", "undici@7.14.0", - "workerd@1.20250906.0", - "ws", - "youch", - "zod@3.22.3" - ], - "bin": true - }, - "miniflare@4.20251217.0": { - "integrity": "sha512-8xsTQbPS6YV+ABZl9qiJIbsum6hbpbhqiyKpOVdzZrhK+1N8EFpT8R6aBZff7kezGmxYZSntjgjqTwJmj3JLgA==", - "dependencies": [ - "@cspotcode/source-map-support", - "acorn@8.14.0", - "acorn-walk", - "exit-hook", - "glob-to-regexp", - "sharp", - "stoppable", - "undici@7.14.0", - "workerd@1.20251217.0", + "workerd", "ws", "youch", "zod@3.22.3" @@ -3954,6 +3849,9 @@ "preact@10.19.6": { "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==" }, + "preact@10.28.1": { + "integrity": "sha512-u1/ixq/lVQI0CakKNvLDEcW5zfCjUQfZdK9qqWuIJtsezuyG6pk9TWj75GMuI/EzRSZB/VAE43sNWWZfiy8psw==" + }, "prelude-ls@1.2.1": { "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==" }, @@ -4636,7 +4534,7 @@ "tsx@4.21.0": { "integrity": "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw==", "dependencies": [ - "esbuild@0.27.0", + "esbuild@0.27.2", "get-tsconfig" ], "optionalDependencies": [ @@ -4705,9 +4603,6 @@ "undici-types@6.21.0": { "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==" }, - "undici-types@7.10.0": { - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==" - }, "undici-types@7.16.0": { "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==" }, @@ -4829,7 +4724,7 @@ "integrity": "sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg==", "dependencies": [ "@types/node@22.19.3", - "esbuild@0.27.0", + "esbuild@0.27.2", "fdir", "picomatch", "postcss", @@ -4927,28 +4822,16 @@ "workerd@1.20250906.0": { "integrity": "sha512-ryVyEaqXPPsr/AxccRmYZZmDAkfQVjhfRqrNTlEeN8aftBk6Ca1u7/VqmfOayjCXrA+O547TauebU+J3IpvFXw==", "optionalDependencies": [ - "@cloudflare/workerd-darwin-64@1.20250906.0", - "@cloudflare/workerd-darwin-arm64@1.20250906.0", - "@cloudflare/workerd-linux-64@1.20250906.0", - "@cloudflare/workerd-linux-arm64@1.20250906.0", - "@cloudflare/workerd-windows-64@1.20250906.0" + "@cloudflare/workerd-darwin-64", + "@cloudflare/workerd-darwin-arm64", + "@cloudflare/workerd-linux-64", + "@cloudflare/workerd-linux-arm64", + "@cloudflare/workerd-windows-64" ], "scripts": true, "bin": true }, - "workerd@1.20251217.0": { - "integrity": "sha512-s3mHDSWwHTduyY8kpHOsl27ZJ4ziDBJlc18PfBvNMqNnhO7yBeemlxH7bo7yQyU1foJrIZ6IENHDDg0Z9N8zQA==", - "optionalDependencies": [ - "@cloudflare/workerd-darwin-64@1.20251217.0", - "@cloudflare/workerd-darwin-arm64@1.20251217.0", - "@cloudflare/workerd-linux-64@1.20251217.0", - "@cloudflare/workerd-linux-arm64@1.20251217.0", - "@cloudflare/workerd-windows-64@1.20251217.0" - ], - "scripts": true, - "bin": true - }, - "wrangler@4.35.0_@cloudflare+workers-types@4.20251223.0_unenv@2.0.0-rc.21_workerd@1.20250906.0": { + "wrangler@4.35.0_@cloudflare+workers-types@4.20251224.0_unenv@2.0.0-rc.21_workerd@1.20250906.0": { "integrity": "sha512-HbyXtbrh4Fi3mU8ussY85tVdQ74qpVS1vctUgaPc+bPrXBTqfDLkZ6VRtHAVF/eBhz4SFmhJtCQpN1caY2Ak8A==", "dependencies": [ "@cloudflare/kv-asset-handler", @@ -4956,10 +4839,10 @@ "@cloudflare/workers-types", "blake3-wasm", "esbuild@0.25.4", - "miniflare@4.20250906.0", + "miniflare", "path-to-regexp@6.3.0", "unenv", - "workerd@1.20250906.0" + "workerd" ], "optionalDependencies": [ "fsevents" @@ -5094,6 +4977,15 @@ "npm:tsdown@~0.12.9" ], "members": { + "examples/fresh": { + "dependencies": [ + "jsr:@fresh/core@^2.1.4", + "jsr:@fresh/plugin-vite@^1.0.7", + "npm:@preact/signals@^2.3.2", + "npm:preact@^10.27.2", + "npm:vite@^7.1.3" + ] + }, "examples/hono-sample": { "dependencies": [ "jsr:@hono/hono@^4.7.1" diff --git a/examples/fresh/.gitignore b/examples/fresh/.gitignore new file mode 100644 index 000000000..0735100f5 --- /dev/null +++ b/examples/fresh/.gitignore @@ -0,0 +1,13 @@ +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# Fresh build directory +_fresh/ +# npm + other dependencies +node_modules/ +vendor/ + diff --git a/examples/fresh/.vscode/extensions.json b/examples/fresh/.vscode/extensions.json new file mode 100644 index 000000000..09cf720d3 --- /dev/null +++ b/examples/fresh/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "denoland.vscode-deno" + ] +} diff --git a/examples/fresh/.vscode/settings.json b/examples/fresh/.vscode/settings.json new file mode 100644 index 000000000..a5f0701f2 --- /dev/null +++ b/examples/fresh/.vscode/settings.json @@ -0,0 +1,17 @@ +{ + "deno.enable": true, + "deno.lint": true, + "editor.defaultFormatter": "denoland.vscode-deno", + "[typescriptreact]": { + "editor.defaultFormatter": "denoland.vscode-deno" + }, + "[typescript]": { + "editor.defaultFormatter": "denoland.vscode-deno" + }, + "[javascriptreact]": { + "editor.defaultFormatter": "denoland.vscode-deno" + }, + "[javascript]": { + "editor.defaultFormatter": "denoland.vscode-deno" + } +} diff --git a/examples/fresh/README.md b/examples/fresh/README.md new file mode 100644 index 000000000..b2e551fda --- /dev/null +++ b/examples/fresh/README.md @@ -0,0 +1,17 @@ +# Fresh project + +Your new Fresh project is ready to go. You can follow the Fresh "Getting +Started" guide here: https://fresh.deno.dev/docs/getting-started + +### Usage + +Make sure to install Deno: +https://docs.deno.com/runtime/getting_started/installation + +Then start the project in development mode: + +``` +deno task dev +``` + +This will watch the project directory and restart as necessary. diff --git a/examples/fresh/assets/styles.css b/examples/fresh/assets/styles.css new file mode 100644 index 000000000..21c911c4f --- /dev/null +++ b/examples/fresh/assets/styles.css @@ -0,0 +1,144 @@ +*, +*::before, +*::after { + box-sizing: border-box; +} +* { + margin: 0; +} +button { + color: inherit; +} +button, [role="button"] { + cursor: pointer; +} +code { + font-family: + ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", + "Courier New", monospace; + font-size: 1em; +} +img, +svg { + display: block; +} +img, +video { + max-width: 100%; + height: auto; +} + +html { + line-height: 1.5; + -webkit-text-size-adjust: 100%; + font-family: + ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", + Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, + "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", + "Noto Color Emoji"; +} +.transition-colors { + transition-property: background-color, border-color, color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} +.my-6 { + margin-bottom: 1.5rem; + margin-top: 1.5rem; +} +.text-4xl { + font-size: 2.25rem; + line-height: 2.5rem; +} +.mx-2 { + margin-left: 0.5rem; + margin-right: 0.5rem; +} +.my-4 { + margin-bottom: 1rem; + margin-top: 1rem; +} +.mx-auto { + margin-left: auto; + margin-right: auto; +} +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} +.py-8 { + padding-bottom: 2rem; + padding-top: 2rem; +} +.bg-\[\#86efac\] { + background-color: #86efac; +} +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} +.py-6 { + padding-bottom: 1.5rem; + padding-top: 1.5rem; +} +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} +.py-1 { + padding-bottom: 0.25rem; + padding-top: 0.25rem; +} +.border-gray-500 { + border-color: #6b7280; +} +.bg-white { + background-color: #fff; +} +.flex { + display: flex; +} +.gap-8 { + grid-gap: 2rem; + gap: 2rem; +} +.font-bold { + font-weight: 700; +} +.max-w-screen-md { + max-width: 768px; +} +.flex-col { + flex-direction: column; +} +.items-center { + align-items: center; +} +.justify-center { + justify-content: center; +} +.border-2 { + border-width: 2px; +} +.rounded-sm { + border-radius: 0.25rem; +} +.hover\:bg-gray-200:hover { + background-color: #e5e7eb; +} +.tabular-nums { + font-variant-numeric: tabular-nums; +} +.min-h-screen { + min-height: 100vh; +} + +.fresh-gradient { + background-color: rgb(134, 239, 172); + background-image: linear-gradient( + to right bottom, + rgb(219, 234, 254), + rgb(187, 247, 208), + rgb(254, 249, 195) + ); +} diff --git a/examples/fresh/client.ts b/examples/fresh/client.ts new file mode 100644 index 000000000..016cb0782 --- /dev/null +++ b/examples/fresh/client.ts @@ -0,0 +1,2 @@ +// Import CSS files here for hot module reloading to work. +import "./assets/styles.css"; diff --git a/examples/fresh/components/Button.tsx b/examples/fresh/components/Button.tsx new file mode 100644 index 000000000..71eaf7f4b --- /dev/null +++ b/examples/fresh/components/Button.tsx @@ -0,0 +1,17 @@ +import type { ComponentChildren } from "preact"; + +export interface ButtonProps { + id?: string; + onClick?: () => void; + children?: ComponentChildren; + disabled?: boolean; +} + +export function Button(props: ButtonProps) { + return ( + +

{props.count}

+ + + ); +} diff --git a/examples/fresh/main.ts b/examples/fresh/main.ts new file mode 100644 index 000000000..350d652bd --- /dev/null +++ b/examples/fresh/main.ts @@ -0,0 +1,30 @@ +import { App, staticFiles } from "fresh"; +import { define, type State } from "./utils.ts"; + +export const app = new App(); + +app.use(staticFiles()); + +// Pass a shared value from a middleware +app.use(async (ctx) => { + ctx.state.shared = "hello"; + return await ctx.next(); +}); + +// this is the same as the /api/:name route defined via a file. feel free to delete this! +app.get("/api2/:name", (ctx) => { + const name = ctx.params.name; + return new Response( + `Hello, ${name.charAt(0).toUpperCase() + name.slice(1)}!`, + ); +}); + +// this can also be defined via a file. feel free to delete this! +const exampleLoggerMiddleware = define.middleware((ctx) => { + console.log(`${ctx.req.method} ${ctx.req.url}`); + return ctx.next(); +}); +app.use(exampleLoggerMiddleware); + +// Include file-system based routes here +app.fsRoutes(); diff --git a/examples/fresh/routes/_app.tsx b/examples/fresh/routes/_app.tsx new file mode 100644 index 000000000..2e436cabd --- /dev/null +++ b/examples/fresh/routes/_app.tsx @@ -0,0 +1,16 @@ +import { define } from "../utils.ts"; + +export default define.page(function App({ Component }) { + return ( + + + + + fresh + + + + + + ); +}); diff --git a/examples/fresh/routes/api/[name].tsx b/examples/fresh/routes/api/[name].tsx new file mode 100644 index 000000000..0c972482a --- /dev/null +++ b/examples/fresh/routes/api/[name].tsx @@ -0,0 +1,10 @@ +import { define } from "../../utils.ts"; + +export const handler = define.handlers({ + GET(ctx) { + const name = ctx.params.name; + return new Response( + `Hello, ${name.charAt(0).toUpperCase() + name.slice(1)}!`, + ); + }, +}); diff --git a/examples/fresh/routes/index.tsx b/examples/fresh/routes/index.tsx new file mode 100644 index 000000000..74e9ebcc8 --- /dev/null +++ b/examples/fresh/routes/index.tsx @@ -0,0 +1,33 @@ +import { useSignal } from "@preact/signals"; +import { Head } from "fresh/runtime"; +import { define } from "../utils.ts"; +import Counter from "../islands/Counter.tsx"; + +export default define.page(function Home(ctx) { + const count = useSignal(3); + + console.log("Shared value " + ctx.state.shared); + + return ( +
+ + Fresh counter + +
+ the Fresh logo: a sliced lemon dripping with juice +

Welcome to Fresh

+

+ Try updating this message in the + ./routes/index.tsx file, and refresh. +

+ +
+
+ ); +}); diff --git a/examples/fresh/static/favicon.ico b/examples/fresh/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..1cfaaa2193b0f210107a559f7421569f57a25388 GIT binary patch literal 22382 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 bck@HGWY%2idMme??%p8ZW3z(%VE+9-Ofn0d literal 0 HcmV?d00001 diff --git a/examples/fresh/static/logo.svg b/examples/fresh/static/logo.svg new file mode 100644 index 000000000..5b99e0b12 --- /dev/null +++ b/examples/fresh/static/logo.svg @@ -0,0 +1,19 @@ + + + + + + diff --git a/examples/fresh/utils.ts b/examples/fresh/utils.ts new file mode 100644 index 000000000..f404216ed --- /dev/null +++ b/examples/fresh/utils.ts @@ -0,0 +1,9 @@ +import { createDefine } from "fresh"; + +// This specifies the type of "ctx.state" which is used to share +// data among middlewares, layouts and routes. +export interface State { + shared: string; +} + +export const define = createDefine(); diff --git a/examples/fresh/vite.config.ts b/examples/fresh/vite.config.ts new file mode 100644 index 000000000..727d49a27 --- /dev/null +++ b/examples/fresh/vite.config.ts @@ -0,0 +1,6 @@ +import { defineConfig } from "vite"; +import { fresh } from "@fresh/plugin-vite"; + +export default defineConfig({ + plugins: [fresh()], +}); From 0023ab351865bc75fd3e742adfb6a4a3be350efa Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Tue, 4 Nov 2025 16:29:28 +0900 Subject: [PATCH 03/24] Add Federation middleware --- examples/fresh/routes/_middleware.ts | 79 ++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 examples/fresh/routes/_middleware.ts diff --git a/examples/fresh/routes/_middleware.ts b/examples/fresh/routes/_middleware.ts new file mode 100644 index 000000000..bd005cce5 --- /dev/null +++ b/examples/fresh/routes/_middleware.ts @@ -0,0 +1,79 @@ +import type { Federation, FederationFetchOptions } from "@fedify/fedify"; +import { createFederation, MemoryKvStore } from "@fedify/fedify"; +import type { Context, Middleware } from "fresh"; +import { define, type State } from "../utils.ts"; + +/** + * Creates federation fetch options for Fresh 2.0 context. + * Handles 404 and 406 responses by delegating to Fresh's routing system. + */ +function integrateFetchOptions( + ctx: Context, +): Omit, "contextData"> { + return { + onNotFound: ctx.next.bind(ctx), + async onNotAcceptable(_request: Request) { + const response = await ctx.next(); + if (response.status !== 404) return response; + return new Response("Not acceptable", { + status: 406, + headers: { + "Content-Type": "text/plain", + Vary: "Accept", + }, + }); + }, + }; +} + +/** + * Integrates Fedify federation with Fresh 2.0 middleware. + * + * @param federation - The Fedify federation instance + * @param createContextData - Function to create context data from Fresh context + * @returns A Fresh middleware function + */ +function integrateHandler( + federation: Federation, + createContextData: ( + ctx: Context, + ) => TContextData | Promise, +): Middleware { + return async (ctx: Context): Promise => { + const contextData = await createContextData(ctx); + return await federation.fetch(ctx.req, { + contextData, + ...integrateFetchOptions(ctx), + }); + }; +} + +// Create the federation instance +const federation = createFederation({ + kv: new MemoryKvStore(), +}); + +//federation example +federation + .setNodeInfoDispatcher("/nodeinfo/2.1", () => { + return { + software: { + name: "your-software-name", // Lowercase, digits, and hyphens only. + version: "1.0.0", + homepage: new URL("https://your-software.com/"), + }, + protocols: ["activitypub"], + usage: { + // Usage statistics is hard-coded here for demonstration purposes. + // You should replace these with real statistics: + users: { total: 100, activeHalfyear: 50, activeMonth: 20 }, + localPosts: 1000, + localComments: 2000, + }, + }; + }); + +// Export the middleware +export default define.middleware( + integrateHandler(federation, () => undefined), +); From 4f7543e9805309870654eaa814253ce7c6f473d1 Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Tue, 4 Nov 2025 16:29:00 +0900 Subject: [PATCH 04/24] Make external @fedify/fedify --- examples/fresh/vite.config.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/examples/fresh/vite.config.ts b/examples/fresh/vite.config.ts index 727d49a27..eeff3645e 100644 --- a/examples/fresh/vite.config.ts +++ b/examples/fresh/vite.config.ts @@ -1,6 +1,18 @@ -import { defineConfig } from "vite"; import { fresh } from "@fresh/plugin-vite"; +import { defineConfig } from "vite"; export default defineConfig({ plugins: [fresh()], + ssr: { + external: [ + "@fedify/fedify", + ], + }, + build: { + rollupOptions: { + external: [ + "@fedify/fedify", + ], + }, + }, }); From 23e6a3ecf2171423d7673a82a74cad4326db16ac Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Wed, 5 Nov 2025 14:59:59 +0900 Subject: [PATCH 05/24] Add workspace "./packages/fresh" --- deno.json | 1 + 1 file changed, 1 insertion(+) diff --git a/deno.json b/deno.json index a61720703..4bd6b146c 100644 --- a/deno.json +++ b/deno.json @@ -7,6 +7,7 @@ "./packages/express", "./packages/fastify", "./packages/fedify", + "./packages/fresh", "./packages/h3", "./packages/hono", "./packages/koa", From 2a9c9a13a0b4037426e12a81e4f75b82c86f34a4 Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Wed, 5 Nov 2025 15:05:04 +0900 Subject: [PATCH 06/24] Add @fedify/fresh package --- packages/fresh/deno.json | 19 ++++++++++++++++ packages/fresh/src/mod.ts | 47 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 packages/fresh/deno.json create mode 100644 packages/fresh/src/mod.ts diff --git a/packages/fresh/deno.json b/packages/fresh/deno.json new file mode 100644 index 000000000..0f4b7e184 --- /dev/null +++ b/packages/fresh/deno.json @@ -0,0 +1,19 @@ +{ + "name": "@fedify/fresh", + "version": "2.0.0", + "license": "MIT", + "imports": { + "@fresh/core": "jsr:@fresh/core@^2.1.4", + "fresh": "jsr:@fresh/core@^2.1.4" + }, + "exports": { + ".": "./src/mod.ts" + }, + "exclude": [ + "dist", + "node_modules" + ], + "tasks": { + "check": "deno fmt --check && deno lint && deno check src/*.ts" + } +} diff --git a/packages/fresh/src/mod.ts b/packages/fresh/src/mod.ts new file mode 100644 index 000000000..9e79f70f1 --- /dev/null +++ b/packages/fresh/src/mod.ts @@ -0,0 +1,47 @@ +import type { Federation, FederationFetchOptions } from "@fedify/fedify"; +import type { Context, Middleware } from "fresh"; + +/** + * Creates federation fetch options for Fresh 2.0 context. + * Handles 404 and 406 responses by delegating to Fresh's routing system. + */ +export function integrateFetchOptions( + ctx: Context, +): Omit, "contextData"> { + return { + onNotFound: ctx.next.bind(ctx), + async onNotAcceptable(_request: Request) { + const response = await ctx.next(); + if (response.status !== 404) return response; + return new Response("Not acceptable", { + status: 406, + headers: { + "Content-Type": "text/plain", + Vary: "Accept", + }, + }); + }, + }; +} + +/** + * Integrates Fedify federation with Fresh 2.0 middleware. + * + * @param federation - The Fedify federation instance + * @param createContextData - Function to create context data from Fresh context + * @returns A Fresh middleware function + */ +export function integrateHandler( + federation: Federation, + createContextData: ( + ctx: Context, + ) => TContextData | Promise, +): Middleware { + return async (ctx: Context): Promise => { + const contextData = await createContextData(ctx); + return await federation.fetch(ctx.req, { + contextData, + ...integrateFetchOptions(ctx), + }); + }; +} From 9356790c0544cd2ffafa71aad967f9177a08aeb3 Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Wed, 5 Nov 2025 15:05:27 +0900 Subject: [PATCH 07/24] Apply @fedify/fresh to example --- examples/fresh/routes/_middleware.ts | 48 +--------------------------- 1 file changed, 1 insertion(+), 47 deletions(-) diff --git a/examples/fresh/routes/_middleware.ts b/examples/fresh/routes/_middleware.ts index bd005cce5..eb0cbfb7e 100644 --- a/examples/fresh/routes/_middleware.ts +++ b/examples/fresh/routes/_middleware.ts @@ -1,53 +1,7 @@ -import type { Federation, FederationFetchOptions } from "@fedify/fedify"; import { createFederation, MemoryKvStore } from "@fedify/fedify"; -import type { Context, Middleware } from "fresh"; +import { integrateHandler } from "@fedify/fresh"; import { define, type State } from "../utils.ts"; -/** - * Creates federation fetch options for Fresh 2.0 context. - * Handles 404 and 406 responses by delegating to Fresh's routing system. - */ -function integrateFetchOptions( - ctx: Context, -): Omit, "contextData"> { - return { - onNotFound: ctx.next.bind(ctx), - async onNotAcceptable(_request: Request) { - const response = await ctx.next(); - if (response.status !== 404) return response; - return new Response("Not acceptable", { - status: 406, - headers: { - "Content-Type": "text/plain", - Vary: "Accept", - }, - }); - }, - }; -} - -/** - * Integrates Fedify federation with Fresh 2.0 middleware. - * - * @param federation - The Fedify federation instance - * @param createContextData - Function to create context data from Fresh context - * @returns A Fresh middleware function - */ -function integrateHandler( - federation: Federation, - createContextData: ( - ctx: Context, - ) => TContextData | Promise, -): Middleware { - return async (ctx: Context): Promise => { - const contextData = await createContextData(ctx); - return await federation.fetch(ctx.req, { - contextData, - ...integrateFetchOptions(ctx), - }); - }; -} - // Create the federation instance const federation = createFederation({ kv: new MemoryKvStore(), From b84dc2a878377c4fb47c99560d150385d9354f15 Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Wed, 5 Nov 2025 16:07:57 +0900 Subject: [PATCH 08/24] Update deno.lock --- deno.lock | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/deno.lock b/deno.lock index 0dafa3f8c..50cd310ad 100644 --- a/deno.lock +++ b/deno.lock @@ -5119,6 +5119,11 @@ ] } }, + "packages/fresh": { + "dependencies": [ + "jsr:@fresh/core@^2.1.4" + ] + }, "packages/hono": { "dependencies": [ "jsr:@std/assert@^1.0.13" From bde8854887071ca09f96a876833cb7bbc22aee0f Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Wed, 5 Nov 2025 16:09:35 +0900 Subject: [PATCH 09/24] Separate federation file and remove _middleware.ts --- .../{routes/_middleware.ts => federation.ts} | 11 ++--------- examples/fresh/main.ts | 17 ++++++++++------- 2 files changed, 12 insertions(+), 16 deletions(-) rename examples/fresh/{routes/_middleware.ts => federation.ts} (65%) diff --git a/examples/fresh/routes/_middleware.ts b/examples/fresh/federation.ts similarity index 65% rename from examples/fresh/routes/_middleware.ts rename to examples/fresh/federation.ts index eb0cbfb7e..7308bfc0f 100644 --- a/examples/fresh/routes/_middleware.ts +++ b/examples/fresh/federation.ts @@ -1,9 +1,7 @@ import { createFederation, MemoryKvStore } from "@fedify/fedify"; -import { integrateHandler } from "@fedify/fresh"; -import { define, type State } from "../utils.ts"; // Create the federation instance -const federation = createFederation({ +export const federation = createFederation({ kv: new MemoryKvStore(), }); @@ -12,7 +10,7 @@ federation .setNodeInfoDispatcher("/nodeinfo/2.1", () => { return { software: { - name: "your-software-name", // Lowercase, digits, and hyphens only. + name: "fresh-example", // Lowercase, digits, and hyphens only. version: "1.0.0", homepage: new URL("https://your-software.com/"), }, @@ -26,8 +24,3 @@ federation }, }; }); - -// Export the middleware -export default define.middleware( - integrateHandler(federation, () => undefined), -); diff --git a/examples/fresh/main.ts b/examples/fresh/main.ts index 350d652bd..83bb5cdfe 100644 --- a/examples/fresh/main.ts +++ b/examples/fresh/main.ts @@ -1,4 +1,6 @@ +import { integrateHandler } from "@fedify/fresh"; import { App, staticFiles } from "fresh"; +import { federation } from "./federation.ts"; import { define, type State } from "./utils.ts"; export const app = new App(); @@ -19,12 +21,13 @@ app.get("/api2/:name", (ctx) => { ); }); -// this can also be defined via a file. feel free to delete this! -const exampleLoggerMiddleware = define.middleware((ctx) => { - console.log(`${ctx.req.method} ${ctx.req.url}`); - return ctx.next(); -}); -app.use(exampleLoggerMiddleware); - // Include file-system based routes here app.fsRoutes(); + +// Fedify Integration Example + +const fedifyMiddleware = define.middleware( + integrateHandler(federation, () => undefined), +); + +app.use(fedifyMiddleware); From c9e0b754b95f6ec6ca9ade202c8010f827ba6a97 Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Wed, 5 Nov 2025 16:39:53 +0900 Subject: [PATCH 10/24] docs: add integration section `@fedify/fresh` --- docs/manual/integration.md | 81 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/docs/manual/integration.md b/docs/manual/integration.md index 406d13108..c7f7e08b3 100644 --- a/docs/manual/integration.md +++ b/docs/manual/integration.md @@ -756,6 +756,87 @@ found in the Next.js official documentation [`config` in `middleware.js`]. [Next.js]: https://nextjs.org/ [`config` in `middleware.js`]: https://nextjs.org/docs/app/api-reference/file-conventions/middleware#config-object-optional +Fresh +----- + +*This API is available since Fedify 2.0.0.* + +[Fresh] is a full stack modern web framework for Deno. Fedify has the +`@fedify/fresh` module that provides a middleware to integrate Fedify +with Fresh. + +::: code-group + +~~~~ sh [Deno] +deno add jsr:@fedify/fresh +~~~~ + +::: + +> [!NOTE] +> The `@fedify/fresh` package only supports Fresh 2.x. + +> [!WARNING] +> Due to `@fedify/fedify`'s `multicodec` dependency CJS issue, you should externalize `@fedify/fedify` in `vite.config.ts`. +> +> ~~~~typescript +> import { fresh } from "@fresh/plugin-vite"; +> import { defineConfig } from "vite"; +> +> export default defineConfig({ +> plugins: [fresh()], +> ssr: { +> external: [ +> "@fedify/fedify", +> ], +> }, +> build: { +> rollupOptions: { +> external: [ +> "@fedify/fedify", +> ], +> }, +> }, +> }); +> ~~~~ + +Put the following code in your *routes/_middleware.ts* file: + +~~~~ typescript +import { createFederation } from "@fedify/fedify"; +import { integrateHandler } from "@fedify/fresh"; +import { define } from "../utils.ts"; + +const federation = createFederation({ + // Omitted for brevity; see the related section for details. +}); + +// This is the entry point to the Fedify middleware from the Fresh framework: +export default define.middleware( + integrateHandler(federation, () => undefined), +); +~~~~ + +Or you can use `app.use()` to register the middleware: + +~~~~ typescript +import { createFederation } from "@fedify/fedify"; +import { integrateHandler } from "@fedify/fresh"; +import { define } from "./utils.ts"; + +const federation = createFederation({ + // Omitted for brevity; see the related section for details. +}); + +// This is the entry point to the Fedify middleware from the Fresh framework: +const fedifyMiddleware = define.middleware( + integrateHandler(federation, () => undefined), +); + +app.use(fedifyMiddleware); +~~~~ + +[Fresh]: https://fresh.deno.dev/ Custom middleware ----------------- From 6b49b8c2f0974b3cdf145462400bb6da0585a5af Mon Sep 17 00:00:00 2001 From: "Kim, Hyeonseo" Date: Wed, 5 Nov 2025 17:02:34 +0900 Subject: [PATCH 11/24] docs: packages/fresh/src/mod.ts Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com> --- packages/fresh/src/mod.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/fresh/src/mod.ts b/packages/fresh/src/mod.ts index 9e79f70f1..95dc5040b 100644 --- a/packages/fresh/src/mod.ts +++ b/packages/fresh/src/mod.ts @@ -2,8 +2,8 @@ import type { Federation, FederationFetchOptions } from "@fedify/fedify"; import type { Context, Middleware } from "fresh"; /** - * Creates federation fetch options for Fresh 2.0 context. - * Handles 404 and 406 responses by delegating to Fresh's routing system. + * Creates federation fetch options for a Fresh context, which configures how + * `federation.fetch` delegates to Fresh's routing system. */ export function integrateFetchOptions( ctx: Context, From 464e0609459b4f4126f13b307b9420a548d0cb9c Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Wed, 5 Nov 2025 17:11:40 +0900 Subject: [PATCH 12/24] docs: add README to packages/fresh --- packages/fresh/README.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 packages/fresh/README.md diff --git a/packages/fresh/README.md b/packages/fresh/README.md new file mode 100644 index 000000000..feaee1cec --- /dev/null +++ b/packages/fresh/README.md @@ -0,0 +1,30 @@ + + +@fedify/fresh: Integrate Fedify with Fresh 2.x +============================================ + +[![Follow @fedify@hollo.social][@fedify@hollo.social badge]][@fedify@hollo.social] + +This package provides a simple way to integrate [Fedify] with [Fresh]. + +The integration code looks like this: + +~~~~ typescript +import { integrateHandler } from "@fedify/fresh"; +import { App, staticFiles } from "fresh"; +import { federation } from "./federation.ts"; +import { define, type State } from "./utils.ts"; + +const fedifyMiddleware = define.middleware( + integrateHandler(federation, () => undefined), +); + +app.use(fedifyMiddleware); +~~~~ + +[Matrix]: https://matrix.to/#/#fedify:matrix.org +[Matrix badge]: https://img.shields.io/matrix/fedify%3Amatrix.org +[@fedify@hollo.social badge]: https://fedi-badge.deno.dev/@fedify@hollo.social/followers.svg +[@fedify@hollo.social]: https://hollo.social/@fedify +[Fedify]: https://fedify.dev/ +[Elysia]: https://fresh.deno.dev/ From 84a5e5031394020ac91487dc35fd8749a0727f2f Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Wed, 5 Nov 2025 17:12:57 +0900 Subject: [PATCH 13/24] docs: specify file name in fresh integration --- docs/manual/integration.md | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/docs/manual/integration.md b/docs/manual/integration.md index c7f7e08b3..57d6fb635 100644 --- a/docs/manual/integration.md +++ b/docs/manual/integration.md @@ -802,7 +802,7 @@ deno add jsr:@fedify/fresh Put the following code in your *routes/_middleware.ts* file: -~~~~ typescript +~~~~ typescript [_middelware.ts] import { createFederation } from "@fedify/fedify"; import { integrateHandler } from "@fedify/fresh"; import { define } from "../utils.ts"; @@ -817,22 +817,21 @@ export default define.middleware( ); ~~~~ -Or you can use `app.use()` to register the middleware: +Or you can use `app.use()` in your `main.ts` to register the middleware globally: -~~~~ typescript +~~~~ typescript [main.ts] +import { App } from "fresh"; import { createFederation } from "@fedify/fedify"; import { integrateHandler } from "@fedify/fresh"; import { define } from "./utils.ts"; - +const app = new App(); const federation = createFederation({ // Omitted for brevity; see the related section for details. }); - // This is the entry point to the Fedify middleware from the Fresh framework: const fedifyMiddleware = define.middleware( integrateHandler(federation, () => undefined), ); - app.use(fedifyMiddleware); ~~~~ From f27a2106c99399322aff6b2c6aa8628f3b554920 Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Wed, 5 Nov 2025 17:13:21 +0900 Subject: [PATCH 14/24] docs: Update example comment in examples/fresh --- examples/fresh/federation.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/fresh/federation.ts b/examples/fresh/federation.ts index 7308bfc0f..0b5d79af6 100644 --- a/examples/fresh/federation.ts +++ b/examples/fresh/federation.ts @@ -5,7 +5,7 @@ export const federation = createFederation({ kv: new MemoryKvStore(), }); -//federation example +// Set up a NodeInfo dispatcher for the federation instance federation .setNodeInfoDispatcher("/nodeinfo/2.1", () => { return { From 5d5799e5abef8377b7c098a5914520090be0a4c7 Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Wed, 5 Nov 2025 17:24:52 +0900 Subject: [PATCH 15/24] docs: update CHANGES.md --- CHANGES.md | 9 +++++++++ deno.lock | 52 +++++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 58 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 47ca58bd1..292a2369b 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -196,6 +196,15 @@ To be released. consistent code style across Fedify packages and user projects. [[#297], [#494] by ChanHaeng Lee] +### @fedify/fresh + + - Created a new @fedify/fresh package that provides seamless integration + between Fedify and Fresh 2.0, replacing the deprecated `@fedify/fedify/x/fresh` + module that was designed for Fresh 1.x. + [[#466], [#478] by Hyeonseo Kim] + +[#466]: https://github.com/fedify-dev/fedify/issues/466 +[#478]: https://github.com/fedify-dev/fedify/pull/478 Version 1.10.0 -------------- diff --git a/deno.lock b/deno.lock index 50cd310ad..8e192ab27 100644 --- a/deno.lock +++ b/deno.lock @@ -6,6 +6,8 @@ "jsr:@david/path@0.2": "0.2.0", "jsr:@david/which@~0.4.1": "0.4.1", "jsr:@es-toolkit/es-toolkit@^1.39.5": "1.43.0", + "jsr:@fresh/build-id@1": "1.0.1", + "jsr:@fresh/core@^2.1.4": "2.1.4", "jsr:@hongminhee/localtunnel@0.3": "0.3.0", "jsr:@hono/hono@^4.8.3": "4.11.1", "jsr:@logtape/file@^1.2.2": "1.3.5", @@ -16,14 +18,20 @@ "jsr:@optique/core@~0.6.6": "0.6.6", "jsr:@optique/run@~0.6.1": "0.6.6", "jsr:@std/bytes@^1.0.5": "1.0.6", + "jsr:@std/encoding@^1.0.10": "1.0.10", "jsr:@std/fmt@1": "1.0.8", + "jsr:@std/fmt@^1.0.8": "1.0.8", "jsr:@std/fs@1": "1.0.19", + "jsr:@std/fs@^1.0.19": "1.0.19", + "jsr:@std/html@^1.0.5": "1.0.5", + "jsr:@std/http@^1.0.21": "1.0.21", "jsr:@std/internal@^1.0.10": "1.0.12", "jsr:@std/internal@^1.0.9": "1.0.12", "jsr:@std/io@0.225": "0.225.2", "jsr:@std/path@1": "1.1.2", "jsr:@std/path@^1.0.6": "1.1.2", "jsr:@std/path@^1.1.1": "1.1.2", + "jsr:@std/path@^1.1.2": "1.1.2", "npm:@alinea/suite@~0.6.3": "0.6.3", "npm:@cfworker/json-schema@^4.1.1": "4.1.1", "npm:@cloudflare/vitest-pool-workers@~0.8.31": "0.8.71_@vitest+runner@3.2.4_@vitest+snapshot@3.2.4_vitest@3.2.4__@types+node@22.19.3__vite@7.3.0___@types+node@22.19.3___tsx@4.21.0___yaml@2.8.2___picomatch@4.0.3__tsx@4.21.0__yaml@2.8.2_@types+node@22.19.3_@cloudflare+workers-types@4.20251224.0_tsx@4.21.0_yaml@2.8.2", @@ -44,6 +52,7 @@ "npm:@optique/core@~0.6.1": "0.6.6", "npm:@optique/run@~0.6.1": "0.6.6", "npm:@poppanator/http-constants@^1.1.1": "1.1.1", + "npm:@preact/signals@^2.2.1": "2.5.1_preact@10.19.6", "npm:@preact/signals@^2.3.2": "2.5.1_preact@10.19.6", "npm:@sveltejs/kit@2": "2.49.2_@opentelemetry+api@1.9.0_@sveltejs+vite-plugin-svelte@6.2.1__svelte@5.46.0___acorn@8.15.0__vite@7.3.0___@types+node@22.19.3___tsx@4.21.0___yaml@2.8.2___picomatch@4.0.3__@types+node@22.19.3__tsx@4.21.0__yaml@2.8.2_svelte@5.46.0__acorn@8.15.0_vite@7.3.0__@types+node@22.19.3__tsx@4.21.0__yaml@2.8.2__picomatch@4.0.3_acorn@8.15.0_@types+node@22.19.3_tsx@4.21.0_yaml@2.8.2", "npm:@types/amqplib@~0.10.7": "0.10.8", @@ -91,6 +100,7 @@ "npm:pkijs@^3.2.4": "3.3.3", "npm:pkijs@^3.2.5": "3.3.3", "npm:postgres@^3.4.7": "3.4.7", + "npm:preact-render-to-string@^6.6.3": "6.6.4_preact@10.19.6", "npm:preact@10.19.6": "10.19.6", "npm:preact@^10.27.2": "10.28.1", "npm:shiki@^1.6.4": "1.29.2", @@ -117,8 +127,8 @@ "jsr:@david/console-static-text", "jsr:@david/path", "jsr:@david/which", - "jsr:@std/fmt", - "jsr:@std/fs", + "jsr:@std/fmt@1", + "jsr:@std/fs@1", "jsr:@std/io", "jsr:@std/path@1" ] @@ -126,7 +136,7 @@ "@david/path@0.2.0": { "integrity": "f2d7aa7f02ce5a55e27c09f9f1381794acb09d328f8d3c8a2e3ab3ffc294dccd", "dependencies": [ - "jsr:@std/fs", + "jsr:@std/fs@1", "jsr:@std/path@1" ] }, @@ -136,6 +146,27 @@ "@es-toolkit/es-toolkit@1.43.0": { "integrity": "ce62274cd14ad9317290b5d77e2c2bf752b78a96e393c0306640f59753e7e043" }, + "@fresh/build-id@1.0.1": { + "integrity": "12a2ec25fd52ae9ec68c26848a5696cd1c9b537f7c983c7e56e4fb1e7e816c20", + "dependencies": [ + "jsr:@std/encoding" + ] + }, + "@fresh/core@2.1.4": { + "integrity": "ce6321efe9ec5de38631a52a79f1691e37805c11df8b96472c788805e5e3a214", + "dependencies": [ + "jsr:@fresh/build-id", + "jsr:@std/fmt@^1.0.8", + "jsr:@std/fs@^1.0.19", + "jsr:@std/html", + "jsr:@std/http", + "jsr:@std/path@^1.1.2", + "npm:@opentelemetry/api", + "npm:@preact/signals@^2.2.1", + "npm:preact-render-to-string", + "npm:preact@^10.27.2" + ] + }, "@hongminhee/localtunnel@0.3.0": { "integrity": "4ad858acd963b5fad45b188d54cf751ac8fbe0aae495e1d3ce607e3730270ff4", "dependencies": [ @@ -166,6 +197,9 @@ "@std/bytes@1.0.6": { "integrity": "f6ac6adbd8ccd99314045f5703e23af0a68d7f7e58364b47d2c7f408aeb5820a" }, + "@std/encoding@1.0.10": { + "integrity": "8783c6384a2d13abd5e9e87a7ae0520a30e9f56aeeaa3bdf910a3eaaf5c811a1" + }, "@std/fmt@1.0.8": { "integrity": "71e1fc498787e4434d213647a6e43e794af4fd393ef8f52062246e06f7e372b7" }, @@ -176,6 +210,12 @@ "jsr:@std/path@^1.1.1" ] }, + "@std/html@1.0.5": { + "integrity": "4e2d693f474cae8c16a920fa5e15a3b72267b94b84667f11a50c6dd1cb18d35e" + }, + "@std/http@1.0.21": { + "integrity": "abb5c747651ee6e3ea6139858fd9b1810d2c97f53a5e6722f3b6d27a6d263edc" + }, "@std/internal@1.0.12": { "integrity": "972a634fd5bc34b242024402972cd5143eac68d8dffaca5eaa4dba30ce17b027" }, @@ -3846,6 +3886,12 @@ "postgres@3.4.7": { "integrity": "sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==" }, + "preact-render-to-string@6.6.4_preact@10.19.6": { + "integrity": "sha512-Bn6eQZ5SQ5loVEcC/mZmKT7HzO5Z/+vYzxfE/W2N468oSoNMJVdFGApF0GyXq0lDthuyXKTmtZ8k20NpYjr6Rw==", + "dependencies": [ + "preact@10.19.6" + ] + }, "preact@10.19.6": { "integrity": "sha512-gympg+T2Z1fG1unB8NH29yHJwnEaCH37Z32diPDku316OTnRPeMbiRV9kTrfZpocXjdfnWuFUl/Mj4BHaf6gnw==" }, From 4d16668fe91953f5c0ffe24fa0d06e4df7776358 Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Wed, 5 Nov 2025 18:14:31 +0900 Subject: [PATCH 16/24] Add deno.unstable to Compiler Options of fresh example --- examples/fresh/deno.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/fresh/deno.json b/examples/fresh/deno.json index 60872c102..6a735b6c4 100644 --- a/examples/fresh/deno.json +++ b/examples/fresh/deno.json @@ -30,7 +30,8 @@ "dom", "dom.asynciterable", "dom.iterable", - "deno.ns" + "deno.ns", + "deno.unstable" ], "jsx": "precompile", "jsxImportSource": "preact", From 2474b75c2b18871ab1e4ad5e8c823bfae236823a Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Wed, 5 Nov 2025 18:17:34 +0900 Subject: [PATCH 17/24] docs: update about Temporal compiler Options --- docs/manual/integration.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/docs/manual/integration.md b/docs/manual/integration.md index 57d6fb635..16fca27df 100644 --- a/docs/manual/integration.md +++ b/docs/manual/integration.md @@ -800,6 +800,20 @@ deno add jsr:@fedify/fresh > }); > ~~~~ +> [!WARNING] +> Due to `@fedify/fedify` use `Temporal` inside, you should add `deno.unstable` to `compilerOptions.libs` field of `deno.json`. +> ~~~~json +> "compilerOptions": { +> "lib": [ +> "dom", +> "dom.asynciterable", +> "dom.iterable", +> "deno.ns", +> "deno.unstable" +> ], +> ... +> ~~~~ + Put the following code in your *routes/_middleware.ts* file: ~~~~ typescript [_middelware.ts] From a9316866aa9eb402f032e8bc3c1ac393626efc62 Mon Sep 17 00:00:00 2001 From: "Kim, Hyeonseo" Date: Fri, 7 Nov 2025 21:00:55 +0900 Subject: [PATCH 18/24] fix: add --node-modules-dir=none option to deno compile command --- packages/cli/scripts/pack.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/scripts/pack.ts b/packages/cli/scripts/pack.ts index e02700546..b4284c9d4 100644 --- a/packages/cli/scripts/pack.ts +++ b/packages/cli/scripts/pack.ts @@ -26,7 +26,7 @@ async function compile(os: OS, arch: Arch, into: string): Promise { } await $`deno compile --allow-all --include=${ join("src", "init", "templates") - } --target=${target} --output=${into} ${ + } --node-modules-dir=none --target=${target} --output=${into} ${ join(dirname(import.meta.dirname!), "src", "mod.ts") }`; } From d79bfad15dba2b15b45eb738b02d21a9903d6319 Mon Sep 17 00:00:00 2001 From: "Kim, Hyeonseo" Date: Mon, 17 Nov 2025 22:51:34 +0900 Subject: [PATCH 19/24] docs: update title of packages/fresh/README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Hong Minhee (洪 民憙) --- packages/fresh/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fresh/README.md b/packages/fresh/README.md index feaee1cec..8f1f43b94 100644 --- a/packages/fresh/README.md +++ b/packages/fresh/README.md @@ -1,7 +1,7 @@ @fedify/fresh: Integrate Fedify with Fresh 2.x -============================================ +============================================== [![Follow @fedify@hollo.social][@fedify@hollo.social badge]][@fedify@hollo.social] From 0f7b7adb4ff31e4cc947a60d13a5b0eaf3a188ba Mon Sep 17 00:00:00 2001 From: "Kim, Hyeonseo" Date: Mon, 17 Nov 2025 23:13:43 +0900 Subject: [PATCH 20/24] assets: replace logo with fedify's --- examples/fresh/static/favicon.ico | Bin 22382 -> 0 bytes examples/fresh/static/logo.svg | 228 +++++++++++++++++++++++++++--- 2 files changed, 212 insertions(+), 16 deletions(-) delete mode 100644 examples/fresh/static/favicon.ico diff --git a/examples/fresh/static/favicon.ico b/examples/fresh/static/favicon.ico deleted file mode 100644 index 1cfaaa2193b0f210107a559f7421569f57a25388..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22382 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 bck@HGWY%2idMme??%p8ZW3z(%VE+9-Ofn0d diff --git a/examples/fresh/static/logo.svg b/examples/fresh/static/logo.svg index 5b99e0b12..e92ecbe5d 100644 --- a/examples/fresh/static/logo.svg +++ b/examples/fresh/static/logo.svg @@ -1,19 +1,215 @@ - - + + + + + + + Fedify + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Fedify + + + From 71f1d24fd348d71bbfa4b87f1f132bfe7b0b6842 Mon Sep 17 00:00:00 2001 From: "Kim, Hyeonseo" Date: Mon, 17 Nov 2025 23:14:00 +0900 Subject: [PATCH 21/24] docs: change README of fresh example --- examples/fresh/README.md | 47 ++++++++++++++++++++++++++++++---------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/examples/fresh/README.md b/examples/fresh/README.md index b2e551fda..435275b2a 100644 --- a/examples/fresh/README.md +++ b/examples/fresh/README.md @@ -1,17 +1,42 @@ -# Fresh project +Fedify–Fresh integration example +=================================== -Your new Fresh project is ready to go. You can follow the Fresh "Getting -Started" guide here: https://fresh.deno.dev/docs/getting-started +This is a simple example of how to integrate Fedify into an [Fresh] +application. -### Usage +[Fresh]: https://fresh.deno.dev/ -Make sure to install Deno: -https://docs.deno.com/runtime/getting_started/installation -Then start the project in development mode: +Running the example +------------------- -``` -deno task dev -``` + 1. Clone the repository: -This will watch the project directory and restart as necessary. + ~~~~ sh + git clone https://github.com/fedify-dev/fedify.git + ~~~~ + + 2. Build pacakges + + ~~~~ sh + cd fedify + deno task build + ~~~~ + + 3. Move to example folder + + ~~~~ sh + cd ../../examples/fresh + ~~~~ + + 4. Start the server: + + ~~~~ sh + deno task dev + ~~~~ + + 5. Check NodeInfo of server + + ~~~~ sh + fedify nodeinfo https://localhost:5173 + ~~~~ From 5d15f4c25d86bdc2d175b4c7029fc5e4dd860a36 Mon Sep 17 00:00:00 2001 From: "Kim, Hyeonseo" Date: Mon, 17 Nov 2025 23:52:01 +0900 Subject: [PATCH 22/24] refactor: remove unused components and middleware from fresh example --- examples/fresh/components/Button.tsx | 17 ----------------- examples/fresh/islands/Counter.tsx | 16 ---------------- examples/fresh/main.ts | 14 -------------- examples/fresh/routes/_app.tsx | 16 ---------------- examples/fresh/routes/api/[name].tsx | 10 ---------- examples/fresh/routes/index.tsx | 13 +++---------- 6 files changed, 3 insertions(+), 83 deletions(-) delete mode 100644 examples/fresh/components/Button.tsx delete mode 100644 examples/fresh/islands/Counter.tsx delete mode 100644 examples/fresh/routes/_app.tsx delete mode 100644 examples/fresh/routes/api/[name].tsx diff --git a/examples/fresh/components/Button.tsx b/examples/fresh/components/Button.tsx deleted file mode 100644 index 71eaf7f4b..000000000 --- a/examples/fresh/components/Button.tsx +++ /dev/null @@ -1,17 +0,0 @@ -import type { ComponentChildren } from "preact"; - -export interface ButtonProps { - id?: string; - onClick?: () => void; - children?: ComponentChildren; - disabled?: boolean; -} - -export function Button(props: ButtonProps) { - return ( - - ); -} diff --git a/examples/fresh/islands/Counter.tsx b/examples/fresh/islands/Counter.tsx deleted file mode 100644 index 9d9951299..000000000 --- a/examples/fresh/islands/Counter.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import type { Signal } from "@preact/signals"; -import { Button } from "../components/Button.tsx"; - -interface CounterProps { - count: Signal; -} - -export default function Counter(props: CounterProps) { - return ( -
- -

{props.count}

- -
- ); -} diff --git a/examples/fresh/main.ts b/examples/fresh/main.ts index 83bb5cdfe..9349692ce 100644 --- a/examples/fresh/main.ts +++ b/examples/fresh/main.ts @@ -7,20 +7,6 @@ export const app = new App(); app.use(staticFiles()); -// Pass a shared value from a middleware -app.use(async (ctx) => { - ctx.state.shared = "hello"; - return await ctx.next(); -}); - -// this is the same as the /api/:name route defined via a file. feel free to delete this! -app.get("/api2/:name", (ctx) => { - const name = ctx.params.name; - return new Response( - `Hello, ${name.charAt(0).toUpperCase() + name.slice(1)}!`, - ); -}); - // Include file-system based routes here app.fsRoutes(); diff --git a/examples/fresh/routes/_app.tsx b/examples/fresh/routes/_app.tsx deleted file mode 100644 index 2e436cabd..000000000 --- a/examples/fresh/routes/_app.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { define } from "../utils.ts"; - -export default define.page(function App({ Component }) { - return ( - - - - - fresh - - - - - - ); -}); diff --git a/examples/fresh/routes/api/[name].tsx b/examples/fresh/routes/api/[name].tsx deleted file mode 100644 index 0c972482a..000000000 --- a/examples/fresh/routes/api/[name].tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { define } from "../../utils.ts"; - -export const handler = define.handlers({ - GET(ctx) { - const name = ctx.params.name; - return new Response( - `Hello, ${name.charAt(0).toUpperCase() + name.slice(1)}!`, - ); - }, -}); diff --git a/examples/fresh/routes/index.tsx b/examples/fresh/routes/index.tsx index 74e9ebcc8..094923efa 100644 --- a/examples/fresh/routes/index.tsx +++ b/examples/fresh/routes/index.tsx @@ -1,11 +1,6 @@ -import { useSignal } from "@preact/signals"; import { Head } from "fresh/runtime"; import { define } from "../utils.ts"; -import Counter from "../islands/Counter.tsx"; - export default define.page(function Home(ctx) { - const count = useSignal(3); - console.log("Shared value " + ctx.state.shared); return ( @@ -19,14 +14,12 @@ export default define.page(function Home(ctx) { src="/logo.svg" width="128" height="128" - alt="the Fresh logo: a sliced lemon dripping with juice" + alt="the Fedify logo" /> -

Welcome to Fresh

+

Welcome to Fresh & Fedify

- Try updating this message in the - ./routes/index.tsx file, and refresh. + Hello, Fediverse!

- ); From fd2fb9948e2720eaa606194fde784b589e1ea7d3 Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Thu, 25 Dec 2025 16:32:13 +0900 Subject: [PATCH 23/24] Fix typo in packages/fresh/README.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Hong Minhee (洪 民憙) --- packages/fresh/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/fresh/README.md b/packages/fresh/README.md index 8f1f43b94..1f24a354b 100644 --- a/packages/fresh/README.md +++ b/packages/fresh/README.md @@ -27,4 +27,4 @@ app.use(fedifyMiddleware); [@fedify@hollo.social badge]: https://fedi-badge.deno.dev/@fedify@hollo.social/followers.svg [@fedify@hollo.social]: https://hollo.social/@fedify [Fedify]: https://fedify.dev/ -[Elysia]: https://fresh.deno.dev/ +[Fresh]: https://fresh.deno.dev/ From 834c1eb99dd5973236ba84c5a72ed0db114c4997 Mon Sep 17 00:00:00 2001 From: Hyeonseo Kim Date: Thu, 25 Dec 2025 16:32:28 +0900 Subject: [PATCH 24/24] Update CHANGES.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Hong Minhee (洪 民憙) --- CHANGES.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGES.md b/CHANGES.md index 292a2369b..05f8d8ebd 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -199,9 +199,9 @@ To be released. ### @fedify/fresh - Created a new @fedify/fresh package that provides seamless integration - between Fedify and Fresh 2.0, replacing the deprecated `@fedify/fedify/x/fresh` - module that was designed for Fresh 1.x. - [[#466], [#478] by Hyeonseo Kim] + between Fedify and Fresh 2.0, replacing the deprecated `@fedify/fedify/x/fresh` + module that was designed for Fresh 1.x. + [[#466], [#478] by Hyeonseo Kim] [#466]: https://github.com/fedify-dev/fedify/issues/466 [#478]: https://github.com/fedify-dev/fedify/pull/478