feat: migrate to Nuxt 4 (Nitro) and Tailwind CSS v3

This commit is contained in:
RhenCloud 2026-08-13 17:43:33 +08:00
parent f4959eebf8
commit b139712a91
No known key found for this signature in database
GPG key ID: A574A617378C4E0B
166 changed files with 19790 additions and 5539 deletions

View file

@ -0,0 +1,20 @@
import type { Env, WebhookEvent } from "../../types";
import type { Provider } from "../types";
import { verifySignature } from "./verify";
import { parseEvent } from "./parse";
export const githubProvider: Provider = {
id: "github",
matches(headers) {
return headers["x-github-event"] !== undefined;
},
async verify(body, headers, env: Env) {
return verifySignature(body, headers["x-hub-signature-256"], env.GITHUB_WEBHOOK_SECRET);
},
parse(body, headers): WebhookEvent | null {
return parseEvent(headers, body);
},
};

View file

@ -0,0 +1,20 @@
import type { WebhookEvent } from "../../types";
export function parseEvent(headers: Record<string, string>, body: string): WebhookEvent | null {
const event = headers["x-github-event"];
const signature = headers["x-hub-signature-256"];
const deliveryId = headers["x-github-delivery"];
if (!event) return null;
try {
const payload = JSON.parse(body) as Record<string, unknown>;
const installationId =
typeof (payload.installation as { id?: unknown } | undefined)?.id === "number"
? (payload.installation as { id: number }).id
: undefined;
return { provider: "github", event, payload, signature, deliveryId, installationId };
} catch {
return null;
}
}

View file

@ -0,0 +1,11 @@
import { hmacSha256Hex, timingSafeEqual } from "../hmac";
export async function verifySignature(
payload: string,
signature: string | undefined,
secret: string,
): Promise<boolean> {
if (!signature || !secret) return false;
const expected = `sha256=${await hmacSha256Hex(secret, payload)}`;
return timingSafeEqual(signature, expected);
}