1 | type Jira = { |
2 | username: string; |
3 | password: string; |
4 | domain: string; |
5 | }; |
6 | |
7 | * Create issue link |
8 | * Creates a link between two issues. |
9 | */ |
10 | export async function main( |
11 | auth: Jira, |
12 | body: { |
13 | comment?: { |
14 | author?: { |
15 | accountId?: string; |
16 | accountType?: string; |
17 | active?: boolean; |
18 | avatarUrls?: { |
19 | "16x16"?: string; |
20 | "24x24"?: string; |
21 | "32x32"?: string; |
22 | "48x48"?: string; |
23 | }; |
24 | displayName?: string; |
25 | emailAddress?: string; |
26 | key?: string; |
27 | name?: string; |
28 | self?: string; |
29 | timeZone?: string; |
30 | }; |
31 | body?: string; |
32 | created?: string; |
33 | id?: string; |
34 | jsdAuthorCanSeeRequest?: boolean; |
35 | jsdPublic?: boolean; |
36 | properties?: { key?: string; value?: { [k: string]: unknown } }[]; |
37 | renderedBody?: string; |
38 | self?: string; |
39 | updateAuthor?: { |
40 | accountId?: string; |
41 | accountType?: string; |
42 | active?: boolean; |
43 | avatarUrls?: { |
44 | "16x16"?: string; |
45 | "24x24"?: string; |
46 | "32x32"?: string; |
47 | "48x48"?: string; |
48 | }; |
49 | displayName?: string; |
50 | emailAddress?: string; |
51 | key?: string; |
52 | name?: string; |
53 | self?: string; |
54 | timeZone?: string; |
55 | }; |
56 | updated?: string; |
57 | visibility?: { |
58 | identifier?: string; |
59 | type?: "group" | "role"; |
60 | value?: string; |
61 | [k: string]: unknown; |
62 | }; |
63 | [k: string]: unknown; |
64 | }; |
65 | inwardIssue: { |
66 | fields?: { |
67 | assignee?: { |
68 | accountId?: string; |
69 | accountType?: string; |
70 | active?: boolean; |
71 | avatarUrls?: { |
72 | "16x16"?: string; |
73 | "24x24"?: string; |
74 | "32x32"?: string; |
75 | "48x48"?: string; |
76 | }; |
77 | displayName?: string; |
78 | emailAddress?: string; |
79 | key?: string; |
80 | name?: string; |
81 | self?: string; |
82 | timeZone?: string; |
83 | }; |
84 | issueType?: { |
85 | avatarId?: number; |
86 | description?: string; |
87 | entityId?: string; |
88 | hierarchyLevel?: number; |
89 | iconUrl?: string; |
90 | id?: string; |
91 | name?: string; |
92 | scope?: { |
93 | project?: { |
94 | avatarUrls?: { |
95 | "16x16"?: string; |
96 | "24x24"?: string; |
97 | "32x32"?: string; |
98 | "48x48"?: string; |
99 | }; |
100 | id?: string; |
101 | key?: string; |
102 | name?: string; |
103 | projectCategory?: { |
104 | description?: string; |
105 | id?: string; |
106 | name?: string; |
107 | self?: string; |
108 | }; |
109 | projectTypeKey?: "software" | "service_desk" | "business"; |
110 | self?: string; |
111 | simplified?: boolean; |
112 | }; |
113 | type?: "PROJECT" | "TEMPLATE"; |
114 | [k: string]: unknown; |
115 | }; |
116 | self?: string; |
117 | subtask?: boolean; |
118 | }; |
119 | issuetype?: { |
120 | avatarId?: number; |
121 | description?: string; |
122 | entityId?: string; |
123 | hierarchyLevel?: number; |
124 | iconUrl?: string; |
125 | id?: string; |
126 | name?: string; |
127 | scope?: { |
128 | project?: { |
129 | avatarUrls?: { |
130 | "16x16"?: string; |
131 | "24x24"?: string; |
132 | "32x32"?: string; |
133 | "48x48"?: string; |
134 | }; |
135 | id?: string; |
136 | key?: string; |
137 | name?: string; |
138 | projectCategory?: { |
139 | description?: string; |
140 | id?: string; |
141 | name?: string; |
142 | self?: string; |
143 | }; |
144 | projectTypeKey?: "software" | "service_desk" | "business"; |
145 | self?: string; |
146 | simplified?: boolean; |
147 | }; |
148 | type?: "PROJECT" | "TEMPLATE"; |
149 | [k: string]: unknown; |
150 | }; |
151 | self?: string; |
152 | subtask?: boolean; |
153 | }; |
154 | priority?: { |
155 | description?: string; |
156 | iconUrl?: string; |
157 | id?: string; |
158 | isDefault?: boolean; |
159 | name?: string; |
160 | self?: string; |
161 | statusColor?: string; |
162 | [k: string]: unknown; |
163 | }; |
164 | status?: { |
165 | description?: string; |
166 | iconUrl?: string; |
167 | id?: string; |
168 | name?: string; |
169 | self?: string; |
170 | statusCategory?: { |
171 | colorName?: string; |
172 | id?: number; |
173 | key?: string; |
174 | name?: string; |
175 | self?: string; |
176 | [k: string]: unknown; |
177 | }; |
178 | [k: string]: unknown; |
179 | }; |
180 | summary?: string; |
181 | timetracking?: { |
182 | originalEstimate?: string; |
183 | originalEstimateSeconds?: number; |
184 | remainingEstimate?: string; |
185 | remainingEstimateSeconds?: number; |
186 | timeSpent?: string; |
187 | timeSpentSeconds?: number; |
188 | }; |
189 | }; |
190 | id?: string; |
191 | key?: string; |
192 | self?: string; |
193 | }; |
194 | outwardIssue: { |
195 | fields?: { |
196 | assignee?: { |
197 | accountId?: string; |
198 | accountType?: string; |
199 | active?: boolean; |
200 | avatarUrls?: { |
201 | "16x16"?: string; |
202 | "24x24"?: string; |
203 | "32x32"?: string; |
204 | "48x48"?: string; |
205 | }; |
206 | displayName?: string; |
207 | emailAddress?: string; |
208 | key?: string; |
209 | name?: string; |
210 | self?: string; |
211 | timeZone?: string; |
212 | }; |
213 | issueType?: { |
214 | avatarId?: number; |
215 | description?: string; |
216 | entityId?: string; |
217 | hierarchyLevel?: number; |
218 | iconUrl?: string; |
219 | id?: string; |
220 | name?: string; |
221 | scope?: { |
222 | project?: { |
223 | avatarUrls?: { |
224 | "16x16"?: string; |
225 | "24x24"?: string; |
226 | "32x32"?: string; |
227 | "48x48"?: string; |
228 | }; |
229 | id?: string; |
230 | key?: string; |
231 | name?: string; |
232 | projectCategory?: { |
233 | description?: string; |
234 | id?: string; |
235 | name?: string; |
236 | self?: string; |
237 | }; |
238 | projectTypeKey?: "software" | "service_desk" | "business"; |
239 | self?: string; |
240 | simplified?: boolean; |
241 | }; |
242 | type?: "PROJECT" | "TEMPLATE"; |
243 | [k: string]: unknown; |
244 | }; |
245 | self?: string; |
246 | subtask?: boolean; |
247 | }; |
248 | issuetype?: { |
249 | avatarId?: number; |
250 | description?: string; |
251 | entityId?: string; |
252 | hierarchyLevel?: number; |
253 | iconUrl?: string; |
254 | id?: string; |
255 | name?: string; |
256 | scope?: { |
257 | project?: { |
258 | avatarUrls?: { |
259 | "16x16"?: string; |
260 | "24x24"?: string; |
261 | "32x32"?: string; |
262 | "48x48"?: string; |
263 | }; |
264 | id?: string; |
265 | key?: string; |
266 | name?: string; |
267 | projectCategory?: { |
268 | description?: string; |
269 | id?: string; |
270 | name?: string; |
271 | self?: string; |
272 | }; |
273 | projectTypeKey?: "software" | "service_desk" | "business"; |
274 | self?: string; |
275 | simplified?: boolean; |
276 | }; |
277 | type?: "PROJECT" | "TEMPLATE"; |
278 | [k: string]: unknown; |
279 | }; |
280 | self?: string; |
281 | subtask?: boolean; |
282 | }; |
283 | priority?: { |
284 | description?: string; |
285 | iconUrl?: string; |
286 | id?: string; |
287 | isDefault?: boolean; |
288 | name?: string; |
289 | self?: string; |
290 | statusColor?: string; |
291 | [k: string]: unknown; |
292 | }; |
293 | status?: { |
294 | description?: string; |
295 | iconUrl?: string; |
296 | id?: string; |
297 | name?: string; |
298 | self?: string; |
299 | statusCategory?: { |
300 | colorName?: string; |
301 | id?: number; |
302 | key?: string; |
303 | name?: string; |
304 | self?: string; |
305 | [k: string]: unknown; |
306 | }; |
307 | [k: string]: unknown; |
308 | }; |
309 | summary?: string; |
310 | timetracking?: { |
311 | originalEstimate?: string; |
312 | originalEstimateSeconds?: number; |
313 | remainingEstimate?: string; |
314 | remainingEstimateSeconds?: number; |
315 | timeSpent?: string; |
316 | timeSpentSeconds?: number; |
317 | }; |
318 | }; |
319 | id?: string; |
320 | key?: string; |
321 | self?: string; |
322 | }; |
323 | type: { |
324 | id?: string; |
325 | inward?: string; |
326 | name?: string; |
327 | outward?: string; |
328 | self?: string; |
329 | }; |
330 | } |
331 | ) { |
332 | const url = new URL( |
333 | `https://${auth.domain}.atlassian.net/rest/api/2/issueLink` |
334 | ); |
335 |
|
336 | const response = await fetch(url, { |
337 | method: "POST", |
338 | headers: { |
339 | "Content-Type": "application/json", |
340 | Authorization: "Basic " + btoa(`${auth.username}:${auth.password}`), |
341 | }, |
342 | body: JSON.stringify(body), |
343 | }); |
344 | if (!response.ok) { |
345 | const text = await response.text(); |
346 | throw new Error(`${response.status} ${text}`); |
347 | } |
348 | return await response.json(); |
349 | } |
350 |
|