@apiclient.xyz/gitlab 2.4.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.4.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, IGitLabBranch, IGitLabTag, 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,65 @@ 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>;
49
103
  getRepoBranches(projectId: number | string, opts?: IListOptions): Promise<IGitLabBranch[]>;
50
104
  getRepoTags(projectId: number | string, opts?: IListOptions): Promise<IGitLabTag[]>;
51
105
  getProtectedBranches(projectId: number | string): Promise<IGitLabProtectedBranch[]>;
@@ -225,22 +225,124 @@ 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`);
244
346
  }
245
347
  // ---------------------------------------------------------------------------
246
348
  // Repository Branches & Tags
@@ -271,4 +373,4 @@ export class GitLabClient {
271
373
  await this.request('DELETE', `/api/v4/projects/${encodeURIComponent(projectId)}`);
272
374
  }
273
375
  }
274
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2l0bGFiLmNsYXNzZXMuZ2l0bGFiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvZ2l0bGFiLmNsYXNzZXMuZ2l0bGFiY2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0scUJBQXFCLENBQUM7QUFDL0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBZ0I3QyxNQUFNLE9BQU8sWUFBWTtJQUl2QixZQUFZLE9BQWUsRUFBRSxLQUFhO1FBQ3hDLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLENBQUM7SUFFRCw4RUFBOEU7SUFDOUUsZUFBZTtJQUNmLDhFQUE4RTtJQUV0RSxLQUFLLENBQUMsT0FBTyxDQUNuQixNQUF5QyxFQUN6QyxJQUFZLEVBQ1osSUFBVSxFQUNWLGFBQXNDO1FBRXRDLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEVBQUUsQ0FBQztRQUVyQyxJQUFJLE9BQU8sR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUU7YUFDckQsR0FBRyxDQUFDLEdBQUcsQ0FBQzthQUNSLE1BQU0sQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQzthQUNuQyxNQUFNLENBQUMsY0FBYyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFFOUMsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO2dCQUNuRCxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FB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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,21 +79,102 @@ 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
179
  export interface IGitLabBranch {
66
180
  name: string;
@@ -74,12 +188,3 @@ export interface IGitLabTag {
74
188
  id: string;
75
189
  };
76
190
  }
77
- export interface ITestConnectionResult {
78
- ok: boolean;
79
- error?: string;
80
- }
81
- export interface IListOptions {
82
- search?: string;
83
- page?: number;
84
- perPage?: number;
85
- }
@@ -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, IGitLabBranch, IGitLabTag, 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFlaEUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHlCQUF5QixDQUFDIn0=
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.4.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.4.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
  }
@@ -10,9 +10,13 @@ import type {
10
10
  IGitLabBranch,
11
11
  IGitLabTag,
12
12
  IGitLabPipeline,
13
+ IGitLabPipelineVariable,
14
+ IGitLabTestReport,
13
15
  IGitLabJob,
14
16
  ITestConnectionResult,
15
17
  IListOptions,
18
+ IPipelineListOptions,
19
+ IJobListOptions,
16
20
  } from './gitlab.interfaces.js';
17
21
 
18
22
  export class GitLabClient {
@@ -335,22 +339,131 @@ export class GitLabClient {
335
339
  // Pipelines
336
340
  // ---------------------------------------------------------------------------
337
341
 
338
- 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[]> {
339
347
  const page = opts?.page || 1;
340
348
  const perPage = opts?.perPage || 30;
341
- 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>(
342
367
  'GET',
343
- `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines?page=${page}&per_page=${perPage}&order_by=updated_at&sort=desc`,
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,
344
388
  );
345
389
  }
346
390
 
347
- public async getPipelineJobs(projectId: number | string, pipelineId: number): Promise<IGitLabJob[]> {
348
- return this.request<IGitLabJob[]>(
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>(
349
416
  'GET',
350
- `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/jobs`,
417
+ `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/test_report`,
351
418
  );
352
419
  }
353
420
 
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>(
459
+ 'GET',
460
+ `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}`,
461
+ );
462
+ }
463
+
464
+ /**
465
+ * Get a job's raw log (trace) output.
466
+ */
354
467
  public async getJobLog(projectId: number | string, jobId: number): Promise<string> {
355
468
  return this.requestText(
356
469
  'GET',
@@ -358,17 +471,43 @@ export class GitLabClient {
358
471
  );
359
472
  }
360
473
 
361
- public async retryPipeline(projectId: number | string, pipelineId: number): Promise<void> {
362
- 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>(
363
479
  'POST',
364
- `/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`,
365
491
  );
366
492
  }
367
493
 
368
- public async cancelPipeline(projectId: number | string, pipelineId: number): Promise<void> {
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`,
501
+ );
502
+ }
503
+
504
+ /**
505
+ * Erase a job's trace and artifacts.
506
+ */
507
+ public async eraseJob(projectId: number | string, jobId: number): Promise<void> {
369
508
  await this.request(
370
509
  'POST',
371
- `/api/v4/projects/${encodeURIComponent(projectId)}/pipelines/${pipelineId}/cancel`,
510
+ `/api/v4/projects/${encodeURIComponent(projectId)}/jobs/${jobId}/erase`,
372
511
  );
373
512
  }
374
513
 
@@ -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,32 +105,133 @@ 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;
152
+ }
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;
63
188
  }
64
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
 
231
+ // ---------------------------------------------------------------------------
232
+ // Branches & Tags
233
+ // ---------------------------------------------------------------------------
234
+
73
235
  export interface IGitLabBranch {
74
236
  name: string;
75
237
  commit: {
@@ -83,14 +245,3 @@ export interface IGitLabTag {
83
245
  id: string;
84
246
  };
85
247
  }
86
-
87
- export interface ITestConnectionResult {
88
- ok: boolean;
89
- error?: string;
90
- }
91
-
92
- export interface IListOptions {
93
- search?: string;
94
- page?: number;
95
- perPage?: number;
96
- }
package/ts/index.ts CHANGED
@@ -9,8 +9,14 @@ export type {
9
9
  IGitLabTag,
10
10
  IVariableOptions,
11
11
  IGitLabPipeline,
12
+ IGitLabPipelineVariable,
13
+ IGitLabTestReport,
14
+ IGitLabTestSuite,
15
+ IGitLabTestCase,
12
16
  IGitLabJob,
13
17
  ITestConnectionResult,
14
18
  IListOptions,
19
+ IPipelineListOptions,
20
+ IJobListOptions,
15
21
  } from './gitlab.interfaces.js';
16
22
  export { commitinfo } from './00_commitinfo_data.js';