1import * as Cloudflare from "alchemy/Cloudflare";
2import * as Github from "alchemy/GitHub";
3import * as Effect from "effect/Effect";
4import * as HttpServerResponse from "effect/http/HttpServerResponse";
5import { ReleaseVersion } from "./ReleaseVersion.ts";
6
7export default Cloudflare.Worker(
8 "ReleaseService",
9 { main: import.meta.url },
10 Effect.gen(function* () {
11 const versions = yield* ReleaseVersion;
12
13 yield* Github.consumeRepositoryEvents(
14 {
15 owner: "alchemy-run",
16 repository: "alchemy",
17 events: ["push"],
18 },
19 (event) => {
20 const title = event.payload.head_commit?.message.split("\n")[0] ?? "";
21 const isRelease =
22 event.payload.ref === "refs/heads/main" &&
23 title.startsWith("chore(release):");
24
25 return isRelease
26 ? versions.getByName(event.payload.head_commit!.id).generateBlog({
27 input: event.payload,
28 })
29 : Effect.log(
30 `Skipping commit "${event.payload.head_commit?.message}" (hash: ${event.payload.head_commit!.id})`,
31 );
32 },
33 );
34
35 return {
36 fetch: Effect.gen(function* () {
37 yield* versions.getByName("TEST").generateBlog({
38 input: "TEST",
39 });
40 return HttpServerResponse.text("Hello, world!");
41 }),
42 };
43 }).pipe(Effect.provide(Cloudflare.Workers.GitHubRepositoryEventSourceLive)),
44);