@apiclient.xyz/gitlab 2.3.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@apiclient.xyz/gitlab',
6
- version: '2.3.0',
6
+ version: '2.5.0',
7
7
  description: 'A TypeScript client for the GitLab API, providing easy access to projects, groups, CI/CD variables, and pipelines.'
8
8
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx1QkFBdUI7SUFDN0IsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLG9IQUFvSDtDQUNsSSxDQUFBIn0=
@@ -1,4 +1,4 @@
1
- import type { IGitLabProject, IGitLabGroup, IGitLabVariable, IVariableOptions, IGitLabProtectedBranch, IGitLabPipeline, IGitLabJob, ITestConnectionResult, IListOptions } from './gitlab.interfaces.js';
1
+ import type { IGitLabProject, IGitLabGroup, IGitLabVariable, IVariableOptions, IGitLabProtectedBranch, IGitLabBranch, IGitLabTag, IGitLabPipeline, IGitLabPipelineVariable, IGitLabTestReport, IGitLabJob, ITestConnectionResult, IListOptions, IPipelineListOptions, IJobListOptions } from './gitlab.interfaces.js';
2
2
  export declare class GitLabClient {
3
3
  private baseUrl;
4
4
  private token;
@@ -41,11 +41,67 @@ export declare class GitLabClient {
41
41
  createGroupVariable(groupId: number | string, key: string, value: string, opts?: IVariableOptions): Promise<IGitLabVariable>;
42
42
  updateGroupVariable(groupId: number | string, key: string, value: string, opts?: IVariableOptions): Promise<IGitLabVariable>;
43
43
  deleteGroupVariable(groupId: number | string, key: string): Promise<void>;
44
- getPipelines(projectId: number | string, opts?: IListOptions): Promise<IGitLabPipeline[]>;
45
- getPipelineJobs(projectId: number | string, pipelineId: number): Promise<IGitLabJob[]>;
44
+ /**
45
+ * List pipelines for a project with optional filters.
46
+ * Supports status, ref, source, scope, username, date range, ordering.
47
+ */
48
+ getPipelines(projectId: number | string, opts?: IPipelineListOptions): Promise<IGitLabPipeline[]>;
49
+ /**
50
+ * Get a single pipeline's full details.
51
+ */
52
+ getPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline>;
53
+ /**
54
+ * Trigger a new pipeline on the given ref, optionally with variables.
55
+ */
56
+ triggerPipeline(projectId: number | string, ref: string, variables?: {
57
+ key: string;
58
+ value: string;
59
+ variable_type?: string;
60
+ }[]): Promise<IGitLabPipeline>;
61
+ /**
62
+ * Delete a pipeline and all its jobs.
63
+ */
64
+ deletePipeline(projectId: number | string, pipelineId: number): Promise<void>;
65
+ /**
66
+ * Get variables used in a specific pipeline run.
67
+ */
68
+ getPipelineVariables(projectId: number | string, pipelineId: number): Promise<IGitLabPipelineVariable[]>;
69
+ /**
70
+ * Get the test report for a pipeline.
71
+ */
72
+ getPipelineTestReport(projectId: number | string, pipelineId: number): Promise<IGitLabTestReport>;
73
+ retryPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline>;
74
+ cancelPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline>;
75
+ /**
76
+ * List jobs for a pipeline with optional scope filter and pagination.
77
+ */
78
+ getPipelineJobs(projectId: number | string, pipelineId: number, opts?: IJobListOptions): Promise<IGitLabJob[]>;
79
+ /**
80
+ * Get a single job's full details.
81
+ */
82
+ getJob(projectId: number | string, jobId: number): Promise<IGitLabJob>;
83
+ /**
84
+ * Get a job's raw log (trace) output.
85
+ */
46
86
  getJobLog(projectId: number | string, jobId: number): Promise<string>;
47
- retryPipeline(projectId: number | string, pipelineId: number): Promise<void>;
48
- cancelPipeline(projectId: number | string, pipelineId: number): Promise<void>;
87
+ /**
88
+ * Retry a single job.
89
+ */
90
+ retryJob(projectId: number | string, jobId: number): Promise<IGitLabJob>;
91
+ /**
92
+ * Cancel a running job.
93
+ */
94
+ cancelJob(projectId: number | string, jobId: number): Promise<IGitLabJob>;
95
+ /**
96
+ * Trigger a manual job (play action).
97
+ */
98
+ playJob(projectId: number | string, jobId: number): Promise<IGitLabJob>;
99
+ /**
100
+ * Erase a job's trace and artifacts.
101
+ */
102
+ eraseJob(projectId: number | string, jobId: number): Promise<void>;
103
+ getRepoBranches(projectId: number | string, opts?: IListOptions): Promise<IGitLabBranch[]>;
104
+ getRepoTags(projectId: number | string, opts?: IListOptions): Promise<IGitLabTag[]>;
49
105
  getProtectedBranches(projectId: number | string): Promise<IGitLabProtectedBranch[]>;
50
106
  unprotectBranch(projectId: number | string, branchName: string): Promise<void>;
51
107
  deleteProject(projectId: number | string): Promise<void>;
@@ -225,22 +225,137 @@ export class GitLabClient {
225
225
  // ---------------------------------------------------------------------------
226
226
  // Pipelines
227
227
  // ---------------------------------------------------------------------------
228
+ /**
229
+ * List pipelines for a project with optional filters.
230
+ * Supports status, ref, source, scope, username, date range, ordering.
231
+ */
228
232
  async getPipelines(projectId, opts) {
229
233
  const page = opts?.page || 1;
230
234
  const perPage = opts?.perPage || 30;
231
- return this.request('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines?page=${page}&per_page=${perPage}&order_by=updated_at&sort=desc`);
235
+ const orderBy = opts?.orderBy || 'updated_at';
236
+ const sort = opts?.sort || 'desc';
237
+ let url = `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines?page=${page}&per_page=${perPage}&order_by=${orderBy}&sort=${sort}`;
238
+ if (opts?.status)
239
+ url += `&status=${encodeURIComponent(opts.status)}`;
240
+ if (opts?.ref)
241
+ url += `&ref=${encodeURIComponent(opts.ref)}`;
242
+ if (opts?.source)
243
+ url += `&source=${encodeURIComponent(opts.source)}`;
244
+ if (opts?.scope)
245
+ url += `&scope=${encodeURIComponent(opts.scope)}`;
246
+ if (opts?.username)
247
+ url += `&username=${encodeURIComponent(opts.username)}`;
248
+ if (opts?.updatedAfter)
249
+ url += `&updated_after=${encodeURIComponent(opts.updatedAfter)}`;
250
+ if (opts?.updatedBefore)
251
+ url += `&updated_before=${encodeURIComponent(opts.updatedBefore)}`;
252
+ return this.request('GET', url);
232
253
  }
233
- async getPipelineJobs(projectId, pipelineId) {
234
- return this.request('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/jobs`);
254
+ /**
255
+ * Get a single pipeline's full details.
256
+ */
257
+ async getPipeline(projectId, pipelineId) {
258
+ return this.request('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}`);
235
259
  }
236
- async getJobLog(projectId, jobId) {
237
- return this.requestText('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/trace`);
260
+ /**
261
+ * Trigger a new pipeline on the given ref, optionally with variables.
262
+ */
263
+ async triggerPipeline(projectId, ref, variables) {
264
+ const body = { ref };
265
+ if (variables && variables.length > 0) {
266
+ body.variables = variables;
267
+ }
268
+ return this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/pipeline`, body);
269
+ }
270
+ /**
271
+ * Delete a pipeline and all its jobs.
272
+ */
273
+ async deletePipeline(projectId, pipelineId) {
274
+ await this.request('DELETE', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}`);
275
+ }
276
+ /**
277
+ * Get variables used in a specific pipeline run.
278
+ */
279
+ async getPipelineVariables(projectId, pipelineId) {
280
+ return this.request('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/variables`);
281
+ }
282
+ /**
283
+ * Get the test report for a pipeline.
284
+ */
285
+ async getPipelineTestReport(projectId, pipelineId) {
286
+ return this.request('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/test_report`);
238
287
  }
239
288
  async retryPipeline(projectId, pipelineId) {
240
- await this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/retry`);
289
+ return this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/retry`);
241
290
  }
242
291
  async cancelPipeline(projectId, pipelineId) {
243
- await this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/cancel`);
292
+ return this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/cancel`);
293
+ }
294
+ // ---------------------------------------------------------------------------
295
+ // Jobs
296
+ // ---------------------------------------------------------------------------
297
+ /**
298
+ * List jobs for a pipeline with optional scope filter and pagination.
299
+ */
300
+ async getPipelineJobs(projectId, pipelineId, opts) {
301
+ const page = opts?.page || 1;
302
+ const perPage = opts?.perPage || 100;
303
+ let url = `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/jobs?page=${page}&per_page=${perPage}`;
304
+ if (opts?.scope && opts.scope.length > 0) {
305
+ for (const s of opts.scope) {
306
+ url += `&scope[]=${encodeURIComponent(s)}`;
307
+ }
308
+ }
309
+ return this.request('GET', url);
310
+ }
311
+ /**
312
+ * Get a single job's full details.
313
+ */
314
+ async getJob(projectId, jobId) {
315
+ return this.request('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}`);
316
+ }
317
+ /**
318
+ * Get a job's raw log (trace) output.
319
+ */
320
+ async getJobLog(projectId, jobId) {
321
+ return this.requestText('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/trace`);
322
+ }
323
+ /**
324
+ * Retry a single job.
325
+ */
326
+ async retryJob(projectId, jobId) {
327
+ return this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/retry`);
328
+ }
329
+ /**
330
+ * Cancel a running job.
331
+ */
332
+ async cancelJob(projectId, jobId) {
333
+ return this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/cancel`);
334
+ }
335
+ /**
336
+ * Trigger a manual job (play action).
337
+ */
338
+ async playJob(projectId, jobId) {
339
+ return this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/play`);
340
+ }
341
+ /**
342
+ * Erase a job's trace and artifacts.
343
+ */
344
+ async eraseJob(projectId, jobId) {
345
+ await this.request('POST', `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/erase`);
346
+ }
347
+ // ---------------------------------------------------------------------------
348
+ // Repository Branches & Tags
349
+ // ---------------------------------------------------------------------------
350
+ async getRepoBranches(projectId, opts) {
351
+ const page = opts?.page || 1;
352
+ const perPage = opts?.perPage || 50;
353
+ return this.request('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/repository/branches?page=${page}&per_page=${perPage}`);
354
+ }
355
+ async getRepoTags(projectId, opts) {
356
+ const page = opts?.page || 1;
357
+ const perPage = opts?.perPage || 50;
358
+ return this.request('GET', `/api/v4/projects/${encodeURIComponent(projectId)}/repository/tags?page=${page}&per_page=${perPage}`);
244
359
  }
245
360
  // ---------------------------------------------------------------------------
246
361
  // Protected Branches
@@ -258,4 +373,4 @@ export class GitLabClient {
258
373
  await this.request('DELETE', `/api/v4/projects/${encodeURIComponent(projectId)}`);
259
374
  }
260
375
  }
261
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0bGFiLmNsYXNzZXMuZ2l0bGFiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZ2l0bGFiLmNsYXNzZXMuZ2l0bGFiY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBYzdDLE1BQU0sT0FBTyxZQUFZO0lBSXZCLFlBQVksT0FBZSxFQUFFLEtBQWE7UUFDeEMsbUNBQW1DO1FBQ25DLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELDhFQUE4RTtJQUM5RSxlQUFlO0lBQ2YsOEVBQThFO0lBRXRFLEtBQUssQ0FBQyxPQUFPLENBQ25CLE1BQXlDLEVBQ3pDLElBQVksRUFDWixJQUFVLEVBQ1YsYUFBc0M7UUFFdEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksRUFBRSxDQUFDO1FBRXJDLElBQUksT0FBTyxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTthQUNyRCxHQUFHLENBQUMsR0FBRyxDQUFDO2FBQ1IsTUFBTSxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDO2FBQ25DLE1BQU0sQ0FBQyxjQUFjLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUU5QyxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2xCLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFD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
376
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0bGFiLmNsYXNzZXMuZ2l0bGFiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZ2l0bGFiLmNsYXNzZXMuZ2l0bGFiY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBb0I3QyxNQUFNLE9BQU8sWUFBWTtJQUl2QixZQUFZLE9BQWUsRUFBRSxLQUFhO1FBQ3hDLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsZUFBZTtJQUNmLDhFQUE4RTtJQUV0RSxLQUFLLENBQUMsT0FBTyxDQUNuQixNQUF5QyxFQUN6QyxJQUFZLEVBQ1osSUFBVSxFQUNWLGFBQXNDO1FBRXRDLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUVyQyxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7YUFDckQsR0FBRyxDQUFDLEdBQUcsQ0FBQzthQUNSLE1BQU0sQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNuQyxNQUFNLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFOUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FB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
@@ -1,3 +1,36 @@
1
+ export interface ITestConnectionResult {
2
+ ok: boolean;
3
+ error?: string;
4
+ }
5
+ export interface IListOptions {
6
+ search?: string;
7
+ page?: number;
8
+ perPage?: number;
9
+ }
10
+ export interface IPipelineListOptions extends IListOptions {
11
+ /** Filter by pipeline status */
12
+ status?: string;
13
+ /** Filter by branch or tag ref */
14
+ ref?: string;
15
+ /** Filter by trigger source (push, web, trigger, schedule, api, external, pipeline, chat, merge_request_event, …) */
16
+ source?: string;
17
+ /** Filter by scope (running, pending, finished, branches, tags) */
18
+ scope?: string;
19
+ /** Filter by the user who triggered the pipeline */
20
+ username?: string;
21
+ /** Return pipelines updated after this ISO 8601 date */
22
+ updatedAfter?: string;
23
+ /** Return pipelines updated before this ISO 8601 date */
24
+ updatedBefore?: string;
25
+ /** Order by field (id, status, ref, updated_at, user_id). Default: id */
26
+ orderBy?: string;
27
+ /** Sort direction (asc, desc). Default: desc */
28
+ sort?: string;
29
+ }
30
+ export interface IJobListOptions extends IListOptions {
31
+ /** Filter by job scope(s) */
32
+ scope?: string[];
33
+ }
1
34
  export interface IGitLabUser {
2
35
  id: number;
3
36
  username: string;
@@ -46,28 +79,112 @@ export interface IGitLabProtectedBranch {
46
79
  }
47
80
  export interface IGitLabPipeline {
48
81
  id: number;
82
+ iid: number;
49
83
  project_id: number;
50
84
  status: string;
51
85
  ref: string;
52
86
  sha: string;
87
+ before_sha: string;
88
+ tag: boolean;
53
89
  web_url: string;
54
90
  duration: number;
91
+ queued_duration: number;
55
92
  created_at: string;
93
+ updated_at: string;
94
+ started_at: string;
95
+ finished_at: string;
56
96
  source: string;
97
+ coverage: string;
98
+ user: IGitLabUser;
99
+ detailed_status: {
100
+ icon: string;
101
+ text: string;
102
+ label: string;
103
+ group: string;
104
+ tooltip: string;
105
+ has_details: boolean;
106
+ details_path: string;
107
+ favicon: string;
108
+ };
109
+ yaml_errors: string;
110
+ }
111
+ export interface IGitLabPipelineVariable {
112
+ key: string;
113
+ value: string;
114
+ variable_type: string;
115
+ }
116
+ export interface IGitLabTestReport {
117
+ total_time: number;
118
+ total_count: number;
119
+ success_count: number;
120
+ failed_count: number;
121
+ skipped_count: number;
122
+ error_count: number;
123
+ test_suites: IGitLabTestSuite[];
124
+ }
125
+ export interface IGitLabTestSuite {
126
+ name: string;
127
+ total_time: number;
128
+ total_count: number;
129
+ success_count: number;
130
+ failed_count: number;
131
+ skipped_count: number;
132
+ error_count: number;
133
+ test_cases: IGitLabTestCase[];
134
+ }
135
+ export interface IGitLabTestCase {
136
+ status: string;
137
+ name: string;
138
+ classname: string;
139
+ execution_time: number;
140
+ system_output: string;
141
+ stack_trace: string;
57
142
  }
58
143
  export interface IGitLabJob {
59
144
  id: number;
60
145
  name: string;
61
146
  stage: string;
62
147
  status: string;
148
+ ref: string;
149
+ tag: boolean;
150
+ web_url: string;
151
+ created_at: string;
152
+ started_at: string;
153
+ finished_at: string;
63
154
  duration: number;
155
+ queued_duration: number;
156
+ coverage: number;
157
+ allow_failure: boolean;
158
+ failure_reason: string;
159
+ pipeline: {
160
+ id: number;
161
+ project_id: number;
162
+ ref: string;
163
+ sha: string;
164
+ status: string;
165
+ };
166
+ user: IGitLabUser;
167
+ runner: {
168
+ id: number;
169
+ description: string;
170
+ active: boolean;
171
+ is_shared: boolean;
172
+ };
173
+ artifacts: {
174
+ filename: string;
175
+ size: number;
176
+ }[];
177
+ artifacts_expire_at: string;
64
178
  }
65
- export interface ITestConnectionResult {
66
- ok: boolean;
67
- error?: string;
179
+ export interface IGitLabBranch {
180
+ name: string;
181
+ commit: {
182
+ id: string;
183
+ };
68
184
  }
69
- export interface IListOptions {
70
- search?: string;
71
- page?: number;
72
- perPage?: number;
185
+ export interface IGitLabTag {
186
+ name: string;
187
+ commit: {
188
+ id: string;
189
+ };
73
190
  }
@@ -1,2 +1,5 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Common
3
+ // ---------------------------------------------------------------------------
1
4
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0bGFiLmludGVyZmFjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9naXRsYWIuaW50ZXJmYWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0bGFiLmludGVyZmFjZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9naXRsYWIuaW50ZXJmYWNlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw4RUFBOEU7QUFDOUUsU0FBUztBQUNULDhFQUE4RSJ9
@@ -1,3 +1,3 @@
1
1
  export { GitLabClient } from './gitlab.classes.gitlabclient.js';
2
- export type { IGitLabUser, IGitLabProject, IGitLabGroup, IGitLabVariable, IGitLabProtectedBranch, IVariableOptions, IGitLabPipeline, IGitLabJob, ITestConnectionResult, IListOptions, } from './gitlab.interfaces.js';
2
+ export type { IGitLabUser, IGitLabProject, IGitLabGroup, IGitLabVariable, IGitLabProtectedBranch, IGitLabBranch, IGitLabTag, IVariableOptions, IGitLabPipeline, IGitLabPipelineVariable, IGitLabTestReport, IGitLabTestSuite, IGitLabTestCase, IGitLabJob, ITestConnectionResult, IListOptions, IPipelineListOptions, IJobListOptions, } from './gitlab.interfaces.js';
3
3
  export { commitinfo } from './00_commitinfo_data.js';
package/dist_ts/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  export { GitLabClient } from './gitlab.classes.gitlabclient.js';
2
2
  export { commitinfo } from './00_commitinfo_data.js';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFhaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDIn0=
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFxQmhFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQyJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apiclient.xyz/gitlab",
3
- "version": "2.3.0",
3
+ "version": "2.5.0",
4
4
  "private": false,
5
5
  "description": "A TypeScript client for the GitLab API, providing easy access to projects, groups, CI/CD variables, and pipelines.",
6
6
  "main": "dist_ts/index.js",
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@apiclient.xyz/gitlab',
6
- version: '2.3.0',
6
+ version: '2.5.0',
7
7
  description: 'A TypeScript client for the GitLab API, providing easy access to projects, groups, CI/CD variables, and pipelines.'
8
8
  }
@@ -7,10 +7,16 @@ import type {
7
7
  IGitLabVariable,
8
8
  IVariableOptions,
9
9
  IGitLabProtectedBranch,
10
+ IGitLabBranch,
11
+ IGitLabTag,
10
12
  IGitLabPipeline,
13
+ IGitLabPipelineVariable,
14
+ IGitLabTestReport,
11
15
  IGitLabJob,
12
16
  ITestConnectionResult,
13
17
  IListOptions,
18
+ IPipelineListOptions,
19
+ IJobListOptions,
14
20
  } from './gitlab.interfaces.js';
15
21
 
16
22
  export class GitLabClient {
@@ -333,22 +339,131 @@ export class GitLabClient {
333
339
  // Pipelines
334
340
  // ---------------------------------------------------------------------------
335
341
 
336
- public async getPipelines(projectId: number | string, opts?: IListOptions): Promise<IGitLabPipeline[]> {
342
+ /**
343
+ * List pipelines for a project with optional filters.
344
+ * Supports status, ref, source, scope, username, date range, ordering.
345
+ */
346
+ public async getPipelines(projectId: number | string, opts?: IPipelineListOptions): Promise<IGitLabPipeline[]> {
337
347
  const page = opts?.page || 1;
338
348
  const perPage = opts?.perPage || 30;
339
- return this.request<IGitLabPipeline[]>(
349
+ const orderBy = opts?.orderBy || 'updated_at';
350
+ const sort = opts?.sort || 'desc';
351
+ let url = `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines?page=${page}&per_page=${perPage}&order_by=${orderBy}&sort=${sort}`;
352
+ if (opts?.status) url += `&status=${encodeURIComponent(opts.status)}`;
353
+ if (opts?.ref) url += `&ref=${encodeURIComponent(opts.ref)}`;
354
+ if (opts?.source) url += `&source=${encodeURIComponent(opts.source)}`;
355
+ if (opts?.scope) url += `&scope=${encodeURIComponent(opts.scope)}`;
356
+ if (opts?.username) url += `&username=${encodeURIComponent(opts.username)}`;
357
+ if (opts?.updatedAfter) url += `&updated_after=${encodeURIComponent(opts.updatedAfter)}`;
358
+ if (opts?.updatedBefore) url += `&updated_before=${encodeURIComponent(opts.updatedBefore)}`;
359
+ return this.request<IGitLabPipeline[]>('GET', url);
360
+ }
361
+
362
+ /**
363
+ * Get a single pipeline's full details.
364
+ */
365
+ public async getPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline> {
366
+ return this.request<IGitLabPipeline>(
367
+ 'GET',
368
+ `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}`,
369
+ );
370
+ }
371
+
372
+ /**
373
+ * Trigger a new pipeline on the given ref, optionally with variables.
374
+ */
375
+ public async triggerPipeline(
376
+ projectId: number | string,
377
+ ref: string,
378
+ variables?: { key: string; value: string; variable_type?: string }[],
379
+ ): Promise<IGitLabPipeline> {
380
+ const body: any = { ref };
381
+ if (variables && variables.length > 0) {
382
+ body.variables = variables;
383
+ }
384
+ return this.request<IGitLabPipeline>(
385
+ 'POST',
386
+ `/api/v4/projects/${encodeURIComponent(projectId)}/pipeline`,
387
+ body,
388
+ );
389
+ }
390
+
391
+ /**
392
+ * Delete a pipeline and all its jobs.
393
+ */
394
+ public async deletePipeline(projectId: number | string, pipelineId: number): Promise<void> {
395
+ await this.request(
396
+ 'DELETE',
397
+ `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}`,
398
+ );
399
+ }
400
+
401
+ /**
402
+ * Get variables used in a specific pipeline run.
403
+ */
404
+ public async getPipelineVariables(projectId: number | string, pipelineId: number): Promise<IGitLabPipelineVariable[]> {
405
+ return this.request<IGitLabPipelineVariable[]>(
406
+ 'GET',
407
+ `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/variables`,
408
+ );
409
+ }
410
+
411
+ /**
412
+ * Get the test report for a pipeline.
413
+ */
414
+ public async getPipelineTestReport(projectId: number | string, pipelineId: number): Promise<IGitLabTestReport> {
415
+ return this.request<IGitLabTestReport>(
340
416
  'GET',
341
- `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines?page=${page}&per_page=${perPage}&order_by=updated_at&sort=desc`,
417
+ `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/test_report`,
342
418
  );
343
419
  }
344
420
 
345
- public async getPipelineJobs(projectId: number | string, pipelineId: number): Promise<IGitLabJob[]> {
346
- return this.request<IGitLabJob[]>(
421
+ public async retryPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline> {
422
+ return this.request<IGitLabPipeline>(
423
+ 'POST',
424
+ `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/retry`,
425
+ );
426
+ }
427
+
428
+ public async cancelPipeline(projectId: number | string, pipelineId: number): Promise<IGitLabPipeline> {
429
+ return this.request<IGitLabPipeline>(
430
+ 'POST',
431
+ `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/cancel`,
432
+ );
433
+ }
434
+
435
+ // ---------------------------------------------------------------------------
436
+ // Jobs
437
+ // ---------------------------------------------------------------------------
438
+
439
+ /**
440
+ * List jobs for a pipeline with optional scope filter and pagination.
441
+ */
442
+ public async getPipelineJobs(projectId: number | string, pipelineId: number, opts?: IJobListOptions): Promise<IGitLabJob[]> {
443
+ const page = opts?.page || 1;
444
+ const perPage = opts?.perPage || 100;
445
+ let url = `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/jobs?page=${page}&per_page=${perPage}`;
446
+ if (opts?.scope && opts.scope.length > 0) {
447
+ for (const s of opts.scope) {
448
+ url += `&scope[]=${encodeURIComponent(s)}`;
449
+ }
450
+ }
451
+ return this.request<IGitLabJob[]>('GET', url);
452
+ }
453
+
454
+ /**
455
+ * Get a single job's full details.
456
+ */
457
+ public async getJob(projectId: number | string, jobId: number): Promise<IGitLabJob> {
458
+ return this.request<IGitLabJob>(
347
459
  'GET',
348
- `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/jobs`,
460
+ `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}`,
349
461
  );
350
462
  }
351
463
 
464
+ /**
465
+ * Get a job's raw log (trace) output.
466
+ */
352
467
  public async getJobLog(projectId: number | string, jobId: number): Promise<string> {
353
468
  return this.requestText(
354
469
  'GET',
@@ -356,17 +471,65 @@ export class GitLabClient {
356
471
  );
357
472
  }
358
473
 
359
- public async retryPipeline(projectId: number | string, pipelineId: number): Promise<void> {
360
- await this.request(
474
+ /**
475
+ * Retry a single job.
476
+ */
477
+ public async retryJob(projectId: number | string, jobId: number): Promise<IGitLabJob> {
478
+ return this.request<IGitLabJob>(
361
479
  'POST',
362
- `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/retry`,
480
+ `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/retry`,
481
+ );
482
+ }
483
+
484
+ /**
485
+ * Cancel a running job.
486
+ */
487
+ public async cancelJob(projectId: number | string, jobId: number): Promise<IGitLabJob> {
488
+ return this.request<IGitLabJob>(
489
+ 'POST',
490
+ `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/cancel`,
491
+ );
492
+ }
493
+
494
+ /**
495
+ * Trigger a manual job (play action).
496
+ */
497
+ public async playJob(projectId: number | string, jobId: number): Promise<IGitLabJob> {
498
+ return this.request<IGitLabJob>(
499
+ 'POST',
500
+ `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/play`,
363
501
  );
364
502
  }
365
503
 
366
- public async cancelPipeline(projectId: number | string, pipelineId: number): Promise<void> {
504
+ /**
505
+ * Erase a job's trace and artifacts.
506
+ */
507
+ public async eraseJob(projectId: number | string, jobId: number): Promise<void> {
367
508
  await this.request(
368
509
  'POST',
369
- `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/cancel`,
510
+ `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/erase`,
511
+ );
512
+ }
513
+
514
+ // ---------------------------------------------------------------------------
515
+ // Repository Branches & Tags
516
+ // ---------------------------------------------------------------------------
517
+
518
+ public async getRepoBranches(projectId: number | string, opts?: IListOptions): Promise<IGitLabBranch[]> {
519
+ const page = opts?.page || 1;
520
+ const perPage = opts?.perPage || 50;
521
+ return this.request<IGitLabBranch[]>(
522
+ 'GET',
523
+ `/api/v4/projects/${encodeURIComponent(projectId)}/repository/branches?page=${page}&per_page=${perPage}`,
524
+ );
525
+ }
526
+
527
+ public async getRepoTags(projectId: number | string, opts?: IListOptions): Promise<IGitLabTag[]> {
528
+ const page = opts?.page || 1;
529
+ const perPage = opts?.perPage || 50;
530
+ return this.request<IGitLabTag[]>(
531
+ 'GET',
532
+ `/api/v4/projects/${encodeURIComponent(projectId)}/repository/tags?page=${page}&per_page=${perPage}`,
370
533
  );
371
534
  }
372
535
 
@@ -1,3 +1,52 @@
1
+ // ---------------------------------------------------------------------------
2
+ // Common
3
+ // ---------------------------------------------------------------------------
4
+
5
+ export interface ITestConnectionResult {
6
+ ok: boolean;
7
+ error?: string;
8
+ }
9
+
10
+ export interface IListOptions {
11
+ search?: string;
12
+ page?: number;
13
+ perPage?: number;
14
+ }
15
+
16
+ // ---------------------------------------------------------------------------
17
+ // Pipeline / Job list options
18
+ // ---------------------------------------------------------------------------
19
+
20
+ export interface IPipelineListOptions extends IListOptions {
21
+ /** Filter by pipeline status */
22
+ status?: string;
23
+ /** Filter by branch or tag ref */
24
+ ref?: string;
25
+ /** Filter by trigger source (push, web, trigger, schedule, api, external, pipeline, chat, merge_request_event, …) */
26
+ source?: string;
27
+ /** Filter by scope (running, pending, finished, branches, tags) */
28
+ scope?: string;
29
+ /** Filter by the user who triggered the pipeline */
30
+ username?: string;
31
+ /** Return pipelines updated after this ISO 8601 date */
32
+ updatedAfter?: string;
33
+ /** Return pipelines updated before this ISO 8601 date */
34
+ updatedBefore?: string;
35
+ /** Order by field (id, status, ref, updated_at, user_id). Default: id */
36
+ orderBy?: string;
37
+ /** Sort direction (asc, desc). Default: desc */
38
+ sort?: string;
39
+ }
40
+
41
+ export interface IJobListOptions extends IListOptions {
42
+ /** Filter by job scope(s) */
43
+ scope?: string[];
44
+ }
45
+
46
+ // ---------------------------------------------------------------------------
47
+ // Users
48
+ // ---------------------------------------------------------------------------
49
+
1
50
  export interface IGitLabUser {
2
51
  id: number;
3
52
  username: string;
@@ -8,6 +57,10 @@ export interface IGitLabUser {
8
57
  state: string;
9
58
  }
10
59
 
60
+ // ---------------------------------------------------------------------------
61
+ // Projects
62
+ // ---------------------------------------------------------------------------
63
+
11
64
  export interface IGitLabProject {
12
65
  id: number;
13
66
  name: string;
@@ -20,6 +73,10 @@ export interface IGitLabProject {
20
73
  last_activity_at: string;
21
74
  }
22
75
 
76
+ // ---------------------------------------------------------------------------
77
+ // Groups
78
+ // ---------------------------------------------------------------------------
79
+
23
80
  export interface IGitLabGroup {
24
81
  id: number;
25
82
  name: string;
@@ -29,6 +86,10 @@ export interface IGitLabGroup {
29
86
  visibility: string;
30
87
  }
31
88
 
89
+ // ---------------------------------------------------------------------------
90
+ // Variables
91
+ // ---------------------------------------------------------------------------
92
+
32
93
  export interface IGitLabVariable {
33
94
  key: string;
34
95
  value: string;
@@ -44,39 +105,143 @@ export interface IVariableOptions {
44
105
  environment_scope?: string;
45
106
  }
46
107
 
108
+ // ---------------------------------------------------------------------------
109
+ // Protected Branches
110
+ // ---------------------------------------------------------------------------
111
+
47
112
  export interface IGitLabProtectedBranch {
48
113
  id: number;
49
114
  name: string;
50
115
  allow_force_push: boolean;
51
116
  }
52
117
 
118
+ // ---------------------------------------------------------------------------
119
+ // Pipelines
120
+ // ---------------------------------------------------------------------------
121
+
53
122
  export interface IGitLabPipeline {
54
123
  id: number;
124
+ iid: number;
55
125
  project_id: number;
56
126
  status: string;
57
127
  ref: string;
58
128
  sha: string;
129
+ before_sha: string;
130
+ tag: boolean;
59
131
  web_url: string;
60
132
  duration: number;
133
+ queued_duration: number;
61
134
  created_at: string;
135
+ updated_at: string;
136
+ started_at: string;
137
+ finished_at: string;
62
138
  source: string;
139
+ coverage: string;
140
+ user: IGitLabUser;
141
+ detailed_status: {
142
+ icon: string;
143
+ text: string;
144
+ label: string;
145
+ group: string;
146
+ tooltip: string;
147
+ has_details: boolean;
148
+ details_path: string;
149
+ favicon: string;
150
+ };
151
+ yaml_errors: string;
63
152
  }
64
153
 
154
+ export interface IGitLabPipelineVariable {
155
+ key: string;
156
+ value: string;
157
+ variable_type: string;
158
+ }
159
+
160
+ export interface IGitLabTestReport {
161
+ total_time: number;
162
+ total_count: number;
163
+ success_count: number;
164
+ failed_count: number;
165
+ skipped_count: number;
166
+ error_count: number;
167
+ test_suites: IGitLabTestSuite[];
168
+ }
169
+
170
+ export interface IGitLabTestSuite {
171
+ name: string;
172
+ total_time: number;
173
+ total_count: number;
174
+ success_count: number;
175
+ failed_count: number;
176
+ skipped_count: number;
177
+ error_count: number;
178
+ test_cases: IGitLabTestCase[];
179
+ }
180
+
181
+ export interface IGitLabTestCase {
182
+ status: string;
183
+ name: string;
184
+ classname: string;
185
+ execution_time: number;
186
+ system_output: string;
187
+ stack_trace: string;
188
+ }
189
+
190
+ // ---------------------------------------------------------------------------
191
+ // Jobs
192
+ // ---------------------------------------------------------------------------
193
+
65
194
  export interface IGitLabJob {
66
195
  id: number;
67
196
  name: string;
68
197
  stage: string;
69
198
  status: string;
199
+ ref: string;
200
+ tag: boolean;
201
+ web_url: string;
202
+ created_at: string;
203
+ started_at: string;
204
+ finished_at: string;
70
205
  duration: number;
206
+ queued_duration: number;
207
+ coverage: number;
208
+ allow_failure: boolean;
209
+ failure_reason: string;
210
+ pipeline: {
211
+ id: number;
212
+ project_id: number;
213
+ ref: string;
214
+ sha: string;
215
+ status: string;
216
+ };
217
+ user: IGitLabUser;
218
+ runner: {
219
+ id: number;
220
+ description: string;
221
+ active: boolean;
222
+ is_shared: boolean;
223
+ };
224
+ artifacts: {
225
+ filename: string;
226
+ size: number;
227
+ }[];
228
+ artifacts_expire_at: string;
71
229
  }
72
230
 
73
- export interface ITestConnectionResult {
74
- ok: boolean;
75
- error?: string;
231
+ // ---------------------------------------------------------------------------
232
+ // Branches & Tags
233
+ // ---------------------------------------------------------------------------
234
+
235
+ export interface IGitLabBranch {
236
+ name: string;
237
+ commit: {
238
+ id: string;
239
+ };
76
240
  }
77
241
 
78
- export interface IListOptions {
79
- search?: string;
80
- page?: number;
81
- perPage?: number;
242
+ export interface IGitLabTag {
243
+ name: string;
244
+ commit: {
245
+ id: string;
246
+ };
82
247
  }
package/ts/index.ts CHANGED
@@ -5,10 +5,18 @@ export type {
5
5
  IGitLabGroup,
6
6
  IGitLabVariable,
7
7
  IGitLabProtectedBranch,
8
+ IGitLabBranch,
9
+ IGitLabTag,
8
10
  IVariableOptions,
9
11
  IGitLabPipeline,
12
+ IGitLabPipelineVariable,
13
+ IGitLabTestReport,
14
+ IGitLabTestSuite,
15
+ IGitLabTestCase,
10
16
  IGitLabJob,
11
17
  ITestConnectionResult,
12
18
  IListOptions,
19
+ IPipelineListOptions,
20
+ IJobListOptions,
13
21
  } from './gitlab.interfaces.js';
14
22
  export { commitinfo } from './00_commitinfo_data.js';