Fork Horse repository, listed by its owner. Publisher snapshot.

packages/forkhorse-core/src/events.ts

Snapshot at 34e3175

Containing directory

1,318 bytes · typescriptView raw
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