kaneo (minimalist kanban) fork to experiment adding a tangled integration
github.com/usekaneo/kaneo
1import * as v from "valibot";
2import { branchPatterns } from "../github/config";
3
4export { branchPatterns };
5
6export const giteaConfigSchema = v.object({
7 baseUrl: v.pipe(v.string(), v.url()),
8 accessToken: v.pipe(v.string(), v.trim(), v.nonEmpty()),
9 repositoryOwner: v.pipe(v.string(), v.trim(), v.nonEmpty()),
10 repositoryName: v.pipe(v.string(), v.trim(), v.nonEmpty()),
11 webhookSecret: v.optional(v.string()),
12 branchPattern: v.optional(v.string()),
13 customBranchRegex: v.optional(v.string()),
14 commentTaskLinkOnGiteaIssue: v.optional(v.boolean()),
15 statusTransitions: v.optional(
16 v.object({
17 onBranchPush: v.optional(v.string()),
18 onPROpen: v.optional(v.string()),
19 onPRMerge: v.optional(v.string()),
20 }),
21 ),
22});
23
24export type GiteaConfig = v.InferOutput<typeof giteaConfigSchema>;
25
26export async function validateGiteaConfig(
27 config: unknown,
28): Promise<{ valid: boolean; errors?: string[] }> {
29 try {
30 v.parse(giteaConfigSchema, config);
31 return { valid: true };
32 } catch (error) {
33 if (error instanceof v.ValiError) {
34 return {
35 valid: false,
36 errors: error.issues.map((issue) => issue.message),
37 };
38 }
39 return {
40 valid: false,
41 errors: [error instanceof Error ? error.message : "Invalid config"],
42 };
43 }
44}
45
46export const defaultGiteaConfig: Partial<GiteaConfig> = {
47 branchPattern: "{slug}-{number}",
48 commentTaskLinkOnGiteaIssue: true,
49 statusTransitions: {
50 onBranchPush: "in-progress",
51 onPROpen: "in-review",
52 onPRMerge: "done",
53 },
54};
55
56export function normalizeGiteaBaseUrl(url: string): string {
57 return url.trim().replace(/\/+$/, "");
58}
59
60export function getDefaultGiteaConfig(
61 baseUrl: string,
62 accessToken: string,
63 repositoryOwner: string,
64 repositoryName: string,
65 webhookSecret: string,
66): GiteaConfig {
67 return {
68 baseUrl: normalizeGiteaBaseUrl(baseUrl),
69 accessToken,
70 repositoryOwner,
71 repositoryName,
72 webhookSecret,
73 ...defaultGiteaConfig,
74 };
75}