UNPKG

backport

Version:

A CLI tool that automates the process of backporting commits

335 lines (334 loc) 15 kB
import type winston from 'winston'; import { z } from 'zod'; export declare const PROJECT_CONFIG_DOCS_LINK = "https://github.com/sorenlouv/backport/blob/main/docs/configuration.md#project-config-backportrcjson"; export declare const GLOBAL_CONFIG_DOCS_LINK = "https://github.com/sorenlouv/backport/blob/main/docs/configuration.md#global-config-backportconfigjson"; export interface TargetBranchChoice { name: string; value: string; checked?: boolean; } export type TargetBranchChoiceOrString = string | TargetBranchChoice; export type AutoFixConflictsHandler = ({ files, directory, logger, targetBranch, }: { files: string[]; directory: string; logger: winston.Logger; targetBranch: string; }) => boolean | Promise<boolean>; /** * Schema for options that can appear in config files, module API, or CLI. * This is the single source of truth for option types and defaults. */ export declare const configOptionsSchema: z.ZodObject<{ githubToken: z.ZodOptional<z.ZodString>; assignees: z.ZodDefault<z.ZodArray<z.ZodString>>; author: z.ZodOptional<z.ZodNullable<z.ZodString>>; autoAssign: z.ZodDefault<z.ZodBoolean>; autoFixConflicts: z.ZodOptional<z.ZodCustom<AutoFixConflictsHandler, AutoFixConflictsHandler>>; autoMerge: z.ZodDefault<z.ZodBoolean>; autoMergeMethod: z.ZodDefault<z.ZodEnum<{ merge: "merge"; rebase: "rebase"; squash: "squash"; }>>; backportBinary: z.ZodDefault<z.ZodString>; backportBranchName: z.ZodOptional<z.ZodString>; branchLabelMapping: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>; cherryPickRef: z.ZodDefault<z.ZodBoolean>; conflictResolution: z.ZodDefault<z.ZodEnum<{ commit: "commit"; abort: "abort"; theirs: "theirs"; }>>; commitPaths: z.ZodDefault<z.ZodArray<z.ZodString>>; copySourcePRLabels: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString, z.ZodArray<z.ZodString>]>>; copySourcePRReviewers: z.ZodDefault<z.ZodBoolean>; cwd: z.ZodDefault<z.ZodString>; since: z.ZodDefault<z.ZodNullable<z.ZodString>>; until: z.ZodDefault<z.ZodNullable<z.ZodString>>; verbose: z.ZodDefault<z.ZodBoolean>; workdir: z.ZodOptional<z.ZodString>; draft: z.ZodDefault<z.ZodBoolean>; dryRun: z.ZodOptional<z.ZodBoolean>; editor: z.ZodOptional<z.ZodString>; fork: z.ZodDefault<z.ZodBoolean>; gitAuthorEmail: z.ZodOptional<z.ZodString>; gitAuthorName: z.ZodOptional<z.ZodString>; gitHostname: z.ZodDefault<z.ZodString>; githubActionRunId: z.ZodOptional<z.ZodNumber>; githubApiBaseUrlV3: z.ZodOptional<z.ZodString>; githubApiBaseUrlV4: z.ZodOptional<z.ZodString>; globalConfigFile: z.ZodOptional<z.ZodString>; interactive: z.ZodDefault<z.ZodBoolean>; logFilePath: z.ZodOptional<z.ZodString>; mainline: z.ZodOptional<z.ZodNumber>; ls: z.ZodOptional<z.ZodBoolean>; maxCount: z.ZodDefault<z.ZodNumber>; multipleBranches: z.ZodDefault<z.ZodBoolean>; multipleCommits: z.ZodDefault<z.ZodBoolean>; noVerify: z.ZodDefault<z.ZodBoolean>; noUnmergedBackportsHelp: z.ZodDefault<z.ZodBoolean>; onlyMissing: z.ZodOptional<z.ZodBoolean>; prDescription: z.ZodOptional<z.ZodString>; prQuery: z.ZodOptional<z.ZodString>; prTitle: z.ZodOptional<z.ZodString>; projectConfigFile: z.ZodOptional<z.ZodString>; publishStatusCommentOnAbort: z.ZodDefault<z.ZodBoolean>; publishStatusCommentOnFailure: z.ZodDefault<z.ZodBoolean>; publishStatusCommentOnSuccess: z.ZodDefault<z.ZodBoolean>; pullNumber: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>; repoForkOwner: z.ZodOptional<z.ZodString>; repoName: z.ZodOptional<z.ZodString>; repoOwner: z.ZodOptional<z.ZodString>; resetAuthor: z.ZodDefault<z.ZodBoolean>; reviewers: z.ZodDefault<z.ZodArray<z.ZodString>>; sha: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>; signoff: z.ZodDefault<z.ZodBoolean>; skipRemoteConfig: z.ZodOptional<z.ZodBoolean>; sourceBranch: z.ZodOptional<z.ZodString>; sourcePRLabels: z.ZodDefault<z.ZodArray<z.ZodString>>; targetBranchChoices: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodPipe<z.ZodObject<{ name: z.ZodString; value: z.ZodOptional<z.ZodString>; checked: z.ZodOptional<z.ZodBoolean>; }, z.core.$strip>, z.ZodTransform<{ value: string; name: string; checked?: boolean | undefined; }, { name: string; value?: string | undefined; checked?: boolean | undefined; }>>]>>>; targetBranches: z.ZodDefault<z.ZodArray<z.ZodString>>; targetPRLabels: z.ZodDefault<z.ZodArray<z.ZodString>>; }, z.core.$strip>; /** * Partial config options — what config files and CLI provide (all fields optional). */ export type ConfigOptions = z.input<typeof configOptionsSchema>; /** * Fully resolved config options with defaults applied. */ export type ResolvedConfigOptions = z.output<typeof configOptionsSchema>; /** * The default values for all config options, derived from Zod schema. */ export declare const defaultConfigOptions: ResolvedConfigOptions; /** * Extended schema for JSON config files that might contain deprecated fields. * The deprecated fields are stripped during parsing in `read-config-file.ts`. * * IMPORTANT: When adding or removing deprecated fields here, also update * `normalizeDeprecatedOptions()` in `read-config-file.ts` — it handles the * runtime mapping from old keys to new keys. */ export declare const configFileOptionsSchema: z.ZodObject<{ githubToken: z.ZodOptional<z.ZodString>; assignees: z.ZodDefault<z.ZodArray<z.ZodString>>; author: z.ZodOptional<z.ZodNullable<z.ZodString>>; autoAssign: z.ZodDefault<z.ZodBoolean>; autoFixConflicts: z.ZodOptional<z.ZodCustom<AutoFixConflictsHandler, AutoFixConflictsHandler>>; autoMerge: z.ZodDefault<z.ZodBoolean>; autoMergeMethod: z.ZodDefault<z.ZodEnum<{ merge: "merge"; rebase: "rebase"; squash: "squash"; }>>; backportBinary: z.ZodDefault<z.ZodString>; backportBranchName: z.ZodOptional<z.ZodString>; branchLabelMapping: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>; cherryPickRef: z.ZodDefault<z.ZodBoolean>; conflictResolution: z.ZodDefault<z.ZodEnum<{ commit: "commit"; abort: "abort"; theirs: "theirs"; }>>; commitPaths: z.ZodDefault<z.ZodArray<z.ZodString>>; copySourcePRLabels: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString, z.ZodArray<z.ZodString>]>>; copySourcePRReviewers: z.ZodDefault<z.ZodBoolean>; cwd: z.ZodDefault<z.ZodString>; since: z.ZodDefault<z.ZodNullable<z.ZodString>>; until: z.ZodDefault<z.ZodNullable<z.ZodString>>; verbose: z.ZodDefault<z.ZodBoolean>; workdir: z.ZodOptional<z.ZodString>; draft: z.ZodDefault<z.ZodBoolean>; dryRun: z.ZodOptional<z.ZodBoolean>; editor: z.ZodOptional<z.ZodString>; fork: z.ZodDefault<z.ZodBoolean>; gitAuthorEmail: z.ZodOptional<z.ZodString>; gitAuthorName: z.ZodOptional<z.ZodString>; gitHostname: z.ZodDefault<z.ZodString>; githubActionRunId: z.ZodOptional<z.ZodNumber>; githubApiBaseUrlV3: z.ZodOptional<z.ZodString>; githubApiBaseUrlV4: z.ZodOptional<z.ZodString>; globalConfigFile: z.ZodOptional<z.ZodString>; interactive: z.ZodDefault<z.ZodBoolean>; logFilePath: z.ZodOptional<z.ZodString>; mainline: z.ZodOptional<z.ZodNumber>; ls: z.ZodOptional<z.ZodBoolean>; maxCount: z.ZodDefault<z.ZodNumber>; multipleBranches: z.ZodDefault<z.ZodBoolean>; multipleCommits: z.ZodDefault<z.ZodBoolean>; noVerify: z.ZodDefault<z.ZodBoolean>; noUnmergedBackportsHelp: z.ZodDefault<z.ZodBoolean>; onlyMissing: z.ZodOptional<z.ZodBoolean>; prDescription: z.ZodOptional<z.ZodString>; prQuery: z.ZodOptional<z.ZodString>; prTitle: z.ZodOptional<z.ZodString>; projectConfigFile: z.ZodOptional<z.ZodString>; publishStatusCommentOnAbort: z.ZodDefault<z.ZodBoolean>; publishStatusCommentOnFailure: z.ZodDefault<z.ZodBoolean>; publishStatusCommentOnSuccess: z.ZodDefault<z.ZodBoolean>; pullNumber: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>; repoForkOwner: z.ZodOptional<z.ZodString>; repoName: z.ZodOptional<z.ZodString>; repoOwner: z.ZodOptional<z.ZodString>; resetAuthor: z.ZodDefault<z.ZodBoolean>; reviewers: z.ZodDefault<z.ZodArray<z.ZodString>>; sha: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>; signoff: z.ZodDefault<z.ZodBoolean>; skipRemoteConfig: z.ZodOptional<z.ZodBoolean>; sourceBranch: z.ZodOptional<z.ZodString>; sourcePRLabels: z.ZodDefault<z.ZodArray<z.ZodString>>; targetBranchChoices: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodPipe<z.ZodObject<{ name: z.ZodString; value: z.ZodOptional<z.ZodString>; checked: z.ZodOptional<z.ZodBoolean>; }, z.core.$strip>, z.ZodTransform<{ value: string; name: string; checked?: boolean | undefined; }, { name: string; value?: string | undefined; checked?: boolean | undefined; }>>]>>>; targetBranches: z.ZodDefault<z.ZodArray<z.ZodString>>; targetPRLabels: z.ZodDefault<z.ZodArray<z.ZodString>>; help: z.ZodOptional<z.ZodBoolean>; version: z.ZodOptional<z.ZodBoolean>; v: z.ZodOptional<z.ZodBoolean>; accessToken: z.ZodOptional<z.ZodString>; upstream: z.ZodOptional<z.ZodString>; branches: z.ZodOptional<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodPipe<z.ZodObject<{ name: z.ZodString; value: z.ZodOptional<z.ZodString>; checked: z.ZodOptional<z.ZodBoolean>; }, z.core.$strip>, z.ZodTransform<{ value: string; name: string; checked?: boolean | undefined; }, { name: string; value?: string | undefined; checked?: boolean | undefined; }>>]>>>; labels: z.ZodOptional<z.ZodArray<z.ZodString>>; addOriginalReviewers: z.ZodOptional<z.ZodBoolean>; commitConflicts: z.ZodOptional<z.ZodBoolean>; autoResolveConflictsWithTheirs: z.ZodOptional<z.ZodBoolean>; maxNumber: z.ZodOptional<z.ZodNumber>; prFilter: z.ZodOptional<z.ZodString>; dateSince: z.ZodOptional<z.ZodString>; dateUntil: z.ZodOptional<z.ZodString>; dir: z.ZodOptional<z.ZodString>; cherrypickRef: z.ZodOptional<z.ZodBoolean>; details: z.ZodOptional<z.ZodBoolean>; all: z.ZodOptional<z.ZodBoolean>; }, z.core.$strip>; /** * The type used by consumers to pass config-file-style options. * This is the public API type (exported from entrypoint.api.ts). */ export type ConfigFileOptions = z.input<typeof configFileOptionsSchema>; /** * Schema for the final validated options that include required fields * resolved during startup (github token, repo info, authenticated user). */ export declare const validOptionsSchema: z.ZodObject<{ assignees: z.ZodDefault<z.ZodArray<z.ZodString>>; autoAssign: z.ZodDefault<z.ZodBoolean>; autoFixConflicts: z.ZodOptional<z.ZodCustom<AutoFixConflictsHandler, AutoFixConflictsHandler>>; autoMerge: z.ZodDefault<z.ZodBoolean>; autoMergeMethod: z.ZodDefault<z.ZodEnum<{ merge: "merge"; rebase: "rebase"; squash: "squash"; }>>; backportBinary: z.ZodDefault<z.ZodString>; backportBranchName: z.ZodOptional<z.ZodString>; branchLabelMapping: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>; cherryPickRef: z.ZodDefault<z.ZodBoolean>; conflictResolution: z.ZodDefault<z.ZodEnum<{ commit: "commit"; abort: "abort"; theirs: "theirs"; }>>; commitPaths: z.ZodDefault<z.ZodArray<z.ZodString>>; copySourcePRLabels: z.ZodDefault<z.ZodUnion<readonly [z.ZodBoolean, z.ZodString, z.ZodArray<z.ZodString>]>>; copySourcePRReviewers: z.ZodDefault<z.ZodBoolean>; cwd: z.ZodDefault<z.ZodString>; since: z.ZodDefault<z.ZodNullable<z.ZodString>>; until: z.ZodDefault<z.ZodNullable<z.ZodString>>; verbose: z.ZodDefault<z.ZodBoolean>; workdir: z.ZodOptional<z.ZodString>; draft: z.ZodDefault<z.ZodBoolean>; dryRun: z.ZodOptional<z.ZodBoolean>; editor: z.ZodOptional<z.ZodString>; fork: z.ZodDefault<z.ZodBoolean>; gitAuthorEmail: z.ZodOptional<z.ZodString>; gitAuthorName: z.ZodOptional<z.ZodString>; gitHostname: z.ZodDefault<z.ZodString>; githubActionRunId: z.ZodOptional<z.ZodNumber>; githubApiBaseUrlV3: z.ZodOptional<z.ZodString>; githubApiBaseUrlV4: z.ZodOptional<z.ZodString>; globalConfigFile: z.ZodOptional<z.ZodString>; interactive: z.ZodDefault<z.ZodBoolean>; logFilePath: z.ZodOptional<z.ZodString>; mainline: z.ZodOptional<z.ZodNumber>; ls: z.ZodOptional<z.ZodBoolean>; maxCount: z.ZodDefault<z.ZodNumber>; multipleBranches: z.ZodDefault<z.ZodBoolean>; multipleCommits: z.ZodDefault<z.ZodBoolean>; noVerify: z.ZodDefault<z.ZodBoolean>; noUnmergedBackportsHelp: z.ZodDefault<z.ZodBoolean>; onlyMissing: z.ZodOptional<z.ZodBoolean>; prDescription: z.ZodOptional<z.ZodString>; prQuery: z.ZodOptional<z.ZodString>; prTitle: z.ZodOptional<z.ZodString>; projectConfigFile: z.ZodOptional<z.ZodString>; publishStatusCommentOnAbort: z.ZodDefault<z.ZodBoolean>; publishStatusCommentOnFailure: z.ZodDefault<z.ZodBoolean>; publishStatusCommentOnSuccess: z.ZodDefault<z.ZodBoolean>; pullNumber: z.ZodOptional<z.ZodUnion<readonly [z.ZodNumber, z.ZodArray<z.ZodNumber>]>>; resetAuthor: z.ZodDefault<z.ZodBoolean>; reviewers: z.ZodDefault<z.ZodArray<z.ZodString>>; sha: z.ZodOptional<z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>; signoff: z.ZodDefault<z.ZodBoolean>; skipRemoteConfig: z.ZodOptional<z.ZodBoolean>; sourcePRLabels: z.ZodDefault<z.ZodArray<z.ZodString>>; targetBranchChoices: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodPipe<z.ZodObject<{ name: z.ZodString; value: z.ZodOptional<z.ZodString>; checked: z.ZodOptional<z.ZodBoolean>; }, z.core.$strip>, z.ZodTransform<{ value: string; name: string; checked?: boolean | undefined; }, { name: string; value?: string | undefined; checked?: boolean | undefined; }>>]>>>; targetBranches: z.ZodDefault<z.ZodArray<z.ZodString>>; targetPRLabels: z.ZodDefault<z.ZodArray<z.ZodString>>; githubToken: z.ZodString; author: z.ZodDefault<z.ZodNullable<z.ZodString>>; repoName: z.ZodString; repoOwner: z.ZodString; repoForkOwner: z.ZodString; authenticatedUsername: z.ZodString; sourceBranch: z.ZodString; isRepoPrivate: z.ZodOptional<z.ZodBoolean>; }, z.core.$strip>; export type ValidConfigOptions = Readonly<z.output<typeof validOptionsSchema>>;