cyrus-gitlab-event-transport 0.2.38
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.
- package/LICENSE +201 -0
- package/dist/GitLabCommentService.d.ts +89 -0
- package/dist/GitLabCommentService.d.ts.map +1 -0
- package/dist/GitLabCommentService.js +78 -0
- package/dist/GitLabCommentService.js.map +1 -0
- package/dist/GitLabEventTransport.d.ts +63 -0
- package/dist/GitLabEventTransport.d.ts.map +1 -0
- package/dist/GitLabEventTransport.js +175 -0
- package/dist/GitLabEventTransport.js.map +1 -0
- package/dist/GitLabMessageTranslator.d.ts +69 -0
- package/dist/GitLabMessageTranslator.d.ts.map +1 -0
- package/dist/GitLabMessageTranslator.js +274 -0
- package/dist/GitLabMessageTranslator.js.map +1 -0
- package/dist/gitlab-webhook-utils.d.ts +74 -0
- package/dist/gitlab-webhook-utils.d.ts.map +1 -0
- package/dist/gitlab-webhook-utils.js +157 -0
- package/dist/gitlab-webhook-utils.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +169 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitLab Message Translator
|
|
3
|
+
*
|
|
4
|
+
* Translates GitLab webhook events into unified internal messages for the
|
|
5
|
+
* internal message bus.
|
|
6
|
+
*
|
|
7
|
+
* @module gitlab-event-transport/GitLabMessageTranslator
|
|
8
|
+
*/
|
|
9
|
+
import type { IMessageTranslator, TranslationContext, TranslationResult } from "cyrus-core";
|
|
10
|
+
import type { GitLabWebhookEvent } from "./types.js";
|
|
11
|
+
/**
|
|
12
|
+
* Translates GitLab webhook events into internal messages.
|
|
13
|
+
*
|
|
14
|
+
* Note: GitLab webhooks can result in either:
|
|
15
|
+
* - SessionStartMessage: First mention/comment that starts a session
|
|
16
|
+
* - UserPromptMessage: Follow-up comments in an existing session
|
|
17
|
+
*
|
|
18
|
+
* The distinction between session start vs user prompt is determined by
|
|
19
|
+
* the EdgeWorker based on whether an active session exists for the MR.
|
|
20
|
+
*/
|
|
21
|
+
export declare class GitLabMessageTranslator implements IMessageTranslator<GitLabWebhookEvent> {
|
|
22
|
+
/**
|
|
23
|
+
* Check if this translator can handle the given event.
|
|
24
|
+
*/
|
|
25
|
+
canTranslate(event: unknown): event is GitLabWebhookEvent;
|
|
26
|
+
/**
|
|
27
|
+
* Translate a GitLab webhook event into an internal message.
|
|
28
|
+
*
|
|
29
|
+
* By default, creates a SessionStartMessage. The EdgeWorker will
|
|
30
|
+
* determine if this should actually be a UserPromptMessage based
|
|
31
|
+
* on whether an active session exists.
|
|
32
|
+
*/
|
|
33
|
+
translate(event: GitLabWebhookEvent, context?: TranslationContext): TranslationResult;
|
|
34
|
+
/**
|
|
35
|
+
* Translate note event to SessionStartMessage.
|
|
36
|
+
*/
|
|
37
|
+
private translateNote;
|
|
38
|
+
/**
|
|
39
|
+
* Translate merge_request event to SessionStartMessage.
|
|
40
|
+
*/
|
|
41
|
+
private translateMergeRequest;
|
|
42
|
+
/**
|
|
43
|
+
* Create a UserPromptMessage from a GitLab event.
|
|
44
|
+
* This is called by EdgeWorker when it determines the message
|
|
45
|
+
* is a follow-up to an existing session.
|
|
46
|
+
*/
|
|
47
|
+
translateAsUserPrompt(event: GitLabWebhookEvent, context?: TranslationContext): TranslationResult;
|
|
48
|
+
/**
|
|
49
|
+
* Translate note as UserPromptMessage.
|
|
50
|
+
*/
|
|
51
|
+
private translateNoteAsUserPrompt;
|
|
52
|
+
/**
|
|
53
|
+
* Build project reference from webhook data.
|
|
54
|
+
*/
|
|
55
|
+
private buildProjectRef;
|
|
56
|
+
/**
|
|
57
|
+
* Build merge request reference from the embedded MR object in note payloads.
|
|
58
|
+
*/
|
|
59
|
+
private buildMergeRequestRef;
|
|
60
|
+
/**
|
|
61
|
+
* Build merge request reference from merge_request event attributes.
|
|
62
|
+
*/
|
|
63
|
+
private buildMergeRequestRefFromAttributes;
|
|
64
|
+
/**
|
|
65
|
+
* Build note reference from webhook data.
|
|
66
|
+
*/
|
|
67
|
+
private buildNoteRef;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=GitLabMessageTranslator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitLabMessageTranslator.d.ts","sourceRoot":"","sources":["../src/GitLabMessageTranslator.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAIX,kBAAkB,EAElB,kBAAkB,EAClB,iBAAiB,EAEjB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAGX,kBAAkB,EAClB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;GASG;AACH,qBAAa,uBACZ,YAAW,kBAAkB,CAAC,kBAAkB,CAAC;IAEjD;;OAEG;IACH,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,kBAAkB;IAezD;;;;;;OAMG;IACH,SAAS,CACR,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE,kBAAkB,GAC1B,iBAAiB;IAepB;;OAEG;IACH,OAAO,CAAC,aAAa;IAkDrB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAwD7B;;;;OAIG;IACH,qBAAqB,CACpB,KAAK,EAAE,kBAAkB,EACzB,OAAO,CAAC,EAAE,kBAAkB,GAC1B,iBAAiB;IAWpB;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAkDjC;;OAEG;IACH,OAAO,CAAC,eAAe;IAYvB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IAoB5B;;OAEG;IACH,OAAO,CAAC,kCAAkC;IAoB1C;;OAEG;IACH,OAAO,CAAC,YAAY;CAwBpB"}
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GitLab Message Translator
|
|
3
|
+
*
|
|
4
|
+
* Translates GitLab webhook events into unified internal messages for the
|
|
5
|
+
* internal message bus.
|
|
6
|
+
*
|
|
7
|
+
* @module gitlab-event-transport/GitLabMessageTranslator
|
|
8
|
+
*/
|
|
9
|
+
import { randomUUID } from "node:crypto";
|
|
10
|
+
/**
|
|
11
|
+
* Translates GitLab webhook events into internal messages.
|
|
12
|
+
*
|
|
13
|
+
* Note: GitLab webhooks can result in either:
|
|
14
|
+
* - SessionStartMessage: First mention/comment that starts a session
|
|
15
|
+
* - UserPromptMessage: Follow-up comments in an existing session
|
|
16
|
+
*
|
|
17
|
+
* The distinction between session start vs user prompt is determined by
|
|
18
|
+
* the EdgeWorker based on whether an active session exists for the MR.
|
|
19
|
+
*/
|
|
20
|
+
export class GitLabMessageTranslator {
|
|
21
|
+
/**
|
|
22
|
+
* Check if this translator can handle the given event.
|
|
23
|
+
*/
|
|
24
|
+
canTranslate(event) {
|
|
25
|
+
if (!event || typeof event !== "object") {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
const e = event;
|
|
29
|
+
return (typeof e.eventType === "string" &&
|
|
30
|
+
(e.eventType === "note" || e.eventType === "merge_request") &&
|
|
31
|
+
e.payload !== null &&
|
|
32
|
+
typeof e.payload === "object");
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Translate a GitLab webhook event into an internal message.
|
|
36
|
+
*
|
|
37
|
+
* By default, creates a SessionStartMessage. The EdgeWorker will
|
|
38
|
+
* determine if this should actually be a UserPromptMessage based
|
|
39
|
+
* on whether an active session exists.
|
|
40
|
+
*/
|
|
41
|
+
translate(event, context) {
|
|
42
|
+
if (event.eventType === "note") {
|
|
43
|
+
return this.translateNote(event, context);
|
|
44
|
+
}
|
|
45
|
+
if (event.eventType === "merge_request") {
|
|
46
|
+
return this.translateMergeRequest(event, context);
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
success: false,
|
|
50
|
+
reason: `Unsupported GitLab event type: ${event.eventType}`,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Translate note event to SessionStartMessage.
|
|
55
|
+
*/
|
|
56
|
+
translateNote(event, context) {
|
|
57
|
+
const payload = event.payload;
|
|
58
|
+
const { project, user, object_attributes, merge_request } = payload;
|
|
59
|
+
if (!merge_request) {
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
reason: "Note is not on a merge request",
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const organizationId = context?.organizationId || String(project.id);
|
|
66
|
+
const sessionKey = `${project.path_with_namespace}!${merge_request.iid}`;
|
|
67
|
+
const workItemIdentifier = `${project.path_with_namespace}!${merge_request.iid}`;
|
|
68
|
+
const platformData = {
|
|
69
|
+
eventType: event.eventType,
|
|
70
|
+
project: this.buildProjectRef(project),
|
|
71
|
+
mergeRequest: this.buildMergeRequestRef(merge_request, project),
|
|
72
|
+
note: this.buildNoteRef(object_attributes, user),
|
|
73
|
+
accessToken: event.accessToken,
|
|
74
|
+
};
|
|
75
|
+
const message = {
|
|
76
|
+
id: randomUUID(),
|
|
77
|
+
source: "gitlab",
|
|
78
|
+
action: "session_start",
|
|
79
|
+
receivedAt: object_attributes.created_at,
|
|
80
|
+
organizationId,
|
|
81
|
+
sessionKey,
|
|
82
|
+
workItemId: String(merge_request.id),
|
|
83
|
+
workItemIdentifier,
|
|
84
|
+
author: {
|
|
85
|
+
id: String(user.id),
|
|
86
|
+
name: user.username,
|
|
87
|
+
avatarUrl: user.avatar_url,
|
|
88
|
+
},
|
|
89
|
+
initialPrompt: object_attributes.note,
|
|
90
|
+
title: merge_request.title,
|
|
91
|
+
description: merge_request.description ?? undefined,
|
|
92
|
+
platformData,
|
|
93
|
+
};
|
|
94
|
+
return { success: true, message };
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Translate merge_request event to SessionStartMessage.
|
|
98
|
+
*/
|
|
99
|
+
translateMergeRequest(event, context) {
|
|
100
|
+
const payload = event.payload;
|
|
101
|
+
const { project, user, object_attributes } = payload;
|
|
102
|
+
const organizationId = context?.organizationId || String(project.id);
|
|
103
|
+
const sessionKey = `${project.path_with_namespace}!${object_attributes.iid}`;
|
|
104
|
+
const workItemIdentifier = `${project.path_with_namespace}!${object_attributes.iid}`;
|
|
105
|
+
const platformData = {
|
|
106
|
+
eventType: event.eventType,
|
|
107
|
+
project: this.buildProjectRef(project),
|
|
108
|
+
mergeRequest: this.buildMergeRequestRefFromAttributes(object_attributes, project),
|
|
109
|
+
note: {
|
|
110
|
+
id: 0,
|
|
111
|
+
body: `MR action: ${object_attributes.action}`,
|
|
112
|
+
noteableType: "MergeRequest",
|
|
113
|
+
author: {
|
|
114
|
+
username: user.username,
|
|
115
|
+
id: user.id,
|
|
116
|
+
avatarUrl: user.avatar_url,
|
|
117
|
+
},
|
|
118
|
+
createdAt: object_attributes.updated_at,
|
|
119
|
+
},
|
|
120
|
+
accessToken: event.accessToken,
|
|
121
|
+
};
|
|
122
|
+
const message = {
|
|
123
|
+
id: randomUUID(),
|
|
124
|
+
source: "gitlab",
|
|
125
|
+
action: "session_start",
|
|
126
|
+
receivedAt: object_attributes.updated_at,
|
|
127
|
+
organizationId,
|
|
128
|
+
sessionKey,
|
|
129
|
+
workItemId: String(object_attributes.id),
|
|
130
|
+
workItemIdentifier,
|
|
131
|
+
author: {
|
|
132
|
+
id: String(user.id),
|
|
133
|
+
name: user.username,
|
|
134
|
+
avatarUrl: user.avatar_url,
|
|
135
|
+
},
|
|
136
|
+
initialPrompt: `MR ${object_attributes.action}: ${object_attributes.title}`,
|
|
137
|
+
title: object_attributes.title,
|
|
138
|
+
description: object_attributes.description ?? undefined,
|
|
139
|
+
platformData,
|
|
140
|
+
};
|
|
141
|
+
return { success: true, message };
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Create a UserPromptMessage from a GitLab event.
|
|
145
|
+
* This is called by EdgeWorker when it determines the message
|
|
146
|
+
* is a follow-up to an existing session.
|
|
147
|
+
*/
|
|
148
|
+
translateAsUserPrompt(event, context) {
|
|
149
|
+
if (event.eventType === "note") {
|
|
150
|
+
return this.translateNoteAsUserPrompt(event, context);
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
success: false,
|
|
154
|
+
reason: `Unsupported GitLab event type for user prompt: ${event.eventType}`,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Translate note as UserPromptMessage.
|
|
159
|
+
*/
|
|
160
|
+
translateNoteAsUserPrompt(event, context) {
|
|
161
|
+
const payload = event.payload;
|
|
162
|
+
const { project, user, object_attributes, merge_request } = payload;
|
|
163
|
+
if (!merge_request) {
|
|
164
|
+
return {
|
|
165
|
+
success: false,
|
|
166
|
+
reason: "Note is not on a merge request",
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
const organizationId = context?.organizationId || String(project.id);
|
|
170
|
+
const sessionKey = `${project.path_with_namespace}!${merge_request.iid}`;
|
|
171
|
+
const platformData = {
|
|
172
|
+
eventType: event.eventType,
|
|
173
|
+
project: this.buildProjectRef(project),
|
|
174
|
+
note: this.buildNoteRef(object_attributes, user),
|
|
175
|
+
accessToken: event.accessToken,
|
|
176
|
+
};
|
|
177
|
+
const message = {
|
|
178
|
+
id: randomUUID(),
|
|
179
|
+
source: "gitlab",
|
|
180
|
+
action: "user_prompt",
|
|
181
|
+
receivedAt: object_attributes.created_at,
|
|
182
|
+
organizationId,
|
|
183
|
+
sessionKey,
|
|
184
|
+
workItemId: String(merge_request.id),
|
|
185
|
+
workItemIdentifier: `${project.path_with_namespace}!${merge_request.iid}`,
|
|
186
|
+
author: {
|
|
187
|
+
id: String(user.id),
|
|
188
|
+
name: user.username,
|
|
189
|
+
avatarUrl: user.avatar_url,
|
|
190
|
+
},
|
|
191
|
+
content: object_attributes.note,
|
|
192
|
+
platformData,
|
|
193
|
+
};
|
|
194
|
+
return { success: true, message };
|
|
195
|
+
}
|
|
196
|
+
// ============================================================================
|
|
197
|
+
// HELPER METHODS
|
|
198
|
+
// ============================================================================
|
|
199
|
+
/**
|
|
200
|
+
* Build project reference from webhook data.
|
|
201
|
+
*/
|
|
202
|
+
buildProjectRef(project) {
|
|
203
|
+
return {
|
|
204
|
+
id: project.id,
|
|
205
|
+
name: project.name,
|
|
206
|
+
pathWithNamespace: project.path_with_namespace,
|
|
207
|
+
webUrl: project.web_url,
|
|
208
|
+
defaultBranch: project.default_branch,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Build merge request reference from the embedded MR object in note payloads.
|
|
213
|
+
*/
|
|
214
|
+
buildMergeRequestRef(mr, project) {
|
|
215
|
+
return {
|
|
216
|
+
id: mr.id,
|
|
217
|
+
iid: mr.iid,
|
|
218
|
+
title: mr.title,
|
|
219
|
+
description: mr.description,
|
|
220
|
+
state: mr.state,
|
|
221
|
+
webUrl: mr.url || `${project.web_url}/-/merge_requests/${mr.iid}`,
|
|
222
|
+
sourceBranch: mr.source_branch,
|
|
223
|
+
targetBranch: mr.target_branch,
|
|
224
|
+
author: {
|
|
225
|
+
username: "", // Not available in embedded MR object
|
|
226
|
+
id: mr.author_id,
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Build merge request reference from merge_request event attributes.
|
|
232
|
+
*/
|
|
233
|
+
buildMergeRequestRefFromAttributes(attrs, project) {
|
|
234
|
+
return {
|
|
235
|
+
id: attrs.id,
|
|
236
|
+
iid: attrs.iid,
|
|
237
|
+
title: attrs.title,
|
|
238
|
+
description: attrs.description,
|
|
239
|
+
state: attrs.state,
|
|
240
|
+
webUrl: attrs.url || `${project.web_url}/-/merge_requests/${attrs.iid}`,
|
|
241
|
+
sourceBranch: attrs.source_branch,
|
|
242
|
+
targetBranch: attrs.target_branch,
|
|
243
|
+
author: {
|
|
244
|
+
username: "", // Not directly in attributes; would need user lookup
|
|
245
|
+
id: attrs.author_id,
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Build note reference from webhook data.
|
|
251
|
+
*/
|
|
252
|
+
buildNoteRef(attrs, user) {
|
|
253
|
+
return {
|
|
254
|
+
id: attrs.id,
|
|
255
|
+
body: attrs.note,
|
|
256
|
+
noteableType: attrs.noteable_type,
|
|
257
|
+
author: {
|
|
258
|
+
username: user.username,
|
|
259
|
+
id: user.id,
|
|
260
|
+
avatarUrl: user.avatar_url,
|
|
261
|
+
},
|
|
262
|
+
createdAt: attrs.created_at,
|
|
263
|
+
position: attrs.position
|
|
264
|
+
? {
|
|
265
|
+
newPath: attrs.position.new_path,
|
|
266
|
+
oldPath: attrs.position.old_path,
|
|
267
|
+
newLine: attrs.position.new_line ?? undefined,
|
|
268
|
+
}
|
|
269
|
+
: undefined,
|
|
270
|
+
discussionId: attrs.discussion_id,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
//# sourceMappingURL=GitLabMessageTranslator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GitLabMessageTranslator.js","sourceRoot":"","sources":["../src/GitLabMessageTranslator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for processing GitLab webhook payloads
|
|
3
|
+
*/
|
|
4
|
+
import type { GitLabMergeRequestPayload, GitLabNotePayload, GitLabWebhookEvent } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* Type guard for note payloads
|
|
7
|
+
*/
|
|
8
|
+
export declare function isNotePayload(payload: GitLabWebhookEvent["payload"]): payload is GitLabNotePayload;
|
|
9
|
+
/**
|
|
10
|
+
* Type guard for merge_request payloads
|
|
11
|
+
*/
|
|
12
|
+
export declare function isMergeRequestPayload(payload: GitLabWebhookEvent["payload"]): payload is GitLabMergeRequestPayload;
|
|
13
|
+
/**
|
|
14
|
+
* Check if a note webhook is for a merge request (not an issue or snippet)
|
|
15
|
+
*/
|
|
16
|
+
export declare function isNoteOnMergeRequest(event: GitLabWebhookEvent): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Extract the MR source branch from a GitLab webhook event
|
|
19
|
+
*/
|
|
20
|
+
export declare function extractMRBranchRef(event: GitLabWebhookEvent): string | null;
|
|
21
|
+
/**
|
|
22
|
+
* Extract the MR target (base) branch from a GitLab webhook event
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractMRBaseBranchRef(event: GitLabWebhookEvent): string | null;
|
|
25
|
+
/**
|
|
26
|
+
* Extract the MR iid (project-scoped ID) from a GitLab webhook event
|
|
27
|
+
*/
|
|
28
|
+
export declare function extractMRIid(event: GitLabWebhookEvent): number | null;
|
|
29
|
+
/**
|
|
30
|
+
* Extract the note body from a GitLab note webhook event
|
|
31
|
+
*/
|
|
32
|
+
export declare function extractNoteBody(event: GitLabWebhookEvent): string;
|
|
33
|
+
/**
|
|
34
|
+
* Extract the note/event author username from a GitLab webhook event
|
|
35
|
+
*/
|
|
36
|
+
export declare function extractNoteAuthor(event: GitLabWebhookEvent): string;
|
|
37
|
+
/**
|
|
38
|
+
* Extract the note ID from a GitLab webhook event
|
|
39
|
+
*/
|
|
40
|
+
export declare function extractNoteId(event: GitLabWebhookEvent): number | null;
|
|
41
|
+
/**
|
|
42
|
+
* Extract the discussion ID from a GitLab note webhook event
|
|
43
|
+
*/
|
|
44
|
+
export declare function extractDiscussionId(event: GitLabWebhookEvent): string | null;
|
|
45
|
+
/**
|
|
46
|
+
* Extract project path_with_namespace (e.g., "group/project") from a GitLab webhook event
|
|
47
|
+
*/
|
|
48
|
+
export declare function extractProjectPath(event: GitLabWebhookEvent): string;
|
|
49
|
+
/**
|
|
50
|
+
* Extract project ID from a GitLab webhook event
|
|
51
|
+
*/
|
|
52
|
+
export declare function extractProjectId(event: GitLabWebhookEvent): number;
|
|
53
|
+
/**
|
|
54
|
+
* Extract the MR title from a GitLab webhook event
|
|
55
|
+
*/
|
|
56
|
+
export declare function extractMRTitle(event: GitLabWebhookEvent): string | null;
|
|
57
|
+
/**
|
|
58
|
+
* Extract the MR web URL from a GitLab webhook event
|
|
59
|
+
*/
|
|
60
|
+
export declare function extractMRUrl(event: GitLabWebhookEvent): string | null;
|
|
61
|
+
/**
|
|
62
|
+
* Extract the note URL from a GitLab note webhook event
|
|
63
|
+
*/
|
|
64
|
+
export declare function extractNoteUrl(event: GitLabWebhookEvent): string;
|
|
65
|
+
/**
|
|
66
|
+
* Extract a unique session identifier for the GitLab webhook event.
|
|
67
|
+
* Uses gitlab:path_with_namespace!iid format.
|
|
68
|
+
*/
|
|
69
|
+
export declare function extractSessionKey(event: GitLabWebhookEvent): string;
|
|
70
|
+
/**
|
|
71
|
+
* Strip the @mention from a note body to get the actual instructions
|
|
72
|
+
*/
|
|
73
|
+
export declare function stripMention(noteBody: string, mentionHandle?: string): string;
|
|
74
|
+
//# sourceMappingURL=gitlab-webhook-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab-webhook-utils.d.ts","sourceRoot":"","sources":["../src/gitlab-webhook-utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACX,yBAAyB,EACzB,iBAAiB,EACjB,kBAAkB,EAClB,MAAM,YAAY,CAAC;AAEpB;;GAEG;AACH,wBAAgB,aAAa,CAC5B,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,GACpC,OAAO,IAAI,iBAAiB,CAE9B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,kBAAkB,CAAC,SAAS,CAAC,GACpC,OAAO,IAAI,yBAAyB,CAEtC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAQvE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAQ3E;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACrC,KAAK,EAAE,kBAAkB,GACvB,MAAM,GAAG,IAAI,CAQf;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAQrE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAKjE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAEnE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAKtE;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAK5E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAEpE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAElE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAQvE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,GAAG,IAAI,CAQrE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAKhE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAInE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAC3B,QAAQ,EAAE,MAAM,EAChB,aAAa,GAAE,MAAsB,GACnC,MAAM,CAUR"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for processing GitLab webhook payloads
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Type guard for note payloads
|
|
6
|
+
*/
|
|
7
|
+
export function isNotePayload(payload) {
|
|
8
|
+
return payload.object_kind === "note";
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Type guard for merge_request payloads
|
|
12
|
+
*/
|
|
13
|
+
export function isMergeRequestPayload(payload) {
|
|
14
|
+
return payload.object_kind === "merge_request";
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check if a note webhook is for a merge request (not an issue or snippet)
|
|
18
|
+
*/
|
|
19
|
+
export function isNoteOnMergeRequest(event) {
|
|
20
|
+
if (isNotePayload(event.payload)) {
|
|
21
|
+
return (event.payload.object_attributes.noteable_type === "MergeRequest" &&
|
|
22
|
+
event.payload.merge_request != null);
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Extract the MR source branch from a GitLab webhook event
|
|
28
|
+
*/
|
|
29
|
+
export function extractMRBranchRef(event) {
|
|
30
|
+
if (isNotePayload(event.payload) && event.payload.merge_request) {
|
|
31
|
+
return event.payload.merge_request.source_branch;
|
|
32
|
+
}
|
|
33
|
+
if (isMergeRequestPayload(event.payload)) {
|
|
34
|
+
return event.payload.object_attributes.source_branch;
|
|
35
|
+
}
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Extract the MR target (base) branch from a GitLab webhook event
|
|
40
|
+
*/
|
|
41
|
+
export function extractMRBaseBranchRef(event) {
|
|
42
|
+
if (isNotePayload(event.payload) && event.payload.merge_request) {
|
|
43
|
+
return event.payload.merge_request.target_branch;
|
|
44
|
+
}
|
|
45
|
+
if (isMergeRequestPayload(event.payload)) {
|
|
46
|
+
return event.payload.object_attributes.target_branch;
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Extract the MR iid (project-scoped ID) from a GitLab webhook event
|
|
52
|
+
*/
|
|
53
|
+
export function extractMRIid(event) {
|
|
54
|
+
if (isNotePayload(event.payload) && event.payload.merge_request) {
|
|
55
|
+
return event.payload.merge_request.iid;
|
|
56
|
+
}
|
|
57
|
+
if (isMergeRequestPayload(event.payload)) {
|
|
58
|
+
return event.payload.object_attributes.iid;
|
|
59
|
+
}
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Extract the note body from a GitLab note webhook event
|
|
64
|
+
*/
|
|
65
|
+
export function extractNoteBody(event) {
|
|
66
|
+
if (isNotePayload(event.payload)) {
|
|
67
|
+
return event.payload.object_attributes.note;
|
|
68
|
+
}
|
|
69
|
+
return "";
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Extract the note/event author username from a GitLab webhook event
|
|
73
|
+
*/
|
|
74
|
+
export function extractNoteAuthor(event) {
|
|
75
|
+
return event.payload.user.username;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Extract the note ID from a GitLab webhook event
|
|
79
|
+
*/
|
|
80
|
+
export function extractNoteId(event) {
|
|
81
|
+
if (isNotePayload(event.payload)) {
|
|
82
|
+
return event.payload.object_attributes.id;
|
|
83
|
+
}
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Extract the discussion ID from a GitLab note webhook event
|
|
88
|
+
*/
|
|
89
|
+
export function extractDiscussionId(event) {
|
|
90
|
+
if (isNotePayload(event.payload)) {
|
|
91
|
+
return event.payload.object_attributes.discussion_id ?? null;
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Extract project path_with_namespace (e.g., "group/project") from a GitLab webhook event
|
|
97
|
+
*/
|
|
98
|
+
export function extractProjectPath(event) {
|
|
99
|
+
return event.payload.project.path_with_namespace;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Extract project ID from a GitLab webhook event
|
|
103
|
+
*/
|
|
104
|
+
export function extractProjectId(event) {
|
|
105
|
+
return event.payload.project.id;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Extract the MR title from a GitLab webhook event
|
|
109
|
+
*/
|
|
110
|
+
export function extractMRTitle(event) {
|
|
111
|
+
if (isNotePayload(event.payload) && event.payload.merge_request) {
|
|
112
|
+
return event.payload.merge_request.title;
|
|
113
|
+
}
|
|
114
|
+
if (isMergeRequestPayload(event.payload)) {
|
|
115
|
+
return event.payload.object_attributes.title;
|
|
116
|
+
}
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Extract the MR web URL from a GitLab webhook event
|
|
121
|
+
*/
|
|
122
|
+
export function extractMRUrl(event) {
|
|
123
|
+
if (isNotePayload(event.payload) && event.payload.merge_request) {
|
|
124
|
+
return event.payload.merge_request.url;
|
|
125
|
+
}
|
|
126
|
+
if (isMergeRequestPayload(event.payload)) {
|
|
127
|
+
return event.payload.object_attributes.url;
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Extract the note URL from a GitLab note webhook event
|
|
133
|
+
*/
|
|
134
|
+
export function extractNoteUrl(event) {
|
|
135
|
+
if (isNotePayload(event.payload)) {
|
|
136
|
+
return event.payload.object_attributes.url;
|
|
137
|
+
}
|
|
138
|
+
return "";
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Extract a unique session identifier for the GitLab webhook event.
|
|
142
|
+
* Uses gitlab:path_with_namespace!iid format.
|
|
143
|
+
*/
|
|
144
|
+
export function extractSessionKey(event) {
|
|
145
|
+
const projectPath = extractProjectPath(event);
|
|
146
|
+
const mrIid = extractMRIid(event);
|
|
147
|
+
return `gitlab:${projectPath}!${mrIid}`;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Strip the @mention from a note body to get the actual instructions
|
|
151
|
+
*/
|
|
152
|
+
export function stripMention(noteBody, mentionHandle = "@cyrusagent") {
|
|
153
|
+
return noteBody
|
|
154
|
+
.replace(new RegExp(`\\s*${mentionHandle.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*`, "gi"), " ")
|
|
155
|
+
.trim();
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=gitlab-webhook-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gitlab-webhook-utils.js","sourceRoot":"","sources":["../src/gitlab-webhook-utils.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type { AddAwardEmojiParams, GitLabCommentServiceConfig, GitLabNoteResponse, PostDiscussionReplyParams, PostMRNoteParams, } from "./GitLabCommentService.js";
|
|
2
|
+
export { GitLabCommentService } from "./GitLabCommentService.js";
|
|
3
|
+
export { GitLabEventTransport } from "./GitLabEventTransport.js";
|
|
4
|
+
export { GitLabMessageTranslator } from "./GitLabMessageTranslator.js";
|
|
5
|
+
export { extractDiscussionId, extractMRBaseBranchRef, extractMRBranchRef, extractMRIid, extractMRTitle, extractMRUrl, extractNoteAuthor, extractNoteBody, extractNoteId, extractNoteUrl, extractProjectId, extractProjectPath, extractSessionKey, isMergeRequestPayload, isNoteOnMergeRequest, isNotePayload, stripMention, } from "./gitlab-webhook-utils.js";
|
|
6
|
+
export type { GitLabEventTransportConfig, GitLabEventTransportEvents, GitLabEventType, GitLabMergeRequest, GitLabMergeRequestAttributes, GitLabMergeRequestPayload, GitLabNoteAttributes, GitLabNotePayload, GitLabProject, GitLabUser, GitLabVerificationMode, GitLabWebhookEvent, } from "./types.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACX,mBAAmB,EACnB,0BAA0B,EAC1B,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,GAChB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EACN,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,YAAY,GACZ,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACX,0BAA0B,EAC1B,0BAA0B,EAC1B,eAAe,EACf,kBAAkB,EAClB,4BAA4B,EAC5B,yBAAyB,EACzB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,UAAU,EACV,sBAAsB,EACtB,kBAAkB,GAClB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { GitLabCommentService } from "./GitLabCommentService.js";
|
|
2
|
+
export { GitLabEventTransport } from "./GitLabEventTransport.js";
|
|
3
|
+
export { GitLabMessageTranslator } from "./GitLabMessageTranslator.js";
|
|
4
|
+
export { extractDiscussionId, extractMRBaseBranchRef, extractMRBranchRef, extractMRIid, extractMRTitle, extractMRUrl, extractNoteAuthor, extractNoteBody, extractNoteId, extractNoteUrl, extractProjectId, extractProjectPath, extractSessionKey, isMergeRequestPayload, isNoteOnMergeRequest, isNotePayload, stripMention, } from "./gitlab-webhook-utils.js";
|
|
5
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EACN,mBAAmB,EACnB,sBAAsB,EACtB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,YAAY,GACZ,MAAM,2BAA2B,CAAC"}
|