import {z} from 'zod' export type CreateApiReposOwnerRepoBranchesBranchRenameArgs = {owner: string, repo: string, branch: string, body: {new_name: string}}; export type CreateApiReposOwnerRepoBranchesBranchRenameOptions = {baseUrl?: string | undefined, fetch?: typeof fetch | undefined}; export const nullableGitUser = z.object({name: z.string().optional(), email: z.string().optional(), date: z.string().optional()}).nullable(); export const verification = z.object({verified: z.boolean(), reason: z.string(), payload: z.string().nullable(), signature: z.string().nullable(), verified_at: z.string().nullable()}); export const simpleUser = z.object({name: z.string().nullable().optional(), email: z.string().nullable().optional(), login: z.string(), id: z.number().int(), node_id: z.string(), avatar_url: z.string(), gravatar_id: z.string().nullable(), url: z.string(), html_url: z.string(), followers_url: z.string(), following_url: z.string(), gists_url: z.string(), starred_url: z.string(), subscriptions_url: z.string(), organizations_url: z.string(), repos_url: z.string(), events_url: z.string(), received_events_url: z.string(), type: z.string(), site_admin: z.boolean(), starred_at: z.string().optional(), user_view_type: z.string().optional()}); export const emptyObject = z.object({}); export const diffEntry = z.object({sha: z.string().nullable(), filename: z.string(), status: z.enum(["added", "removed", "modified", "renamed", "copied", "changed", "unchanged"]), additions: z.number().int(), deletions: z.number().int(), changes: z.number().int(), blob_url: z.string(), raw_url: z.string(), contents_url: z.string(), patch: z.string().optional(), previous_filename: z.string().optional()}); export const commit = z.object({url: z.string(), sha: z.string(), node_id: z.string(), html_url: z.string(), comments_url: z.string(), commit: z.object({url: z.string(), author: nullableGitUser, committer: nullableGitUser, message: z.string(), comment_count: z.number().int(), tree: z.object({sha: z.string(), url: z.string()}), verification: verification.optional()}), author: z.union([simpleUser, emptyObject]).nullable(), committer: z.union([simpleUser, emptyObject]).nullable(), parents: z.array(z.object({sha: z.string(), url: z.string(), html_url: z.string().optional()})), stats: z.object({additions: z.number().int().optional(), deletions: z.number().int().optional(), total: z.number().int().optional()}).optional(), files: z.array(diffEntry).optional()}); export const protectedBranchRequiredStatusCheck = z.object({url: z.string().optional(), enforcement_level: z.string().optional(), contexts: z.array(z.string()), checks: z.array(z.object({context: z.string(), app_id: z.number().int().nullable()})), contexts_url: z.string().optional(), strict: z.boolean().optional()}); export const protectedBranchAdminEnforced = z.object({url: z.string(), enabled: z.boolean()}); export const nullableTeamSimple = z.object({id: z.number().int(), node_id: z.string(), url: z.string(), members_url: z.string(), name: z.string(), description: z.string().nullable(), permission: z.string(), privacy: z.string().optional(), notification_setting: z.string().optional(), html_url: z.string(), repositories_url: z.string(), slug: z.string(), ldap_dn: z.string().optional(), type: z.enum(["enterprise", "organization"]), organization_id: z.number().int().optional(), enterprise_id: z.number().int().optional()}).nullable(); export const team = z.object({id: z.number().int(), node_id: z.string(), name: z.string(), slug: z.string(), description: z.string().nullable(), privacy: z.string().optional(), notification_setting: z.string().optional(), permission: z.string(), permissions: z.object({pull: z.boolean(), triage: z.boolean(), push: z.boolean(), maintain: z.boolean(), admin: z.boolean()}).optional(), url: z.string(), html_url: z.string(), members_url: z.string(), repositories_url: z.string(), type: z.enum(["enterprise", "organization"]), access_source: z.enum(["direct", "organization", "enterprise"]).optional(), organization_id: z.number().int().optional(), enterprise_id: z.number().int().optional(), parent: nullableTeamSimple}); export const enterprise = z.object({description: z.string().nullable().optional(), html_url: z.string(), website_url: z.string().nullable().optional(), id: z.number().int(), node_id: z.string(), name: z.string(), slug: z.string(), created_at: z.string().nullable(), updated_at: z.string().nullable(), avatar_url: z.string()}); export const integration = z.object({id: z.number().int(), slug: z.string().optional(), node_id: z.string(), client_id: z.string().optional(), owner: z.union([simpleUser, enterprise]), name: z.string(), description: z.string().nullable(), external_url: z.string(), html_url: z.string(), created_at: z.string(), updated_at: z.string(), permissions: z.object({issues: z.string().optional(), checks: z.string().optional(), metadata: z.string().optional(), contents: z.string().optional(), deployments: z.string().optional()}).and(z.record(z.string(), z.string())), events: z.array(z.string()), installations_count: z.number().int().optional()}).nullable(); export const protectedBranchPullRequestReview = z.object({url: z.string().optional(), dismissal_restrictions: z.object({users: z.array(simpleUser).optional(), teams: z.array(team).optional(), apps: z.array(integration).optional(), url: z.string().optional(), users_url: z.string().optional(), teams_url: z.string().optional()}).optional(), bypass_pull_request_allowances: z.object({users: z.array(simpleUser).optional(), teams: z.array(team).optional(), apps: z.array(integration).optional()}).optional(), dismiss_stale_reviews: z.boolean(), require_code_owner_reviews: z.boolean(), required_approving_review_count: z.number().int().gte(0).lte(6).optional(), require_last_push_approval: z.boolean().optional()}); export const branchRestrictionPolicy = z.object({url: z.string(), users_url: z.string(), teams_url: z.string(), apps_url: z.string(), users: z.array(z.object({login: z.string().optional(), id: z.number().int().optional(), node_id: z.string().optional(), avatar_url: z.string().optional(), gravatar_id: z.string().optional(), url: z.string().optional(), html_url: z.string().optional(), followers_url: z.string().optional(), following_url: z.string().optional(), gists_url: z.string().optional(), starred_url: z.string().optional(), subscriptions_url: z.string().optional(), organizations_url: z.string().optional(), repos_url: z.string().optional(), events_url: z.string().optional(), received_events_url: z.string().optional(), type: z.string().optional(), site_admin: z.boolean().optional(), user_view_type: z.string().optional()})), teams: z.array(team), apps: z.array(z.object({id: z.number().int().optional(), slug: z.string().optional(), node_id: z.string().optional(), owner: z.object({login: z.string().optional(), id: z.number().int().optional(), node_id: z.string().optional(), url: z.string().optional(), repos_url: z.string().optional(), events_url: z.string().optional(), hooks_url: z.string().optional(), issues_url: z.string().optional(), members_url: z.string().optional(), public_members_url: z.string().optional(), avatar_url: z.string().optional(), description: z.string().optional(), gravatar_id: z.string().optional(), html_url: z.string().optional(), followers_url: z.string().optional(), following_url: z.string().optional(), gists_url: z.string().optional(), starred_url: z.string().optional(), subscriptions_url: z.string().optional(), organizations_url: z.string().optional(), received_events_url: z.string().optional(), type: z.string().optional(), site_admin: z.boolean().optional(), user_view_type: z.string().optional()}).optional(), name: z.string().optional(), client_id: z.string().optional(), description: z.string().optional(), external_url: z.string().optional(), html_url: z.string().optional(), created_at: z.string().optional(), updated_at: z.string().optional(), permissions: z.object({metadata: z.string().optional(), contents: z.string().optional(), issues: z.string().optional(), single_file: z.string().optional()}).optional(), events: z.array(z.string()).optional()}))}); export const branchProtection = z.object({url: z.string().optional(), enabled: z.boolean().optional(), required_status_checks: protectedBranchRequiredStatusCheck.optional(), enforce_admins: protectedBranchAdminEnforced.optional(), required_pull_request_reviews: protectedBranchPullRequestReview.optional(), restrictions: branchRestrictionPolicy.optional(), required_linear_history: z.object({enabled: z.boolean().optional()}).optional(), allow_force_pushes: z.object({enabled: z.boolean().optional()}).optional(), allow_deletions: z.object({enabled: z.boolean().optional()}).optional(), block_creations: z.object({enabled: z.boolean().optional()}).optional(), required_conversation_resolution: z.object({enabled: z.boolean().optional()}).optional(), name: z.string().optional(), protection_url: z.string().optional(), required_signatures: z.object({url: z.string(), enabled: z.boolean()}).optional(), lock_branch: z.object({enabled: z.boolean().optional()}).optional(), allow_fork_syncing: z.object({enabled: z.boolean().optional()}).optional()}); export const branchWithProtection = z.object({name: z.string(), commit: commit, _links: z.object({html: z.string(), self: z.string()}), protected: z.boolean(), protection: branchProtection, protection_url: z.string(), pattern: z.string().optional(), required_approving_review_count: z.number().int().optional()}); export const validateResponse = async ( schema: { readonly '~standard': { readonly validate: (value: unknown) => ({ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }) | Promise<{ readonly value: Output; readonly issues?: undefined } | { readonly issues: ReadonlyArray<{ readonly message: string; readonly path?: ReadonlyArray | undefined }> }> } }, value: unknown ): Promise => { const result = await schema['~standard'].validate(value) if (result.issues !== undefined) { const detail = result.issues .map(({ message, path }) => path?.length ? `${path.map((segment) => String(typeof segment === 'object' ? segment.key : segment)).join('.')}: ${message}` : message ) .join('; ') throw new Error(`Response does not match the schema: ${detail}`, { cause: { issues: result.issues } }) } return result.value }; /** * Rename a branch * * POST /repos/{owner}/{repo}/branches/{branch}/rename */ export const createApiReposOwnerRepoBranchesBranchRename = async (args: CreateApiReposOwnerRepoBranchesBranchRenameArgs, options?: CreateApiReposOwnerRepoBranchesBranchRenameOptions) => { const {baseUrl = "https://api.github.com", fetch: fetchFn = fetch} = options ?? {} const query = new URLSearchParams() const headers = new Headers() headers.set('content-type', "application/json") headers.set('accept', "application/json") const url = `${baseUrl.replace(/\/+$/, '')}/repos/${encodeURIComponent(String(args.owner))}/${encodeURIComponent(String(args.repo))}/branches/${encodeURIComponent(String(args.branch))}/rename${query.size > 0 ? `?${query}` : ''}` const res = await fetchFn(url, {method: "POST", headers, body: JSON.stringify(args.body)}) if (!res.ok) throw new Error(`Request failed with status ${res.status}`, {cause: {status: res.status, body: await res.text()}}) return validateResponse(branchWithProtection, await res.json()) };