import { BaseResource } from '@gitbeaker/requester-utils'; import { RequestHelper, endpoint } from '../infrastructure'; import type { BaseRequestOptions, GitlabAPIResponse, MappedOmit, OneOrNoneOf, PaginationRequestOptions, PaginationTypes, ShowExpanded, Sudo, } from '../infrastructure'; import type { CommitDiffSchema, CommitSchema } from './Commits'; import type { IssueSchema, TimeStatsSchema } from './Issues'; import type { ExpandedPipelineSchema, PipelineSchema } from './Pipelines'; import type { ReviewerState } from './Webhooks'; import type { SimpleProjectSchema } from './Projects'; import type { TodoSchema } from './TodoLists'; import type { SimpleUserSchema } from './Users'; import type { MilestoneSchema } from '../templates/ResourceMilestones'; import type { SimpleLabelSchema } from '../templates/ResourceLabels'; // Response Schemas export interface DiffRefsSchema { base_sha: string; head_sha: string; start_sha: string; } export interface ReferenceSchema { short: string; relative: string; full: string; } export interface TaskCompletionStatusSchema { count: number; completed_count: number; } export interface MergeRequestDiffSchema extends Record { old_path: string; new_path: string; a_mode: string; b_mode: string; new_file: boolean; renamed_file: boolean; deleted_file: boolean; diff: string; } export interface MergeRequestDiffVersionsSchema extends Record { id: number; head_commit_sha: string; base_commit_sha: string; start_commit_sha: string; created_at: string; merge_request_id: number; state: string; real_size: string; } export interface ExpandedMergeRequestDiffVersionsSchema extends Record { id: number; head_commit_sha: string; base_commit_sha: string; start_commit_sha: string; created_at: string; merge_request_id: number; state: string; real_size: string; commits: CommitSchema[]; diffs: CommitDiffSchema[]; } export interface MergeRequestRebaseSchema extends Record { rebase_in_progress?: boolean; merge_error?: string; } export interface CondensedMergeRequestSchema extends Record { id: number; iid: number; project_id: number; title: string; description: string | null; state: string; created_at: string; updated_at: string; web_url: string; } export interface MergeRequestSchema extends CondensedMergeRequestSchema { merged_by: MappedOmit | null; merged_at: string | null; closed_by: MappedOmit | null; closed_at: string | null; target_branch: string; source_branch: string; user_notes_count: number; upvotes: number; downvotes: number; author: MappedOmit; assignees: MappedOmit[] | null; assignee: MappedOmit | null; reviewers: MappedOmit[] | null; source_project_id: number; target_project_id: number; labels: string[] | SimpleLabelSchema[]; draft: boolean; work_in_progress: boolean; milestone: MilestoneSchema | null; merge_when_pipeline_succeeds: boolean; merge_status: | 'unchecked' | 'checking' | 'can_be_merged' | 'cannot_be_merged' | 'cannot_be_merged_recheck'; detailed_merge_status: | 'blocked_status' | 'broken_status' | 'checking' | 'unchecked' | 'ci_must_pass' | 'ci_still_running' | 'discussions_not_resolved' | 'draft_status' | 'external_status_checks' | 'mergeable' | 'not_approved' | 'not_open' | 'policies_denied' | 'jira_association_missing'; sha: string; merge_commit_sha: string | null; squash_commit_sha: string | null; discussion_locked: boolean | null; should_remove_source_branch: boolean | null; force_remove_source_branch: boolean; reference: string; references: ReferenceSchema; time_stats: TimeStatsSchema; squash: boolean; task_completion_status: TaskCompletionStatusSchema; prepared_at: string | null; has_conflicts: boolean; blocking_discussions_resolved: boolean; approvals_before_merge: number | null; } export interface ExpandedMergeRequestSchema extends MergeRequestSchema { subscribed: boolean; changes_count: string; latest_build_started_at: string | null; latest_build_finished_at: string | null; first_deployed_to_production_at: null; pipeline: PipelineSchema | null; head_pipeline: ExpandedPipelineSchema | null; diff_refs: DiffRefsSchema; merge_error: string | null; first_contribution: boolean; user: { can_merge: boolean; }; rebase_in_progress?: boolean; } export interface MergeRequestSchemaWithExpandedLabels extends MergeRequestSchema { labels: SimpleLabelSchema[]; } export interface MergeRequestSchemaWithBasicLabels extends MergeRequestSchema { labels: string[]; } export interface MergeRequestTodoSchema extends TodoSchema { project: SimpleProjectSchema; target_type: 'MergeRequest'; target: ExpandedMergeRequestSchema; } export interface MergeRequestChangesSchema extends MappedOmit< MergeRequestSchema, 'has_conflicts' | 'blocking_discussions_resolved' | 'approvals_before_merge' > { changes: CommitDiffSchema[]; overflow: boolean; } export interface MergeRequestReviewerSchema extends Record { user: MappedOmit; state: ReviewerState; created_at: string; } // Select method options export type AllMergeRequestsOptions = { approvedByIds?: number[]; approverIds?: number[]; approved?: string; assigneeId?: number | 'Any' | 'None'; authorId?: number; authorUsername?: string; createdAfter?: string; createdBefore?: string; deployedAfter?: string; deployedBefore?: string; environment?: string; iids?: number[]; labels?: string; milestone?: string; myReactionEmoji?: string; not?: { labels?: string | string[]; milestone?: string; authorId?: number; authorUsername?: string; assigneeId?: number; assigneeUsername?: string; reviewerId?: number; reviewerUsername?: string; myReactionEmoji?: string; }; orderBy?: 'created_at' | 'updated_at'; reviewerId?: number | 'Any' | 'None'; reviewerUsername?: string; scope?: 'created_by_me' | 'assigned_to_me' | 'all'; search?: string; sort?: 'asc' | 'desc'; sourceBranch?: string; state?: 'opened' | 'closed' | 'locked' | 'merged'; targetBranch?: string; updatedAfter?: string; updatedBefore?: string; view?: string; withLabelsDetails?: boolean; withMergeStatusRecheck?: boolean; wip?: string; }; export type AcceptMergeRequestOptions = { mergeCommitMessage?: string; squashCommitMessage?: string; squash?: boolean; shouldRemoveSourceBranch?: boolean; /** * @deprecated Use `autoMerge` instead. Deprecated in GitLab 17.11. */ mergeWhenPipelineSucceeds?: boolean; sha?: string; autoMerge?: boolean; }; export type EditMergeRequestOptions = { targetBranch?: string; title?: string; assigneeId?: number; assigneeIds?: number[]; reviewerIds?: number[]; milestoneId?: number; addLabels?: string; labels?: string | Array; removeLabels?: string; description?: string; stateEvent?: string; removeSourceBranch?: boolean; squash?: boolean; squashOnMerge?: boolean; discussionLocked?: boolean; allowCollaboration?: boolean; allowMaintainerToPush?: boolean; }; export type CreateMergeRequestOptions = { targetProjectId?: number; } & Pick< EditMergeRequestOptions, | 'assigneeId' | 'assigneeIds' | 'description' | 'labels' | 'title' | 'milestoneId' | 'reviewerIds' | 'removeSourceBranch' | 'allowCollaboration' | 'allowMaintainerToPush' | 'squash' >; // Export API export class MergeRequests extends BaseResource { // convenience method accept( projectId: string | number, mergerequestIId: number, options?: AcceptMergeRequestOptions & Sudo & ShowExpanded, ): Promise> { return this.merge(projectId, mergerequestIId, options); } addSpentTime( projectId: string | number, mergerequestIId: number, duration: string, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.post()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/add_spent_time`, { duration, ...options, }, ); } all( options: OneOrNoneOf<{ projectId: string | number; groupId: string | number }> & PaginationRequestOptions

