backport
Version:
A CLI tool that automates the process of backporting commits
335 lines (334 loc) • 15 kB
TypeScript
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>>;