mirror of
https://github.com/heygen-com/hyperframes.git
synced 2026-09-03 04:38:33 +00:00
Add an opt-in --file-issue flag to hyperframes feedback. When set, after sending the usual feedback the CLI publishes a minimal repro of the project to a public URL (consent-gated, mirroring publish --yes) and opens a pre-filled GitHub bug issue draft containing the rating, comment, public repro link, and environment summary. The user reviews and submits the issue under their own account; there is no token, backend, or gh invocation. New --dir selects the project to publish; --yes skips the consent prompt for scripts. URL/body building is extracted into pure, unit-tested helpers.
64 lines
2.3 KiB
TypeScript
64 lines
2.3 KiB
TypeScript
import { describe, expect, it } from "vitest";
|
|
|
|
import { buildIssueUrl, HYPERFRAMES_REPO_URL } from "./feedbackIssue.js";
|
|
|
|
function decoded(url: string, key: "title" | "body"): string {
|
|
const value = new URL(url).searchParams.get(key);
|
|
return value ?? "";
|
|
}
|
|
|
|
describe("buildIssueUrl", () => {
|
|
const base = {
|
|
repoUrl: HYPERFRAMES_REPO_URL,
|
|
rating: 2,
|
|
comment: "GSAP timeline froze on seek",
|
|
repoPublicUrl: "https://hyperframes.dev/p/abc123",
|
|
environment: "os=darwin/arm64 node=v22.11.0 ffmpeg=yes",
|
|
cliVersion: "1.2.3",
|
|
};
|
|
|
|
it("points at the repo /issues/new with the bug label", () => {
|
|
const url = buildIssueUrl(base);
|
|
expect(url.startsWith(`${HYPERFRAMES_REPO_URL}/issues/new?`)).toBe(true);
|
|
expect(new URL(url).searchParams.get("labels")).toBe("bug");
|
|
});
|
|
|
|
it("encodes the title and includes rating + repro URL in the body", () => {
|
|
const url = buildIssueUrl(base);
|
|
expect(decoded(url, "title")).toBe("[feedback] GSAP timeline froze on seek");
|
|
const body = decoded(url, "body");
|
|
expect(body).toContain("2/5");
|
|
expect(body).toContain("https://hyperframes.dev/p/abc123");
|
|
expect(body).toContain("os=darwin/arm64");
|
|
expect(body).toContain("cli=1.2.3");
|
|
});
|
|
|
|
it("falls back to a generic title when there is no comment", () => {
|
|
const url = buildIssueUrl({ ...base, comment: undefined });
|
|
expect(decoded(url, "title")).toBe("Render feedback (rating 2/5)");
|
|
});
|
|
|
|
it("truncates an overlong comment in the body", () => {
|
|
const longComment = "x".repeat(9000);
|
|
const url = buildIssueUrl({ ...base, comment: longComment });
|
|
const body = decoded(url, "body");
|
|
expect(body).not.toContain("x".repeat(9000));
|
|
expect(body).toContain("…");
|
|
// Whole URL stays well under the ~8 KB pre-fill limit.
|
|
expect(url.length).toBeLessThan(8000);
|
|
});
|
|
|
|
it("strips a trailing .git from the repo url", () => {
|
|
const url = buildIssueUrl({
|
|
...base,
|
|
repoUrl: "https://github.com/heygen-com/hyperframes.git",
|
|
});
|
|
expect(url.startsWith(`${HYPERFRAMES_REPO_URL}/issues/new?`)).toBe(true);
|
|
});
|
|
|
|
it("notes when no repro link is available", () => {
|
|
const url = buildIssueUrl({ ...base, repoPublicUrl: undefined });
|
|
expect(decoded(url, "body")).toContain("Publishing the repro failed");
|
|
});
|
|
});
|