/
index.js
90 lines (83 loc) · 2.52 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
'use strict';
const JiraApi = require('jira-client');
const bitbar = require('bitbar');
const _ = require('lodash');
const log = require('./log');
const { username, password, protocol, host, queries } = require('./credentials');
const nodePath = process.argv[0];
const baseUrl = `${protocol}://${host}`;
const jira = new JiraApi({
protocol,
host,
username,
password,
apiVersion: '2',
strictSSL: true
});
const generateMenu = async () => {
let menuTitle = { text: '' };
const menuItemsP = _.map(queries, async ({ name, compact, query, color, menuIcon }) => {
let options = { fields: ['summary'], maxResults: 20 };
const { total, issues } = await jira.searchJira(query, options);
if (menuIcon && total > 0) {
menuTitle.text += `${menuIcon}${total}`
}
const issuesConfPromises = _.map(issues, async ({ key, fields, id }) => {
let submenu;
if (!compact) {
try {
const { transitions } = await jira.listTransitions(id);
submenu = _.map(transitions, (transition) => ({
text: transition.name,
refresh: true,
terminal: false,
bash: nodePath,
param1: __filename,
param2: 'transition',
param3: `${id},${transition.id},${key},${transition.name}`,
}));
} catch (e) { /**/ }
}
return {
text: `${key}: ${fields.summary}`,
href: `${baseUrl}/browse/${key}`,
submenu,
color,
};
});
const issuesConf = await Promise.all(issuesConfPromises);
if (total > issues.length) {
issuesConf.push({ text: `${total - issues.length} more...` })
}
const title = {
text: `${menuIcon || ''}${name} (${total})`,
href: `${baseUrl}/issues/?jql=${query}`,
submenu: (compact ? issuesConf : undefined),
// color,
};
return [
bitbar.sep,
title,
...(compact ? [] : issuesConf),
];
});
const menuItems = _.flatten(await Promise.all(menuItemsP));
menuTitle.text = menuTitle.text || '✅';
bitbar([
menuTitle,
bitbar.sep,
{ text: 'Refresh ♻️', refresh: true, terminal: false },
...menuItems,
]);
}
const transitionIssue = async (issueId, transitionId) => {
await jira.transitionIssue(issueId, { transition: { id: transitionId } });
}
if (process.argv[2] === 'transition') {
log('transition', process.argv.slice(2))
const [issueId, transitionId] = process.argv[3].split(',');
transitionIssue(issueId, transitionId);
} else {
log('generateMenu')
generateMenu();
}