& AllMergeRequestsOptions & { withLabelsDetails: true }, ): Promise>; all( options?: OneOrNoneOf<{ projectId: string | number; groupId: string | number }> & PaginationRequestOptions

& AllMergeRequestsOptions & BaseRequestOptions & { withLabelsDetails?: false }, ): Promise>; all( { projectId, groupId, ...options }: AllMergeRequestsOptions & OneOrNoneOf<{ projectId: string | number; groupId: string | number }> & PaginationRequestOptions

& BaseRequestOptions = {} as any, ): Promise> { let prefix = ''; if (projectId) { prefix = endpoint`projects/${projectId}/`; } else if (groupId) { prefix = endpoint`groups/${groupId}/`; } return RequestHelper.get()(this, `${prefix}merge_requests`, options); } allDiffs( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded & PaginationRequestOptions

, ): Promise> { return RequestHelper.get()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/diffs`, options, ); } allCommits( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded & PaginationRequestOptions

, ): Promise> { return RequestHelper.get()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/commits`, options, ); } allDiffVersions( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.get()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/versions`, options, ); } allIssuesClosed( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.get()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/closes_issues`, options, ); } allIssuesRelated( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.get()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/related_issues`, options, ); } allParticipants( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise[], C, E, void>> { return RequestHelper.get[]>()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/participants`, options, ); } allPipelines( projectId: string | number, mergerequestIId: number, options?: PaginationRequestOptions

& Sudo & ShowExpanded, ): Promise> { return RequestHelper.get()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/pipelines`, options, ); } cancelOnPipelineSuccess( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.post()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/cancel_merge_when_pipeline_succeeds`, options, ); } create( projectId: string | number, sourceBranch: string, targetBranch: string, title: string, options?: CreateMergeRequestOptions & Sudo & ShowExpanded, ): Promise> { return RequestHelper.post()( this, endpoint`projects/${projectId}/merge_requests`, { sourceBranch, targetBranch, title, ...options, }, ); } createPipeline( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.post()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/pipelines`, options, ); } createTodo( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.post()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/todo`, options, ); } edit( projectId: string | number, mergerequestIId: number, options?: EditMergeRequestOptions & Sudo & ShowExpanded, ): Promise> { return RequestHelper.put()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}`, options, ); } merge( projectId: string | number, mergerequestIId: number, options?: AcceptMergeRequestOptions & Sudo & ShowExpanded, ): Promise> { return RequestHelper.put()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/merge`, options, ); } mergeToDefault( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.put<{ commit_id: string }>()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/merge_ref`, options, ); } rebase( projectId: string | number, mergerequestIId: number, { skipCI, ...options }: { skipCI?: boolean } & Sudo & ShowExpanded = {}, ): Promise> { return RequestHelper.put()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/rebase`, { ...options, skipCi: skipCI, }, ); } remove( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.del()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}`, options, ); } resetSpentTime( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.post()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/reset_spent_time`, options, ); } resetTimeEstimate( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.post()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/reset_time_estimate`, options, ); } setTimeEstimate( projectId: string | number, mergerequestIId: number, duration: string, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.post()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/time_estimate`, { duration, ...options, }, ); } show( projectId: string | number, mergerequestIId: number, options?: { renderHtml?: boolean; includeDivergedCommitsCount?: boolean; includeRebaseInProgress?: boolean; } & Sudo & ShowExpanded, ): Promise> { return RequestHelper.get()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}`, options, ); } showChanges( projectId: string | number, mergerequestIId: number, options?: { accessRawDiffs?: boolean } & Sudo & ShowExpanded, ): Promise> { process.emitWarning( 'This endpoint was deprecated in GitLab API 15.7 and will be removed in API v5. Please use the "allDiffs" function instead.', 'DeprecationWarning', ); return RequestHelper.get()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/changes`, options, ); } showDiffVersion( projectId: string | number, mergerequestIId: number, versionId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.get()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/versions/${versionId}`, options, ); } showTimeStats( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.get()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/time_stats`, options, ); } subscribe( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.post()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/subscribe`, options, ); } unsubscribe( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.post()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/unsubscribe`, options, ); } showReviewers( projectId: string | number, mergerequestIId: number, options?: Sudo & ShowExpanded, ): Promise> { return RequestHelper.get()( this, endpoint`projects/${projectId}/merge_requests/${mergerequestIId}/reviewers`, options, ); } }