Fork Horse repository, listed by its owner. Publisher snapshot.
packages/forkhorse-core/src/events.ts
Snapshot at 34e3175
1import { isRecord, slug } from "./http";
2import type { PushEvent } from "./types";
3
4export function parsePush(value: unknown): PushEvent | null {
5 if (!isRecord(value) || value.type !== "cf.artifacts.repo.pushed") return null;
6 const { source, payload, metadata } = value;
7 if (
8 !isRecord(source) ||
9 !isRecord(payload) ||
10 !isRecord(metadata) ||
11 typeof source.namespace !== "string" ||
12 typeof source.repoName !== "string" ||
13 typeof payload.ref !== "string" ||
14 !payload.ref.startsWith("refs/") ||
15 payload.ref.length > 1024 ||
16 typeof payload.before !== "string" ||
17 !/^[0-9a-f]{40}$/.test(payload.before) ||
18 typeof payload.after !== "string" ||
19 !/^[0-9a-f]{40}$/.test(payload.after) ||
20 typeof metadata.eventTimestamp !== "string" ||
21 !Number.isFinite(Date.parse(metadata.eventTimestamp))
22 ) {
23 throw new Error("Malformed push event");
24 }
25 return {
26 type: "cf.artifacts.repo.pushed",
27 source: { namespace: source.namespace, repoName: source.repoName },
28 payload: { ref: payload.ref, before: payload.before, after: payload.after },
29 metadata: { eventTimestamp: metadata.eventTimestamp },
30 };
31}
32
33export function projectForRepo(repoName: string): string | null {
34 const project = repoName.split("--")[0];
35 return slug(project) ? project : null;
36}
37